如何在docker compose中设置主机名?

如何在docker compose中设置主机名?,docker,docker-compose,Docker,Docker Compose,在我的docker compose.yml文件中,我有以下内容。但是,容器不会获取主机名值。有什么想法吗 dns: image: phensley/docker-dns hostname: affy domainname: affy.com volumes: - /var/run/docker.sock:/docker.sock 当我检查容器中的主机名时,它没有拾取affy这似乎工作正常。如果我将您的配置放入一个文件: $ cat > compose.yml &l

在我的
docker compose.yml
文件中,我有以下内容。但是,容器不会获取主机名值。有什么想法吗

dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock

当我检查容器中的主机名时,它没有拾取
affy

这似乎工作正常。如果我将您的配置放入一个文件:

$ cat > compose.yml <<EOF
dns:
  image: phensley/docker-dns
  hostname: affy
  domainname: affy.com
  volumes:
    - /var/run/docker.sock:/docker.sock
EOF
然后检查容器内的主机名,一切似乎正常:

$ docker exec -it stack_dns_1 hostname
affy.affy.com

根据docker文档:

我简单地说
主机名:
在我的docker文件中

例如:


容器lb01将
at-lb01
作为主机名。

我发现在使用
docker run
时,主机名对其他容器不可见。事实证明,这是一个(可能更多的是一个已知的特性),讨论的一部分是:

我们可能应该在文档中添加关于使用主机名的警告。我认为它很少有用

就容器网络而言,分配主机名的正确方法如下:

不幸的是,
docker run
仍然无法使用此功能。解决方法是为容器指定一个名称:

docker-compose run --name alias1 some-service
然后可以从其他容器ping出
alias1

更新:正如@grilix所指出的,您应该使用
docker compose run——使用别名
使定义的别名可用。

我需要旋转以使kdc工作,并且必须给它一个主机名,否则它将无法运行。 最终对我有效的是在compose中设置
HOSTNAME
env变量:

version: 2
services:
  freeipa:
    environment:
      - HOSTNAME=ipa.example.test
现在工作:

docker exec -it freeipa_freeipa_1 hostname
ipa.example.test

我发现的最简单的方法就是在
docker compose.yml
中设置容器名称,请参阅文档。适用于docker compose v1+。它适用于容器到容器,而不是从主机到容器

services:
  dns:
    image: phensley/docker-dns
    container_name: affy
现在,您应该能够使用容器名称从其他容器访问
affy
。我必须在开发环境中为多个redis服务器执行此操作

注意只要不需要扩展,该解决方案就可以工作。例如一致的单个开发人员环境。

从开始,您只需使用
主机名
键:

version: "3.0"
services:
  dns:
    hostname: your-name

对于docker compose版本:“3.4”

这对我很有用:

services:
    my-service:
        hostname: my_host_name
不需要使用dns。只需使用主机名即可。

本期仍在这里发行:



您可以设置主机名,但无法从其他容器访问。因此它基本上是无用的。

您使用的是什么版本的Compose?可能值得注意的是,如果未指定
版本:
,则docker Compose假定文件格式为v1;查看您使用的Compose版本?此格式在最新版本的docker Compose中不起作用。YML文件很挑剔;你确定这是dns的正确格式吗?YML文件并没有那么挑剔。“不起作用”是什么意思?根据,主机名和域名都是有效的docker compose.yml选项。更新:刚刚测试过,仍然可以正常工作(docker compose版本1.4.2,docker版本1.8.2)。有没有办法在docker环境之外公开此主机名?如果主机可以通过其dns名称访问docker容器,那就太好了。这是可能的,而且可能值得提出自己的问题。如果你搜索“docker dns”,你会发现几个相关的结果;首先看看有什么。如果docker compose文件中有多个容器,您会为每个容器设置主机名吗?这似乎效率很低?如果您需要容器的知名名称,这是一个可行的解决方案。这正是我需要的:您可以在这里找到文档:我遇到了一个问题,无法从其他容器按名称访问容器。你是整个互联网上唯一一个提出这个问题的人。。我已经在谷歌上搜索了20个小时了!数以百万计的开发者似乎在使用Docker,但没有人知道如何给一个盒子起一个简单的名字,甚至连官方文档都不知道。非常感谢:)以防万一,现在我们可以使用
——使用别名
docker compose run
。这将避免在
运行
命令上硬编码别名这里只是一个愚蠢的问题,当我们执行
docker compose运行时——使用别名1某个服务
我们是否需要在末尾添加该服务部分?如果是,这是我需要为我的项目找到的特定服务的占位符吗?或者只是一个随机的字符串名…?对我来说,使用slim,会产生一个对容器的实际主机名没有任何影响的HOSTNAME环境变量。虽然这可能对您使用的容器有效,但environment指令只向容器公开变量。仍然要由容器使用设置的值来执行某些操作。在许多情况下,它可能不会起任何作用。公开一个env var与容器的主机名无关,它们是两个独立的领域。在
Compose 3.7
中,从同一堆栈的另一个服务容器中查看数据库服务主机名的唯一方法是将服务命名为主机名。使用
主机名:
属性失败。使用环境HOSTNAME=构造也失败。另一个同样有效的解决方案,是使用
foz
解决方案中描述的
aliases
属性。这很有效,但有点混乱-我现在将
container\u name
hostname
设置为相同的值,以实现我所需要的
container\u name
的一个问题是它对本地主机系统是全局的,因此尝试运行多个堆栈时遇到冲突,并且两个不同的服务具有相同的
容器\u名称
。执行此操作时,终端响应“服务我的服务既没有指定映像,也没有指定生成上下文。必须至少提供一个。”@klewis如果您读取错误消息,请
services:
  dns:
    image: phensley/docker-dns
    container_name: affy
version: "3.0"
services:
  dns:
    hostname: your-name
services:
    my-service:
        hostname: my_host_name