这是我键入时的结果docker ps
:
在docker中,我有3个容器,webapps,redis和rabbitmq,我很困惑如何将容器webapps链接到容器redis和rabbitmq容器?在非docker应用程序中,mywebapps可以向rabbitmq发送消息并写入/读取reddis.我stil不知道如何链接3那些容器,我尝试使用这样的命令
docker run --name rabbitmq -p 8080:80 --link webapps:nimmis/apache-php7 -d rabbitmq
但它仍然无效
这是我在webapps上的config.php,当我尝试通过rabbitmq发送消息时
define('HOST', 'localhost'); define('PORT', 5672);
我试图用hostname更改localhost
define('HOST', 'rabbitmq'); define('PORT', 5672);
错误消息是连接拒绝...似乎在我的三个容器需要配置/映射/绑定网络在同一个IP?
链接是一项传统功能.请使用"用户定义的网络":
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
,在这里您可以将容器定义为相互依赖的服务,如下所示:
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
在这种情况下使用它,它会自动创建一个docker网络来连接所有容器,因此您不必担心这一点.但是有关更多信息,请查看文档:https:
//docs.docker.com/compose/networking/#/specifying-custom-networks
您需要将rabbitmq和redis链接到您的webapps容器,而不是相反的方法。
#运行redis容器 docker运行--name 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 --link some-redis:redis --link some-rabbit:rabbitmq nimmis / apache-php7
首先运行redis和rabbitmq容器。然后运行带有两个容器链接的webapps容器。
现在,要在Web应用程序中配置Redis主机-这很容易。您可以简单地使用env变量'REDIS_PORT_6379_TCP_ADDR'。因为一旦容器被链接,您就可以获得其env变量。然后redis导出该变量。
关于rabbitmq主机-在rabbit容器启动后,您可以通过以下方式获取ip:
RABBITMQ_IP = $(docker inspect --format'{{.NetworkSettings.IPAddress}}'有点兔子)然后在运行webapps容器时将其传递给--env。