标签: docker

在同一主机上运行 LXC 和 Docker

我现在运行私人服务器一段时间,当我设置它时,我使用 LXC 将不同的服务彼此分开。

大约一个月前,我开始使用 docker(用于工作和私人),从现在开始,我想将它用于新服务(并慢慢地将旧服务迁移到它)。

长话短说:是否可以在同一台主机上同时运行 LXC 和 Docker,只要我需要一个接一个地迁移服务?

服务器运行 Debian Jessie 64 位。

lxc docker

5
推荐指数
1
解决办法
2639
查看次数

firewalld 不阻止 docker 容器端口

我想在我的 centos 7 机器上显式打开端口,因此我在面向公众的界面上将防火墙配置为 drop 作为默认区域和外部区域。当我运行python -m SimpleHTTPServer 8000并点击端口 8000 上的盒子时,它失败了。但是如果我将端口添加到外部区域。有用。一切都如预期。

但是,当我在端口 8000 上启动 docker 容器并在外部点击该框时,我可以访问该服务。这不是我想要发生的事情。我希望只有在外部区域上打开端口 8000 时才能访问它。

即使我将 docker 容器绑定到盒子的公共地址,它仍然可以绕过防火墙。如果需要,我可以提供更多信息,例如路由表和接口配置,但我不太知道什么有用。寻找学习。

该盒子上有两个物理接口,eth0 分配有公共 IP,eth1 连接到专用网络,我希望能够访问。

编辑已解决添加--iptables=false到泊坞窗选项。

firewalld docker centos7

5
推荐指数
1
解决办法
5975
查看次数

到 Docker 容器的 SSH 隧道

目标:本地连接到远程repl(例如通过lein repl :connect)。

在本地,这很容易:

  1. 运行服务器(它在端口 8081 上启动嵌入式 nrepl 服务器)
  2. 跑吧lein repl :connect 8081,瞧!复制已连接

当 repl 在未打开的端口上运行时,我还通过使用 SSH 隧道连接到远程服务器上的 repl:

  1. 在 some.host 上,运行服务器(它在端口 8081 上启动嵌入式 nrepl 服务器)
  2. SSH隧道ssh -N -T -L 8081:localhost:8081 me@some.host
  3. 在本地,lein repl :connect 8081瞧!复制已连接

但是,我当前的设置是“服务器”在 Docker 容器中运行,该容器映射端口 8081。因此,为了连接到 nrepl 服务器,必须转到 local -> some.host -> docker-container -> nrepl 。

我可以看到我的 docker 容器映射了端口 8081:

$ sudo docker port container-id 8081
0.0.0.0:8081
Run Code Online (Sandbox Code Playgroud)

并且,在托管 docker 容器的服务器上,我可以看到端口 8081 正在侦听:

$ netstat -anl | sed -n '2p;/8081/p' …
Run Code Online (Sandbox Code Playgroud)

port-forwarding ssh-tunnel docker

5
推荐指数
1
解决办法
2万
查看次数

Docker 多 Volume-driver

Docker 1.8+ 是否可以为一个容器中的不同卷指定不同的卷驱动程序?

那么我可以使用一个卷作为本地存储的默认驱动程序,并使用一个不同的 NFS 或其他驱动程序吗?

除了使用 NFS 文件夹安装主机系统之外。

docker

5
推荐指数
2
解决办法
1563
查看次数

为 docker 启用 IPv6 会破坏主机 IPv6 连接,导致主机都没有 IPv6 连接

前言:我在 Docker 和网络方面都是新手,尤其是 IPv6。我是软件开发人员,而不是系统/网络管理员。

我正在 Linode 上运行 Arch,并希望设置支持 IPv6 的 Docker。我可以使用 IPv4,虽然我还没有解决这个问题,但我仍然使用 IPv4,但我真的很期待启用 IPv6。

由于我正在使用systemd-networkd我必须启用IPForward=kernel我已经完成的操作。

如果 Docker 没有运行,显然 IPv6 适用于我的 Arch。

如果我在没有 IPv6 的情况下运行 Docker,Arch 将具有 IPv6 连接。

现在,如果我在启用 IPv6 的情况下运行 Docker:,docker daemon --ipv6 --fixed-cidr-v6="XXXXX/64" -H fd://它会破坏我的 Arch 的 IPv6 连接,并且它在容器内也不起作用。

