Docker容器的本地主机名

Edu*_*ass 39 docker docker-compose

初学者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
Run Code Online (Sandbox Code Playgroud)

您可以看到我为每个域分配了一个.dev域名,这可以很好地看到另一台机器(Docker内部网络),例如这里我正在server.devclient.devCLI中ping :

    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
Run Code Online (Sandbox Code Playgroud)

这在内部工作得很好,但在主机OS网络上却不行.

为方便起见,我想在MY本地网络中分配域,而不是Docker容器网络,以便我可以在浏览器URL上键入:client.dev并加载Docker容器.

现在,我只能使用Docker IP,这是动态的:

client: 192.168.99.100:80
server: 192.168.99.100:3000
database: 192.168.99.100:5432
Run Code Online (Sandbox Code Playgroud)

是否有自动/方便的方法来执行此操作,而不涉及我手动将IP添加到我的/ etc/hosts文件中?

顺便说一下,如果有任何相关性,我会使用OSX.

谢谢!

编辑:我发现这个似乎有关的Github问题:https://github.com/docker/docker/issues/2335

据我所知,他们似乎说这是一个不可用的东西,他们建议外部工具,如:

那是对的吗?如果是这样,我应该在我的特定场景中选择哪一个?

Edu*_*ass 22

好,

因为似乎没有本地方法可以用Docker做到这一点,我终于选择了Ryan Armstrong的替代解决方案,它包括动态更新/etc/hosts文件.

我选择了这个,因为它对我来说很方便,因为它作为一个脚本工作,我已经有了一个启动脚本,所以我可以将这个函数添加到它中.

以下示例创建名为docker.local的主机条目,该条目将解析为您的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
Run Code Online (Sandbox Code Playgroud)

/etc/hosts当我通过启动脚本启动Docker机器时,这将自动添加或更新我的主机操作系统上的行.

无论如何,正如我在研究期间发现的那样,除了编辑hosts文件之外,您还可以通过设置自定义DNS服务器来解决此问题:

还在Github上找到了几个项目,显然是为了解决这个问题,虽然我没有尝试过:

  • 我发现将容器名称解析为来自 docker 主机的 IP 地址的另一个相当优雅的解决方案是 nss-docker https://github.com/dex4er/nss-docker (2认同)

tha*_*smt 11

扩展@ eduwass自己的答案,这是我手动完成的(没有脚本).

  1. 如问题中所述domainname: myapp.dev,hostname: wwwdocker-compose.yml文件中定义和
  2. 像往常一样打开你的Docker容器
  3. 运行docker-compose exec client cat /etc/hosts得到容器的hosts文件的输出(其中client是您的服务名称)(输出例如:172.18.0.6 www.myapp.dev)
  4. 打开本地(主机)/etc/hosts文件并添加该行:172.18.0.6 server.server.dev

如果您的Docker服务容器更改IP或做任何想象的事情,您将需要更复杂的解决方案,但这对我目前的简单需求起作用.

  • 最好不要使用容器的私有IP。每个容器的 ip 在创建时动态分配给它,这意味着每当重新创建容器时,您都必须使用新 ip 更新“/etc/hosts”。如果您有多个带有域的容器,那么预计手动繁琐的工作...... (4认同)
  • 我在互联网上搜索这个.非常感谢 (3认同)