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自己的答案,这是我手动(没有脚本)。

  1. 如问题所述,在domainname: myapp.dev docker-compose.yml文件中定义domainname: myapp.devhostname: www
  2. 像平常一样调出你的Docker容器
  3. 运行docker-compose exec client cat /etc/hosts以获取容器主机文件的输出(其中client是您的服务名称)(输出示例: 172.18.0.6 www.myapp.dev
  4. 打开丢失的(主机) /etc/hosts文件并添加该行: 172.18.0.6 server.server.dev

如果你的Docker服务容器改变了IP或者做了什么奇怪的事情,你会想要一个更复杂的解决scheme,但是现在我的简单需求正在工作。

为了使本地主机的整个域你可以使用dnsmasq 。 在这种情况下,如果您select域.dev任何子域将指向您的容器。 但是你必须知道.dev区域的问题

或者你可以使用bash脚本来启动你的d​​ocker-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的手册页,你一定会发现很多其他的选项有趣!