docker-compose.yml container_name和主机名

时间:2019-04-04 18:19:51

标签: docker docker-compose

container_name文件中的docker-compose.yml有什么用途?我可以将其用作hostname吗,它不过是docker-compose.yml文件中的服务名称。

当我在服务下显式地写入hostname时,它是否会覆盖service name所代表的主机名?

2 个答案:

答案 0 :(得分:7)

最简单的答案如下:

container_name:这是您在使用 docker container ls 命令列出正在运行的容器时从主机看到的容器名称。

hostname: 容器的主机名。实际上,您在此处定义的名称将添加到 /etc/hosts 文件中:

$ exec -it myserver /bin/bash

bash-4.2# cat /etc/hosts
127.0.0.1   localhost
172.18.0.2  myserver

这意味着您可以在 Docker 网络中通过该名称 ping 机器。

我强烈建议将这两个参数设置为相同以避免混淆。

示例 docker-compose.yml 文件:

version: '3'
services:
    database-server:
        image: ...
        container_name: database-server
        hostname: database-server
        ports:
            - "xxxx:yyyy"

    web-server:
        image: ...
        container_name: web-server
        hostname: web-server
        ports:
            - "xxxx:xxxx"
            - "5101:4001" # debug port

答案 1 :(得分:2)

hostname:仅设置容器认为自己的主机名的名称。在不寻常的情况下,您会在容器中放入一个外壳,它可能会显示在提示中。它对外面的任何东西都没有影响,通常没有必要进行设置。 (它与主机名(1)基本上具有相同的作用:该命令不会导致主机之外的任何人知道您设置的名称。)

container_name:设置容器运行时的实际名称,而不是让Docker Compose生成它。如果此名称与services:中块的名称不同,则两个名称都可用作DNS名称,用于容器间通信。除非您需要使用docker来管理Compose启动的容器,否则通常也不需要进行设置。

如果您忽略这两个设置,则使用networks:块的名称和一个容器可以访问另一个容器(只要它们在同一个Docker Compose文件中并且具有兼容的services:设置)。移植正在监听的容器中的服务。

version: '3'
services:
  redis:
    image: redis
  db:
    image: mysql
    ports: [6033:3306]
  app:
    build: .
    ports: [12345:8990]
    env:
      REDIS_HOST: redis
      REDIS_PORT: 6379
      MYSQL_HOST: db
      MYSQL_PORT: 3306