Docker 蜂拥而至 'dind' 图片和网络问题
Docker swarm on 'dind' images and networking problems
我正在尝试创建一个基于 'dind' 图像的本地集群环境。下面是环境重建的步骤:
docker network create --attachable --subnet 10.0.0.0/16 tools_network
docker run -d --privileged --name swarm-manager-1 --hostname swarm-manager-1 --network tools_network --ip 10.0.0.3 -p 42421:2375 docker:17.03.1-dind
docker --host localhost:42421 swarm init --advertise-addr 10.0.0.3
docker run -d --privileged --name swarm-worker-1 --hostname swarm-worker-1 --network tools_network --ip 10.0.0.4 -p 42423:2375 docker:17.03.1-dind
docker --host localhost:42423 swarm join --token <swarm-token> 10.0.0.3:2377
之后我添加一个基于 nginx 的代理:
docker run -d --name swarm-proxy --network tools_network -v $(pwd)/temp-proxy:/etc/nginx:ro -p 80:80 nginx:stable-alpine
'temp-proxy' 文件夹中 nginx.conf 的以下内容:
events {
worker_connections 1024;
}
http {
upstream swarm {
server 10.0.0.3;
server 10.0.0.4;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
location / {
proxy_pass http://swarm;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
我用于测试目的的服务是由以下人员启动的:
docker --host localhost:42421 service create --name test-web --publish 80:80 yeasy/simple-web
基于 mesh networking documentation,我在此阶段的期望是 curl localhost
将 return 来自已部署服务的结果。但是,我收到 502 Bad Gateway 响应,其中包含来自代理的以下日志消息:
[error] 7#7: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 10.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://10.0.0.4:80/", host: "localhost"
[error] 7#7: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 10.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://10.0.0.3:80/", host: "localhost"
10.0.0.1 - - "GET / HTTP/1.1" 502 173 "-" "curl/7.47.0"
从部署到 tools_network
的 docker 容器卷曲的结果相同(连接被拒绝)。
运行 netstat -l
从其中一个群节点内部显示它们不在端口 80 上侦听:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.11:38943 0.0.0.0:* LISTEN
tcp 0 0 :::2375 :::* LISTEN
tcp 0 0 :::2377 :::* LISTEN
tcp 0 0 :::7946 :::* LISTEN
udp 0 0 127.0.0.11:35094 0.0.0.0:*
udp 0 0 0.0.0.0:4789 0.0.0.0:*
udp 0 0 :::7946 :::*
问题是:
是不是我配置有问题?这是什么?
如果不是,我应该采取什么步骤来找到问题的根源?
经过大量调查后,我发现了问题 this。
Docker 由于缺少模块,dind 图像无法正确初始化,我实际上在容器日志中看到了错误 (docker logs swarm-manager-1
),但没有注意它们。
所以我的解决方案是像这样启动群节点:
docker run -d --privileged --name swarm-manager-1 --hostname swarm-manager-1 --network tools_network --ip 10.0.0.3 -p 42421:2375 -v /lib/modules:/lib/modules:ro docker:17.03.1-dind
其中 /lib/modules
映射是缺失的部分。
我正在尝试创建一个基于 'dind' 图像的本地集群环境。下面是环境重建的步骤:
docker network create --attachable --subnet 10.0.0.0/16 tools_network
docker run -d --privileged --name swarm-manager-1 --hostname swarm-manager-1 --network tools_network --ip 10.0.0.3 -p 42421:2375 docker:17.03.1-dind
docker --host localhost:42421 swarm init --advertise-addr 10.0.0.3
docker run -d --privileged --name swarm-worker-1 --hostname swarm-worker-1 --network tools_network --ip 10.0.0.4 -p 42423:2375 docker:17.03.1-dind
docker --host localhost:42423 swarm join --token <swarm-token> 10.0.0.3:2377
之后我添加一个基于 nginx 的代理:
docker run -d --name swarm-proxy --network tools_network -v $(pwd)/temp-proxy:/etc/nginx:ro -p 80:80 nginx:stable-alpine
'temp-proxy' 文件夹中 nginx.conf 的以下内容:
events {
worker_connections 1024;
}
http {
upstream swarm {
server 10.0.0.3;
server 10.0.0.4;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
location / {
proxy_pass http://swarm;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
我用于测试目的的服务是由以下人员启动的:
docker --host localhost:42421 service create --name test-web --publish 80:80 yeasy/simple-web
基于 mesh networking documentation,我在此阶段的期望是 curl localhost
将 return 来自已部署服务的结果。但是,我收到 502 Bad Gateway 响应,其中包含来自代理的以下日志消息:
[error] 7#7: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 10.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://10.0.0.4:80/", host: "localhost"
[error] 7#7: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 10.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://10.0.0.3:80/", host: "localhost"
10.0.0.1 - - "GET / HTTP/1.1" 502 173 "-" "curl/7.47.0"
从部署到 tools_network
的 docker 容器卷曲的结果相同(连接被拒绝)。
运行 netstat -l
从其中一个群节点内部显示它们不在端口 80 上侦听:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.11:38943 0.0.0.0:* LISTEN
tcp 0 0 :::2375 :::* LISTEN
tcp 0 0 :::2377 :::* LISTEN
tcp 0 0 :::7946 :::* LISTEN
udp 0 0 127.0.0.11:35094 0.0.0.0:*
udp 0 0 0.0.0.0:4789 0.0.0.0:*
udp 0 0 :::7946 :::*
问题是:
是不是我配置有问题?这是什么?
如果不是,我应该采取什么步骤来找到问题的根源?
经过大量调查后,我发现了问题 this。
Docker 由于缺少模块,dind 图像无法正确初始化,我实际上在容器日志中看到了错误 (docker logs swarm-manager-1
),但没有注意它们。
所以我的解决方案是像这样启动群节点:
docker run -d --privileged --name swarm-manager-1 --hostname swarm-manager-1 --network tools_network --ip 10.0.0.3 -p 42421:2375 -v /lib/modules:/lib/modules:ro docker:17.03.1-dind
其中 /lib/modules
映射是缺失的部分。