如何在Docker中链接容器?
这里是我inputdocker 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
但还是不行
这里是我的config.php在webapps上,当我尝试通过rabbitmq发送邮件
define('HOST', 'localhost'); define('PORT', 5672);
我试图用主机名更改本地主机
define('HOST', 'rabbitmq'); define('PORT', 5672);
错误消息是连接拒绝…似乎在我的三个容器需要configuration/映射/绑定networking在相同的IP?
] 2
链接是一个遗留function。 请使用user defined networks
:
sudo docker network create mynetwork
然后使用这个networking重新创build您的容器:
sudo docker run --name rabbitmq -p 8080:80 -d --network mynetwork rabbitmq
对于你想让它们彼此连接的其他容器做同样的事情。
使用user defined networks
您可以使用internal name resolution
。 您可以通过名称在同一个user defined network
上调用其他容器。 在这种情况下,您可以使用same network
上其他容器的名称来调用rabbitmq
容器。
请注意,在同一个user defined network
上的所有包含器将具有networking连接,并且不需要legacy linking
。
对于容器间的依赖关系和链接,您需要使用docker-compose
来定义容器之间的链接 。
在您存储Docker文件的根目录中,创build一个名为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
。 这意味着当构buildwebapps
容器时,会创build一个到hosts
文件的条目,使得域名redis
被转换为实际容器的IP和端口号。
您可以select使用service:alias
表示法来更改此容器的地址名称,例如,如何将rabbitmq
定义为使用容器webapps
的别名rabmq
。
现在使用docker-compose
创build和启动你的容器,只需键入:
docker-compose up -d
所以连接到另一个容器就像使用这个别名作为主机的名字一样简单。
由于在这种情况下您使用的是docker-compose
,因此它会自动创build一个dockernetworking来连接所有容器,因此您不必担心这一点。 但是要了解更多信息,请查看文档: https : //docs.docker.com/compose/networking/#/specifying-custom-networks
您需要将rabbitmq和redis链接到您的webapps容器,而不是周围的其他方式。
#run redis容器 docker运行 - 名称some-redis -d redis #run rabbitmq容器 docker run -d --hostname my-rabbit --name some-rabbit rabbitmq #run webapps容器 docker run --name webapps -p 8080:80 - 链接一些redis:redis - 链接一些兔子:rabbitmq nimmis / apache-php7
首先运行redis和rabbitmq容器。 然后运行带有2个容器链接的webapps容器。
现在,在webapps中configurationredis主机 – 这很简单。 你可以简单地使用envvariables'REDIS_PORT_6379_TCP_ADDR' 。 因为一旦一个容器被链接,你得到它的envvariables。 和redis输出这个variables。
关于rabbitmq主机 – 你可以在兔子容器启动后得到ip:
RABBITMQ_IP = $(docker inspect --format'{{.NetworkSettings.IPAddress}}'some-rabbit)
然后在运行webapps容器时将其传递给–env。