docker-compose.yml 容器名称和主机名

Yug*_*ngh 24 docker docker-compose

什么是使用container_namedocker-compose.yml文件?我可以将它用作文件中hostname的服务名称吗docker-compose.yml

此外,当我hostname在服务下明确写入时,它是否会覆盖由service name?

Dav*_*aze 43

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

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

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

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

  • `container_name: <mycontainer>` 的好处是,在执行 `docker ps` 或列出容器或其他操作时,您可以拥有漂亮的容器名称。否则,会自动为 `container_name` 分配一个名称,例如 `<docker_compose_folder>_<service_name>_<incrementing_number_of_containers_with_same_name>`。 (4认同)
  • 这意味着必须小心,不要用 db、mysql、app 等通用名称覆盖 `container_name`。我通常在 `.env` 中定义一个 `PREFIX` 变量,并像这样使用它:`container_name: ${PREFIX }-db`。 (2认同)

zap*_*pee 7

最简单的答案如下:

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

这意味着您可以在 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
Run Code Online (Sandbox Code Playgroud)

  • “hostname”仅写入一个容器(由服务运行的容器)的主机文件。它不会写入使用 docker compose 运行的每个服务的主机文件中。您可以通过“容器名称”而不是“主机名”来 ping 机器。 (4认同)