[英]How to link containers in docker?
这是我输入docker ps
时的结果:
我有 3 个 docker 容器:webapps、redis 和 rabbitmq。 我想将容器 webapps 链接到容器 redis 和 rabbitmq 容器。 在非 docker 应用程序中,mywebapps 可以向 rabbitmq 发送消息并写入/读取 redis。
我尝试使用这样的命令
docker run --name rabbitmq -p 8080:80 --link webapps:nimmis/apache-php7 -d rabbitmq
但它不起作用。
这是我在 webapps 上的 config.php,我试图通过rabbitmq 发送消息:
define('HOST', 'localhost');
define('PORT', 5672);
我试图用主机名更改 localhost
define('HOST', 'rabbitmq');
define('PORT', 5672);
错误消息说connection refused
。
看来我的三个容器需要配置在同一个网络命名空间中。
链接是一个遗留功能。 请使用“用户定义的网络”:
sudo docker network create mynetwork
然后使用此网络重新运行您的容器:
sudo docker run --name rabbitmq -p 8080:80 -d --network mynetwork rabbitmq
对要相互连接的其他容器执行相同操作。
使用“用户定义的网络”,您可以使用“内部名称解析”(有点像访问网站时的域名解析)。 您可以使用要引用的容器名称来解析容器的 IP 地址,只要它们运行在同一个“用户定义的网络”上即可。 有了这个,您可以在同一网络上的其他容器中使用其名称解析rabbitmq
容器的 IP 地址。
同一“用户定义网络”上的所有容器都将具有网络连接性。 不需要“传统链接”。
对于容器间的依赖关系和链接,您需要使用docker-compose
来定义容器之间的链接。
在您存储 Docker 文件的根目录中,只需创建一个名为docker-compose.yml
的新文件,在这里您可以将容器定义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
以在容器webapps
使用别名rabmq
一样。
现在使用docker-compose
构建并启动您的容器,只需键入:
docker-compose up -d
所以连接到另一个容器就像使用这个别名作为主机名一样简单。
由于您在这种情况下使用docker-compose
,它会自动创建一个 docker 网络来连接所有容器,因此您不必担心。 但有关更多信息,请查看文档: https : //docs.docker.com/compose/networking/#/specifying-custom-networks
您需要将 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 主机 - 很容易。 您可以简单地使用环境变量'REDIS_PORT_6379_TCP_ADDR' 。 因为一旦容器被链接,你就会得到它的 env 变量。 和 redis 导出该变量。
关于 rabbitmq 主机 - 您可以在 rabbit 容器启动后通过以下方式获取 ip:
RABBITMQ_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' some-rabbit)然后在运行 webapps 容器时将它传递给 --env 。
根据我使用诸如 docker-compose.yml 之类的声明式的经验是可以的,但您可以简单地使用
docker run -d -P -link nimmis/apache-php7 rabbitmq redis
您可以在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
您可以访问 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.