我发现的一个区别是,如果没有适用于 Docker 的 IPv6,我的 Arch 上有一个 IPv6 的默认路由:

[root@x ~]# ip -6 route show
2a01:7e00::/64 dev enp0s4  proto kernel  metric 256  pref medium
fe80::/64 dev enp0s4  proto kernel  metric 256  pref medium
fe80::/64 …
Run Code Online (Sandbox Code Playgroud)

ipv6 linode arch-linux docker

5
推荐指数
1
解决办法
1328
查看次数

推送到本地 docker 注册表会出现连接重置错误

我正在尝试按照本指南创建一个私有 Docker 注册表。我已经下载并标记了一个 Ubuntu 映像并创建了一个注册表容器,现在我打算将其推送到我的注册表,但是当我调用时,sudo docker push localhost:6000/Ubuntu我得到以下输出:

The push refers to a repository [localhost:6000/ubuntu] Put http://localhost:6000/v1/repositories/ubuntu/: http: can't write HTTP request on broken connection

我所能找到的只是“无法写入 HTTP 请求”错误是一个 Go 错误,但不幸的是我无法找到与如何在 Docker 中解决它有关的任何内容。我还尝试查找 Docker 命令的日志,以便我可以尝试获取有关该问题的更多详细信息,但日志似乎仅适用于容器,并且我没有在容器上运行它。

我该如何解决这个错误?

更新

我在没有进行任何更改后再次运行该命令并收到了不同的错误:

Put http://localhost:6000/v1/repositories/ubuntu/: read tcp [::1]:33417->[::1]:6000: read: connection reset by peer

更新2

再次,在没有进行任何更改后运行它,现在得到:

Put http://localhost:6000/v1/repositories/ubuntu/: EOF

更新3

经过一番折腾后,我发现我尝试推送到注册表的映像确实出现在我的 docker 映像列表中,但我似乎无法拉取它。

更新4

经过一番折腾后,我分配给私有注册表的端口似乎只监听 IPV6,而不是 IPV4。根据这个git线程,docker看起来只监听IPV6是正常的,但是在运行telnet localhost、、netstat -ntlp和之后iptables -t nat -nxvL,我仍然没有看到任何迹象表明任何东西正在监听127.0.0.1:6000,这是我的端口应该分配给registry(它只是作为容器运行)。相反,它似乎正在监听 :::1:6000。

另外,因为这是有人要求的,而且因为我无论如何都应该列出它:

user@devstack01:~$ sudo …
Run Code Online (Sandbox Code Playgroud)

docker

5
推荐指数
1
解决办法
2万
查看次数

Linux 在没有 iptables 的情况下阻止到特定 ip 的传出流量

我基本上需要运行以下命令,iptables -A OUTPUT -d 169.254.169.254 -j DROP但我无法使用iptables,因为该程序正在 docker 容器中运行,并且我无法使用--privileged参数(共享平台)。

我可以使用 iptables 的替代方案来实现相同的结果吗?

networking linux linux-networking docker

5
推荐指数
1
解决办法
7995
查看次数

同一主机上不同docker网络之间的路由

我创建了两个 docker 网络。

docker network create --subnet=172.18.0.0/16 Docker_network_1
docker network create --subnet=172.19.0.0/16 Docker_network_2
Run Code Online (Sandbox Code Playgroud)

我在每个容器上运行两个不同的容器:

docker run --rm -it --name Container_1 --net Docker_network_1  alpine /bin/sh
docker run --rm -it --name Container_2 --net Docker_network_2  alpine /bin/sh
Run Code Online (Sandbox Code Playgroud)

Container_1 有 IP172.18.0.2而 Container_2 有 IP 172.19.0.2。

从 Container_1 我可以获取所属的pingdocker 接口 IP ,但无法 ping Container_2 IP 。172.19.0.1Docker_network_2172.19.0.2

我不明白为什么,因为我的主机上的“路由”似乎是正确的:

#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    1024   0 …
Run Code Online (Sandbox Code Playgroud)

networking docker

5
推荐指数
1
解决办法
2万
查看次数

没有与主机外部的 Docker 容器的 IPv6 连接

