macOS 10.12上两个Docker容器之间的通信

时间:2017-01-02 21:20:17

标签: macos docker redis

我在macOS 10.12上使用Docker 1.12.5,我正在建立一个开发环境,我有一个应用程序图像,共享 redis 具有一些预先填充的配置变量的图像。

即使在完成了一些教程之后(并阅读了有关docker0在Mac上无法使用的信息),我仍在努力连接这两个容器。

我使用以下方式启动redis图片

docker run -d -p 6379:6379 (IMAGE ID)

在我的redis图片中,我有:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
dffb89854618        d59                 "docker-entrypoint.sh"   20 seconds ago      Up 19 seconds       0.0.0.0:6379->6379/tcp   drunk_williams

来自我的Mac 我可以通过redis-cli命令成功连接而不会出现问题。

但是当我开始使用简单的ubuntu图片时,我似乎无法连接到这个单独的redis图片:

root@2d4eda315f4f:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:03
          inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:20707 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11515 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:28252929 (28.2 MB)  TX bytes:635848 (635.8 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:680 (680.0 B)  TX bytes:680 (680.0 B)
root@2d4eda315f4f:/# telnet localhost 6379
Trying ::1...
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
root@2d4eda315f4f:/# telnet 172.17.0.3 6379
Trying 172.17.0.3...
telnet: Unable to connect to remote host: Connection refused

这是因为主机中没有docker0接口吗?是否有一些简单的解决方法允许这些容器在开发环境中进行通信(在同一主机上运行时)?

更新:尝试使用已命名的容器,我仍然无法连接。

docker run -d --name redis_server redis

结果:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
5d05820aa985        redis               "docker-entrypoint.sh"   43 hours ago        Up 1 seconds        6379/tcp                 redis_server

但是如果我开始一个新的Ubuntu容器:

root@e92b47419bc4:/# redis-cli -h redis_server
Could not connect to Redis at redis_server:6379: Name or service not known

我不确定如何查找/连接到第一个redis_server容器。

1 个答案:

答案 0 :(得分:12)

每个容器都有自己的localhost

每个服务都在自己的容器中运行。从Ubuntu容器的角度来看,redis没有监听localhost。

使用Docker网络

要让容器进行通信,它们应该位于同一个Docker网络上。这包括三个步骤:

  1. 创建Docker网络
  2. 提供容器名称
  3. 将容器附加到您创建的网络
  4. 完成此操作后,容器可以使用其名称相互通信,就好像它们是主机名一样。

    不止一种方法可以给这只猫留下深刻的印象...我会在这个答案中看两个,但是我可能还有其他一些我不熟悉的方法(比如使用Kubernetes或Swarm) )。

    手动完成

    您可以使用docker network命令为此应用程序创建网络。

    # Show the current list of networks
    docker network ls
    
    # Create a network for your app
    docker network create my_redis_app
    

    运行redis容器时,请确保它具有名称,并且位于此网络上。如果您愿意(可以使用-p),可以在外部(对于macOS)公开端口,但这对于其他容器与redis通信并不是必需的。

    docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
    

    现在运行你的Ubuntu容器。如果你愿意,也可以给它命名,但我不打扰这个例子,因为这个没有运行任何服务。

    docker run -it --network my_redis_app ubuntu bash
    

    现在,从Ubuntu容器内部,您应该能够使用名称redis_server来访问redis,就像它是DNS名称一样。

    使用Compose

    进行操作

    我倾向于使用Compose构建这样的设置,因为将它写入YAML文件(IMO)更容易。这是上面的一个例子,用docker-compose.yml形式重写:

    version: '2'
    services:
      redis:
        image: <IMAGE ID>
        networks:
          - my_redis_app
        ports: 6379:6379
      ubuntu:
        image: ubuntu:latest
        networks:
          - my_redis_app
    networks:
      my_redis_app:
        driver: bridge
    

    有了这个,您可以运行docker-compose up -d redis并使用特定的Docker网络将您的redis服务联机。 Compose将为您创建网络(如果它尚不存在)。

    以这种方式运行Ubuntu容器的意义不大......当然,它是交互式的。但我假设一旦你有了redis,你会添加一些应用程序容器,也许像nginx这样的web代理......只需将其他人放在services之下,你就可以一起管理它们。 / p>

    由于ubuntu是交互式的,因此您可以以交互方式运行它:

    # without -d, container is run interactively
    docker-compose run ubuntu bash
    

    现在在Ubuntu中,您应该可以使用其名称连接到redis,在此示例中只是redis