我有以下简化的docker-compose文件:
version: '2' services: test.base: container_name: test.base image: docker.pnet.ch/r-base:latest restart: on-failure networks: - mynet dns: 192.168.198.2 dns_search: - pext.ch - pnet.ch networks: mynet: driver: bridge driver_opts: com.docker.network.enable_ipv4: "true" ipam: driver: default config: - subnet: 192.168.198.0/24 gateway: 192.168.198.1
有了这个,我希望在容器/etc/resolv.conf中有以下条目:
search pext.ch pnet.ch nameserver 192.168.198.2
但相反,我有以下内容:
search pext.ch pnet.ch nameserver 127.0.0.11 options ndots:0
当我使用docker run使用--dns 192.168.199.2手动启动容器时/etc/resolv.conf包含一个带有给定ip地址的名称服务器。
我的docker-compose文件有什么问题,还是docker-compose中的错误?
我在RHEL和docker-compose 1.9.0上使用docker版本1.10.3
Docker中的网络编写文件格式v2它是different from version 1,我认为这是实际问题。令人困惑的是,docker run ...
命令有效,而docker-compose ...
则没有。我遇到了同样的问题。
我发现Docker Compose v2为docker-compose.yml
文件中定义的容器创建了一个用户定义的网络,而docker run ...
默认使用主机上名为docker0
的桥接网络。此外,使用自定义网络docker使用embedded DNS server(即127.0.0.11
)。文档说:
如果嵌入式DNS服务器无法解析来自容器的名称解析请求,则嵌入式DNS服务器将使用通过
--dns
选项传递的IP地址转发DNS查询。这些--dns
IP地址由嵌入式DNS服务器管理,不会在容器的/etc/resolv.conf
文件中更新。
我想最后一行回答了你的问题。无论如何,你的容器应该正确解析,不是吗?
我使用volumes:
来解决这个问题。在你的情况下:
version: '2'
services:
test.base:
container_name: test.base
image: docker.pnet.ch/r-base:latest
restart: on-failure
networks:
- mynet
volumes:
- ./resolv.conf:/etc/resolv.conf
./resolv.conf
文件包含您所期望的内容:
search pext.ch pnet.ch
nameserver 192.168.198.2
这里假设resolv.conf
文件与docker-compose文件位于同一文件夹中。
如前所述,resolv.conf
并没有因为某些原因而改变,所以我发现了docker-compose
的肮脏黑客:在resolv.conf
期间改变docker build
。
您应该在命令的开头进行文件更改,并且在结束之前保持不变。
像这样:
RUN echo "nameserver 10.100.1.13" > /etc/resolv.conf && apt update
我知道这远非良好的编码实践,但我认为它比从外部世界安装/etc/resolf.conf
更优雅。
我在这个存储库中运行了ubuntu版本的docker(docker.io 18.06.0)。我使用apt-get install docker.io删除了该版本的安装docker.io。所以现在我有这个版本:
Client:
Version: 17.12.1-ce
API version: 1.35
Go version: go1.10.1
Git commit: 7390fc6
Built: Wed Apr 18 01:23:11 2018
OS/Arch: linux/amd64
Server:
Engine:
Version: 17.12.1-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.10.1
Git commit: 7390fc6
Built: Wed Feb 28 17:46:05 2018
OS/Arch: linux/amd64
Experimental: false
使用docker-compose运行的容器没有按预期配置dns的文件resolv.conf
,但每个容器都可以访问Internet。我认为改变可以解决我的问题。