我有一个 IPv6 本机容器,在端口 8000 上运行一个小型 Web 应用程序。

在 Docker 主机上,我可以使用全局 IP 访问 Web 服务,但从另一台主机连接时收到“连接被拒绝”。但是,可以从其他主机对容器执行 ping 操作。

容器中的服务有效

# curl "http://[2a01:4f8:10a:2cc5:0:242:ac11:2]:8000"
I'm b6032b33bc12
Run Code Online (Sandbox Code Playgroud)

但是,从另一台主机运行:

{2.1.5p273} curl "http://[2a01:4f8:10a:2cc5:0:242:ac11:2]:8000"
curl: (7) Failed to connect to 2a01:4f8:10a:2cc5:0:242:ac11:2 port 8000: Connection refused
Run Code Online (Sandbox Code Playgroud)

然而,ipv6 地址是可 ping 通的:

{2.1.5p273} ping6 2a01:4f8:10a:2cc5:0:242:ac11:2
PING 2a01:4f8:10a:2cc5:0:242:ac11:2(2a01:4f8:10a:2cc5:0:242:ac11:2) 56 data bytes
64 bytes from 2a01:4f8:10a:2cc5:0:242:ac11:2: icmp_seq=1 ttl=60 time=0.385 ms
64 bytes from 2a01:4f8:10a:2cc5:0:242:ac11:2: icmp_seq=2 ttl=60 time=0.452 ms
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

有关我的环境的更多详细信息:

# docker -
Docker version 17.03.1-ce, build c6d412e
Run Code Online (Sandbox Code Playgroud)

该守护进程使用以下参数来启用 ipv6:

--experimental=true --ipv6 --fixed-cidr-v6=2a01:4f8:10a:2cc5::2/64 …
Run Code Online (Sandbox Code Playgroud)

networking iptables ipv6 docker

5
推荐指数
1
解决办法
2016
查看次数

Docker 私有注册表 - 删除了所有映像,但仍显示在目录中

按照官方文档(https://docs.docker.com/registry/spec/api/#deleting-an-image),我已经能够成功删除图像。正如预期的那样,删除后,图像无法再被拉取,也无法通过 API 调用其清单。

我觉得我已经完成了最困难的部分,但问题是/v2/_catalog删除完成后,存储库仍然列在下面。我正在尝试完全清除注册表。

这是我的注册表撰写文件:

registry:
  image: registry:2.5.2
  container_name: registry-test
  ports:
    - 5007:5000
  environment:
    REGISTRY_STORAGE: s3
    REGISTRY_HTTP_TLS_CERTIFICATE: /etc/cert.crt
    REGISTRY_HTTP_TLS_KEY: /etc/cert.key
    REGISTRY_STORAGE_S3_ACCESSKEY: ******
    REGISTRY_STORAGE_S3_SECRETKEY: ******
    REGISTRY_STORAGE_S3_REGION: us-west-1
    REGISTRY_STORAGE_S3_BUCKET: ******
    REGISTRY_STORAGE_S3_SECURE: "true"
    REGISTRY_STORAGE_DELETE_ENABLED: "true"
  volumes:
    - /dockerdata/volumes/registry-test/etc/cert.crt:/etc/cert.crt
    - /dockerdata/volumes/registry-test/etc/cert.key:/etc/cert.key
  restart: unless-stopped
Run Code Online (Sandbox Code Playgroud)

这是我删除图像的高级方法:

  1. 收集图像摘要: HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag添加"Accept: application/vnd.docker.distribution.manifest.v2+json"到调用的标题中

  2. 该调用返回标头键Docker-Content-Digest,其值例如sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  3. 使用步骤 2 中的值运行删除调用:DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  4. 注册表API返回202 Accepted

  5. 手动运行垃圾收集:registry garbage-collect /etc/docker/registry/config.yml

  6. 垃圾收集器从磁盘中删除关联的 blob(此处省略日志,但它成功删除了 blob)

此时,我可以确认 blob 已从磁盘中完全删除,并且我无法再调用图像详细信息(如上面的步骤 1 所示),所以我认为我已经完成了。

但是,运行时:/v2/_catalog …

docker docker-registry

5
推荐指数
1
解决办法
7519
查看次数