coreos docker-compose v2:在防火墙后面进行过滤的暴露端口,无法访问

时间:2017-04-05 21:19:17

标签: docker docker-compose firewall coreos

我发现了一个关于docker-compose和docker之间网络端口说明的奇怪行为,我的意思是我无法使用docker-compose正确设置

在我在Virtualbox下运行的CoreOS VM上,我想设置2个容器

  1. 第一个是mysql数据库(Mysql)
  2. 第二个是基于鬼影的Web应用程序图像(myghost)构建
  3. 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
    

1 个答案:

答案 0 :(得分:0)

在遇到此类问题时重新启动coreOs解决问题