我在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
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
容器。
答案 0 :(得分:12)
每个服务都在自己的容器中运行。从Ubuntu容器的角度来看,redis没有监听localhost。
要让容器进行通信,它们应该位于同一个Docker网络上。这包括三个步骤:
完成此操作后,容器可以使用其名称相互通信,就好像它们是主机名一样。
不止一种方法可以给这只猫留下深刻的印象...我会在这个答案中看两个,但是我可能还有其他一些我不熟悉的方法(比如使用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构建这样的设置,因为将它写入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
。