这是我输入docker ps
时的结果:
在docker中,我有3个容器,webapps,redis和rabbitmq,我很困惑如何将容器webapps链接到容器redis和rabbitmq容器?在非docker应用程序中,mywebapps可以向rabbitmq发送消息并写入/读取reddis。我不知道如何链接3个容器, 我尝试使用这样的命令
docker run --name rabbitmq -p 8080:80 --link webapps:nimmis/apache-php7 -d rabbitmq
但它仍然不起作用
当我尝试通过rabbitmq发送消息时,这是我在webapps上的config.phpdefine('HOST', 'localhost');
define('PORT', 5672);
我尝试使用主机名
更改localhostdefine('HOST', 'rabbitmq');
define('PORT', 5672);
错误消息被拒绝连接... 看来我的三个容器需要在同一个ip中配置/映射/绑定网络吗?
答案 0 :(得分:76)
关联是一项传统功能。请使用"用户定义的网络":
sudo docker network create mynetwork
然后使用此网络重新运行您的容器:
sudo docker run --name rabbitmq -p 8080:80 -d --network mynetwork rabbitmq
对于您希望彼此连接的其他容器执行相同的操作。
使用"用户定义的网络",您有一个"内部名称解析"随时为您服务(有点像访问网站时的域名解析)。您可以使用要引用的容器的名称,以便解析容器的IP地址,只要它们在相同的"用户定义的网络上运行"。这样,您可以在同一网络上的其他容器中解析rabbitmq
容器的IP地址及其名称。
所有包含在同一"用户定义的网络"将具有网络连接。不需要"遗留链接"。
答案 1 :(得分:14)
对于容器间依赖关系和链接,您希望使用docker-compose
来定义容器之间的links。
在存储Docker文件的根目录中,只需创建一个名为docker-compose.yml
的新文件,在这里您可以将容器定义为彼此依赖的服务:
version: '2'
services:
webapps:
build: .
links:
- "rabbitmq:rabmq"
- "redis"
rabbitmq:
image: rabbitmq
redis:
image: redis
所以在webapps
服务的定义中,您会看到links
其他两项服务rabbitmq
和redis
。这意味着当构建webapps
容器时,会生成一个hosts
文件的条目,以便将域名redis
转换为IP和端口号实际的容器。
您可以选择使用service:alias
表示法更改此容器的地址名称,就像我将rabbitmq
定义为
使用容器rabmq
内的别名webapps
。
现在使用docker-compose
构建和启动容器,只需输入:
docker-compose up -d
因此,连接到另一个容器就像使用此别名作为主机名一样简单。
由于您在这种情况下使用docker-compose
,它会自动创建一个泊坞网络以连接所有容器,因此您不必担心这一点。但是有关更多信息,请查看文档:
https://docs.docker.com/compose/networking/#/specifying-custom-networks
答案 2 :(得分:4)
您需要将rabbitmq和redis链接到您的webapps容器,而不是其他方式。
#run redis container docker run --name some-redis -d redis #run rabbitmq container docker run -d --hostname my-rabbit --name some-rabbit rabbitmq #run webapps container docker run --name webapps -p 8080:80 --link some-redis:redis --link some-rabbit:rabbitmq nimmis/apache-php7
首先运行redis和rabbitmq容器。 然后运行带有2个容器链接的webapps容器。
现在,在webapps中配置redis主机 - 很简单。您只需使用env变量' REDIS_PORT_6379_TCP_ADDR' 。因为一旦容器被链接,你就会得到它的env变量。和redis导出该变量。
关于rabbitmq主机 - 你可以在兔子容器启动后获取ip:
RABBITMQ_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' some-rabbit)然后在运行webapps容器时将其传入--env。
答案 3 :(得分:2)
根据我的经验,可以使用docker-compose.yml等声明式,但是您可以简单地使用
docker run -d -P -link nimmis/apache-php7 rabbitmq redis
答案 4 :(得分:1)
您可以在docker-compose.yml
version: "3"
services:
webapps:
image: nimmis/apache-php7
ports:
- "80:8080"
networks:
- my-network
rabbitmq:
image: rabbitmq
networks:
- my-network
redis:
image: redis
networks:
- my-network
networks:
my-network:
driver: overlay
然后做:
docker swarm init
docker stack deploy -c docker-compose.yml my-stack
上查看完整的示例
答案 5 :(得分:0)
您可以访问 Redis 容器的 IP 地址。
启动 rabbitmq
并获取内部 IP 地址:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' rabbitmq > .rabbitmq.ip
现在,您可以在启动 webapps
容器时添加 Apache 配置并添加 rabbitmq 的内部 IP 地址。或者简单地在 Apache 容器的 /etc/hosts 中添加一个条目,如:
// the dynamic internal IP of rabbitmq is known once rabbitmq starts:
172.30.20.10 rabbitmq.redis.local