Docker容器的本地主机名
初学者的Docker问题在这里,
所以我有一个运行模块化应用程序的开发环境,它使用Docker Compose来运行3个容器:服务器,客户端,数据库。
docker-compose.yml
如下所示:
############################# # Server ############################# server: container_name: server domainname: server.dev hostname: server build: ./server working_dir: /app ports: - "3000:3000" volumes: - ./server:/app links: - database ############################# # Client ############################# client: container_name: client domainname: client.dev hostname: client image: php:5.6-apache ports: - "80:80" volumes: - ./client:/var/www/html ############################# # Database ############################# database: container_name: database domainname: database.dev hostname: database image: postgres:9.4 restart: always environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=root - POSTGRES_DB=dbdev - PG_TRUST_LOCALNET=true ports: - "5432:5432" volumes: - ./database/scripts:/docker-entrypoint-initdb.d # init scripts
你可以看到我为每个分配一个.dev域名,这可以很好地看到另一个机器(Docker内部networking),例如在这里我ping从client.dev
的CLI server.dev
:
root@client:/var/www/html# ping server.dev PING server.dev (127.0.53.53): 56 data bytes 64 bytes from 127.0.53.53: icmp_seq=0 ttl=64 time=0.036 ms
这在内部很好,但不在我的主机操作系统networking上。
为了方便起见,我想在我的本地networking中分配域名,而不是在Docker容器networking中,这样我就可以在浏览器URL中键入:client.dev并加载Docker容器。
现在,只有使用dynamic的Docker IP才能访问:
client: 192.168.99.100:80 server: 192.168.99.100:3000 database: 192.168.99.100:5432
有没有一个自动/方便的方法来做到这一点,不涉及手动将IP添加到我的/ etc / hosts文件?
顺便说一句,我在OSX上,如果有任何相关性。
谢谢!
编辑:我发现这似乎是相关的Github问题: https : //github.com/docker/docker/issues/2335
据我了解,他们似乎认为这是不可用的东西,他们build议外部工具,如:
- https://github.com/jpetazzo/pipework
- https://github.com/bnfinet/docker-dns
- https://github.com/gliderlabs/resolvable
那是对的吗? 如果是这样的话,我应该select哪一个呢?
好,
所以既然看起来没有本地的方式来与Docker做到这一点 ,我最终select了从Ryan Armstrong这个替代解决scheme ,它包括dynamic更新/etc/hosts
文件。
我之所以select这个,是因为它对我来说很方便,因为这是一个脚本,而且我已经有了一个启动脚本,所以我可以将这个函数附加到它。
以下示例将创build一个名为docker.local的hosts条目,该条目将parsing为您的docker-machine IP:
update-docker-host(){ # clear existing docker.local entry from /etc/hosts sudo sed -i '' '/[[:space:]]docker\.local$/d' /etc/hosts # get ip of running machine export DOCKER_IP="$(echo ${DOCKER_HOST} | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" # update /etc/hosts with docker machine ip [[ -n $DOCKER_IP ]] && sudo /bin/bash -c "echo \"${DOCKER_IP} docker.local\" >> /etc/hosts" } update-docker-host
当我通过我的启动脚本启动Docker机器时,会自动在主机操作系统上添加或修改/etc/hosts
行。
无论如何,正如我在研究中发现的那样,除了编辑hosts文件之外,还可以通过设置一个自定义DNS服务器来解决这个问题:
在Github上也发现了几个显然旨在解决这个问题的项目,尽pipe我没有尝试它们:
扩展@ eduwass自己的答案,这是我手动(没有脚本)。
- 如问题所述,在
domainname: myapp.dev
docker-compose.yml
文件中定义domainname: myapp.dev
和hostname: www
- 像平常一样调出你的Docker容器
- 运行
docker-compose exec client cat /etc/hosts
以获取容器主机文件的输出(其中client
是您的服务名称)(输出示例:172.18.0.6 www.myapp.dev
) - 打开丢失的(主机)
/etc/hosts
文件并添加该行:172.18.0.6 server.server.dev
如果你的Docker服务容器改变了IP或者做了什么奇怪的事情,你会想要一个更复杂的解决scheme,但是现在我的简单需求正在工作。
为了使本地主机的整个域你可以使用dnsmasq 。 在这种情况下,如果您select域.dev任何子域将指向您的容器。 但是你必须知道.dev区域的问题
或者你可以使用bash脚本来启动你的docker-compose,在启动的时候会把行添加到/ etc / hosts,并且在你终止这个进程之后,这行就会被删除
#!/usr/bin/env bash sudo sed -i '1s;^;127.0.0.1 example.dev\n;' /etc/hosts trap 'sudo sed -i "/example.dev/d" /etc/hosts' 2 docker-compose up
TL; DR:– --link
和--link
选项是你所需要的。
问题
如何通过/etc/hosts
链接容器
解
你链接的github问题的确是直接针对你的问题。 这个评论指出了启用这个的PR。 尽pipe它已经很老了,而且过时了(我没有--link
,只是一个快速的样子),无论如何,你正在寻找的是--link
docker run
命令的--link
选项。
命令docker run --link container-name:alias my-image bash
将在/etc/hosts
添加名为container-name
的容器的IP地址与alias
,所以如果你从这个容器执行(从命令) ping alias
会工作 。
请注意,容器名称不是必需的容器主机名! 我build议你在docker-compose.yml
明确使用它们。
奖金
你应该浏览docker run
的手册页,你一定会发现很多其他的选项有趣!