我现在运行私人服务器一段时间,当我设置它时,我使用 LXC 将不同的服务彼此分开。
大约一个月前,我开始使用 docker(用于工作和私人),从现在开始,我想将它用于新服务(并慢慢地将旧服务迁移到它)。
长话短说:是否可以在同一台主机上同时运行 LXC 和 Docker,只要我需要一个接一个地迁移服务?
服务器运行 Debian Jessie 64 位。
我想在我的 centos 7 机器上显式打开端口,因此我在面向公众的界面上将防火墙配置为 drop 作为默认区域和外部区域。当我运行python -m SimpleHTTPServer 8000并点击端口 8000 上的盒子时,它失败了。但是如果我将端口添加到外部区域。有用。一切都如预期。
但是,当我在端口 8000 上启动 docker 容器并在外部点击该框时,我可以访问该服务。这不是我想要发生的事情。我希望只有在外部区域上打开端口 8000 时才能访问它。
即使我将 docker 容器绑定到盒子的公共地址,它仍然可以绕过防火墙。如果需要,我可以提供更多信息,例如路由表和接口配置,但我不太知道什么有用。寻找学习。
该盒子上有两个物理接口,eth0 分配有公共 IP,eth1 连接到专用网络,我希望能够访问。
编辑已解决添加--iptables=false到泊坞窗选项。
目标:本地连接到远程repl(例如通过lein repl :connect)。
在本地,这很容易:
lein repl :connect 8081,瞧!复制已连接当 repl 在未打开的端口上运行时,我还通过使用 SSH 隧道连接到远程服务器上的 repl:
ssh -N -T -L 8081:localhost:8081 me@some.hostlein 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) Docker 1.8+ 是否可以为一个容器中的不同卷指定不同的卷驱动程序?
那么我可以使用一个卷作为本地存储的默认驱动程序,并使用一个不同的 NFS 或其他驱动程序吗?
除了使用 NFS 文件夹安装主机系统之外。
前言:我在 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) 我正在尝试按照本指南创建一个私有 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) 我基本上需要运行以下命令,iptables -A OUTPUT -d 169.254.169.254 -j DROP但我无法使用iptables,因为该程序正在 docker 容器中运行,并且我无法使用--privileged参数(共享平台)。
我可以使用 iptables 的替代方案来实现相同的结果吗?
我创建了两个 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) 我有一个 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) 按照官方文档(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)
这是我删除图像的高级方法:
收集图像摘要:
HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag添加"Accept: application/vnd.docker.distribution.manifest.v2+json"到调用的标题中
该调用返回标头键Docker-Content-Digest,其值例如sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
使用步骤 2 中的值运行删除调用:DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
注册表API返回202 Accepted
手动运行垃圾收集:registry garbage-collect /etc/docker/registry/config.yml
垃圾收集器从磁盘中删除关联的 blob(此处省略日志,但它成功删除了 blob)
此时,我可以确认 blob 已从磁盘中完全删除,并且我无法再调用图像详细信息(如上面的步骤 1 所示),所以我认为我已经完成了。
但是,运行时:/v2/_catalog …
docker ×10
networking ×3
ipv6 ×2
arch-linux ×1
centos7 ×1
firewalld ×1
iptables ×1
linode ×1
linux ×1
lxc ×1
ssh-tunnel ×1