我发现了一个关于docker-compose和docker之间网络端口说明的奇怪行为,我的意思是我无法使用docker-compose正确设置
在我在Virtualbox下运行的CoreOS VM上,我想设置2个容器
A - 工作的方法:使用泊坞窗:
我用来启动我的2个容器的命令
docker build -t myghost .
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=ghost -e MYSQL_PASSWORD=password -e MYSQL_USER=ghost -p 3306 mysql
sudo docker run -d --link mysql --name ghost -p 80:2368 myghost
端口80正确暴露,我可以从我的主机网络连接
来自另一个虚拟机的 nmap
扫描显示端口80打开(nmap -sT 192.168.1.25
)
Starting Nmap 7.40 ( https://nmap.org ) at 2017-04-05 23:06 CEST
Nmap scan report for coreos1.home (192.168.1.25)
Host is up (0.000088s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
4001/tcp open newoak
32779/tcp open sometimes-rpc21
MAC Address: 08:00:27:90:17:CF (Oracle VirtualBox virtual NIC)
Iptables配置(sudo iptables -L
)返回:
Chain DOCKER (3 references)
target prot opt source destination
ACCEPT tcp -- anywhere 172.19.0.2 tcp dpt:mysql
ACCEPT tcp -- anywhere 172.19.0.3 tcp dpt:2368
sudo iptables -S
显示
-A DOCKER -d 172.19.0.2/32 ! -i br-282da314ef5d -o br-282da314ef5d -p tcp -m tcp --dport 3306 -j ACCEPT
-A DOCKER -d 172.19.0.3/32 ! -i br-282da314ef5d -o br-282da314ef5d -p tcp -m tcp --dport 2368 -j ACCEPT
注意:构建myghost图像的Dockerfile只包含js文件的副本
B - 不起作用的方法:使用docker-compose:
这是我的docker-compose.yml
version: '2'
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=ghost
- MYSQL_USER=ghost
- MYSQL_PASSWORD=password
myghost:
build: ./myghost
container_name: myghost
depends_on:
- mysql
ports:
- "80:2368"
expose:
- "80"
NB在这个配置中我尝试使用不会改变问题的expose:指令
然后我发起docker-compose up --build -d
。 首次执行,ghost webapp永远无法正常启动(连接到数据库时出错),这很奇怪,因为我的docker-compose.yml
包含depends_on ...
docker inspect ghost container return
错误:连接ECONNREFUSED 172.19.0.2:3306
错误:连接ECONNREFUSED 172.19.0.2:3306
第二次运行时,容器启动
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
945d75995d11 appghost_myghost "/entrypoint.sh npm s" 21 minutes
ago Up 21 minutes 80/tcp, 0.0.0.0:80->2368/tcp myghost
aea76509818e mysql "docker-entrypoint.sh" 25 minutes
ago Up 25 minutes 0.0.0.0:32776->3306/tcp mysql
docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------
myghost /entrypoint.sh npm start Up 0.0.0.0:80->2368/tcp, 80/tcp
mysql docker-entrypoint.sh mysqld Up 0.0.0.0:32776->3306/tcp
两个容器之间的ping是可以的 但是,我的Web应用程序无法缓存,并使用nmap扫描将端口80显示为过滤
PORT STATE SERVICE
22/tcp open ssh
80/tcp filtered http
32780/tcp filtered sometimes-rpc23
我也注意到这种iptables -S
配置看起来像那样(只有差异部分)
-A DOCKER -d 172.19.0.2/32 ! -i br-282da314ef5d -o br-282da314ef5d -p tcp -m tcp --dport 3306 -j ACCEPT
-A DOCKER -d 172.19.0.3/32 ! -i br-282da314ef5d -o br-282da314ef5d -p tcp -m tcp --dport 2368 -j ACCEPT
更多信息
Docker version 1.12.6, build d5236f0
Docker-compose version 1.11.2, build dfed245
CoreOs 1298.7.0
VirtualBox v5.1.8 / Bridged network configuration
uname -a: Linux coreos1 4.10.4-coreos-r1 #1 SMP Fri Mar 31 01:58:22 UTC 2017 x86_64 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz GenuineIntel GNU/Linux
答案 0 :(得分:0)
在遇到此类问题时重新启动coreOs解决问题