【问题标题】:docker-compose.yml container_name and hostnamedocker-compose.yml 容器名和主机名
【发布时间】:2019-08-26 14:29:30
【问题描述】:

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

此外,当我在服务下明确写入hostname 时,它是否会覆盖service name 表示的主机名?

【问题讨论】:

标签: docker docker-compose


【解决方案1】:

您可以在 docker-compose up 期间自定义镜像名称以构建和容器名称,您需要在 docker-compose.yml 文件中提及如下。 它将创建一个具有自定义名称的图像和容器。

version: '3'
services:
  frontend_dev:
    stdin_open: true
    environment:
      - CHOKIDAR_USEPOLLING=true
    build:
      context: .
      dockerfile: Dockerfile.dev
    image: "mycustomname/sample:v1"
    container_name: mycustomname_sample_v1
    ports:
      - '3000:3000'
    volumes:
      - /app/node_modules
      - .:/app

【讨论】:

    【解决方案2】:

    最简单的答案如下:

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

    主机名:容器的主机名。实际上,您在此处定义的名称将转到 /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
    

    【讨论】:

    • hostname 仅写入一个容器的主机文件,该容器由服务运行。它不会写入使用 docker compose 运行的每个服务的主机文件中。你通过container_name ping 机器,而不是hostname
    • 对于那些想知道的人,您无需设置container_namehostname 即可引用您的容器,例如在URL 中。您可以简单地在 docker-compose.yml 文件中使用服务的块名称,即使容器的实际名称(例如显示为 docker ps -a)将是自动生成的名称。
    【解决方案3】:

    hostname: 只是设置容器认为自己的主机名是什么。在不寻常的情况下,您在容器内有一个外壳,它可能会显示在提示符中。它对外面的任何东西都没有影响,而且通常没有设置它的意义。 (它与 hostname(1) 的效果基本相同:该命令不会导致主机之外的任何人知道您设置的名称。)

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

    如果您忽略这两个设置,一个容器可以使用 services: 块的名称和内部服务的端口来访问另一个容器(前提是它们在同一个 Docker Compose 文件中并且具有兼容的 networks: 设置)容器正在监听。

    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
    

    【讨论】:

    • container_name: <mycontainer> 的好处是您在执行docker ps 或列出容器或其他操作时拥有漂亮的容器名称。否则,container_name 会自动分配一个名称,例如 <docker_compose_folder>_<service_name>_<incrementing_number_of_containers_with_same_name>
    • 这意味着必须小心不要用 db、mysql、app 等通用名称覆盖 container_name。我通常在 .env 中定义一个 PREFIX 变量并像这样使用它:container_name: ${PREFIX}-db.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多