【发布时间】:2023-04-03 12:02:01
【问题描述】:
我发现 docker-compose 与 docker 之间的网络端口公开有一个奇怪的行为,我的意思是我无法正确设置 docker-compose
在 Virtualbox 下运行的 CoreOS VM 上,我想设置 2 个容器
- 首先是mysql数据库(Mysql)
- 第二个是基于ghost镜像构建的web应用镜像(myghost)
A - 可行的方法:使用 docker:
我用来启动我的 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 从另一个 vm 扫描显示端口 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 在这个配置中我尝试使用不会改变问题的暴露:指令
然后我启动docker-compose up --build -d。 第一次执行ghost webapp 无法正常启动(连接到数据库时出错),很奇怪,因为我的docker-compose.yml 包含depends_on ...
docker inspect ghost 容器返回
错误:连接 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
【问题讨论】:
-
奇怪的事情我注意到只需重新启动 CoreOS VM 并使用 docker-compose 重新启动似乎可以解决该问题。有人可以确认配置是否正确或已经遇到该问题?跨度>
标签: docker docker-compose firewall coreos