docker配置远程连接
- 官方文档里有步骤描述。
- 一种方式是配置docker-daemon自己的配置文件:
- 创建/修改 /etc/docker/daemon.json
- 添加以下配置
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
-
如果是通过 systemctl启动的docker.service,需要配置service 启动参数
- 创建/usr/lib/systemd/system/docker.service (优先级更高,覆盖默认启动)
- 添加以下配置
ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
- sudo systemctl daemon-reload
- sudo systemctl restart docker.service
-
遇到的坑
- 官方文档中写的ctp://127.0.0.1:2375只能本地访问。 需要改成tcp://0.0.0.0:2375。 127.0.0.1是本地接口,只能本地调用。 而0.0.0.0代表本机所有网络接口
- 如果以systemctl启动docker则不能采用daemon.json的配置方式,不然会报启动参数与配置文件冲突。默认启动脚本是/usr/lib/systemd/system/docker.service
防火墙配置
-
centos7采用firewalld来配置防火墙,默认不开放接口。官方文档中给出的方案比较底层。这里我们采取自定义Service的方式来配置
- 创建 /etc/firewalld/services/docker.xml
- 加入以下内容
<?xml version="1.0" encoding="utf-8"?> <service> <short>docker</short> <description>docker daemon for remote access</description> <port protocol="tcp" port="2375"/> </service>
- 查看默认zone(一般是public) # firewall-cmd --get-default-zone
- 在zone中加入这个service # firewall-cmd --zone=public --add-service=docker --permanent
- 重新加载 # firewall-cmd --reload
docker的网络原理(默认bridge网络)
- 一开始我有个疑问,为何docker中运行的容器不需要防火墙配置就可以被访问?于是深入了解下docker桥接网络的原理
- 以我本地为例,运行了两个container
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2a6c9ab37b39 jenkins/jenkins "/sbin/tini -- /usr/…" 13 days ago Up 12 hours 0.0.0.0:50000->50000/tcp, 0.0.0.0:18080->8080/tcp jenkins
c4bf1e3daf77 registry:2 "/entrypoint.sh /etc…" 2 weeks ago Up 12 hours 0.0.0.0:15000->5000/tcp registry
- 有个叫docker-proxy的进程会帮我们做转发
# ps -ef | grep docker-proxy
root 1517 754 0 07:19 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 50000 -container-ip 172.17.0.2 -container-port 50000
root 1532 754 0 07:19 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 18080 -container-ip 172.17.0.2 -container-port 8080
root 1548 754 0 07:19 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 15000 -container-ip 172.17.0.3 -container-port 5000
root 5332 4555 0 19:29 pts/0 00:00:00 grep --color=auto docker-proxy
- docker启动时会修改iptables规则,在forward chain中加入自己的规则
# iptables -L -n
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- 0.0.0.0/0 0.0.0.0/0
DOCKER-ISOLATION-STAGE-1 all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
DOCKER all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_direct all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_IN_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_IN_ZONES all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_OUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
FORWARD_OUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:50000
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:8080
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:5000
- 顺便提一下,firewall也是通过类似嵌入自定义链来实现的
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
INPUT_direct all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES_SOURCE all -- 0.0.0.0/0 0.0.0.0/0
INPUT_ZONES all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain INPUT_ZONES (1 references)
target prot opt source destination
IN_public all -- 0.0.0.0/0 0.0.0.0/0 [goto]
IN_public all -- 0.0.0.0/0 0.0.0.0/0 [goto]
Chain IN_public (2 references)
target prot opt source destination
IN_public_log all -- 0.0.0.0/0 0.0.0.0/0
IN_public_deny all -- 0.0.0.0/0 0.0.0.0/0
IN_public_allow all -- 0.0.0.0/0 0.0.0.0/0
Chain IN_public_allow (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:2375 ctstate NEW
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 ctstate NEW