Docker如何用/etc/resolv.conf中定义的nameservers启动容器

10 人关注

Here is my Dockerfile

FROM javamachine_0.1.2
MAINTAINER Meiram
RUN /report/report.sh start
ENV LANG C.UTF-8 ENV LANGUAGE C.UTF-8 ENV LC_ALL C.UTF-8
RUN echo "nameserver 192.168.1.100" > /etc/resolv.conf
COPY resolv.conf /etc/resolv.conf
EXPOSE 9090

在创建容器指令时,docker run --dns也不改变/etc/resolv.conf中的条目。

如何永久地改变/etc/resolv.conf中的条目?

1 个评论
看一看 my question 和答案。
linux
docker
dockerfile
nameservers
Meiram Chuzhenbayev
Meiram Chuzhenbayev
发布于 2016-04-28
6 个回答
Gerd
Gerd
发布于 2022-05-25
已采纳
0 人赞同

如果你使用docker-compose,你可以在docker-compose.yml中简单地添加你的dns-服务器

  my-app:
     build: my-app
       - 10.20.20.1  # dns server 1
       - 10.21.21.2  # dns server 2
     dns_search: ibm-edv.ibmnet.int

see https://bitbucket.org/snippets/mountdiablo/9yKxG/docker-compose-reference-yaml-file-with

harunyardimci
harunyardimci
发布于 2022-05-25
0 人赞同

如果你使用-dns,你可能需要删除这些行。

RUN echo "nameserver 192.168.1.100" > /etc/resolv.conf
COPY resolv.conf /etc/resolv.conf

试着把这几行也换一下。COPY命令将覆盖之前的命令。

I rebuild the image with Dockerfile. I wiped 2 line RUN echo "nameserver 192.168.1.100" > /etc/resolv.conf COPY resolv.conf /etc/resolv.conf docker run --dns 8.8.8.8 test/test_img_0.1.2 But container can not to start.
我不知道,也许当我创建容器时,docker run --dns 8.8.8.8 -td ubunu:latest 这很好。 但我需要用现有的网络和静态IP来创建容器 docker run --net my_net --dns 8.8.8.8 --ip 10.10.10 -td ubuntu:latest /etc/resolv.conf条目是nameserver 127.0.0.11 options ndots:0
我想说的是:所有的docker官方资源(和非官方资源)似乎都劝人不要直接篡改resolv.conf--docker引擎应该负责管理它(/etc/hosts也是如此)。我相信你可以在docker eninge或容器运行时使用 --dns 选项来实现上述目的。
Meiram Chuzhenbayev
Meiram Chuzhenbayev
发布于 2022-05-25
0 人赞同

我找到了答案

当你需要用默认网络设置(172.0.0.x)创建一个容器时

The key --dns is working. 但对用户定义的网络不起作用 --net some_name_of_your_network

所以如果你需要创建容器,你可以在/etc/hosts中定义主机名

使用此命令

docker run --net my_net --ip 192.168.1.x --add-host webserver:192.168.1.100 --add-host mysqlserver:192.168.1.x -td someimage

但这个解决方案对我来说是不可接受的。因为我需要编辑/etc/resolv.conf

cjnygard
cjnygard
发布于 2022-05-25
0 人赞同

See https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/ 了解更多细节。

你需要在你的docker命令行中添加以下内容,而不是所有的 --add-host 选项(假设你的主机可以通过你的dns进行解析)。

--dns=192.168.1.100

基于你正在运行多个服务的事实,如果你的webserver和mysqlserver也是docker容器,你可能想通过docker-compose来配置容器的集合。 参见https://docs.docker.com/compose/overview/了解更多细节。

如果你需要设置多个名称服务器怎么办?例如,我正试图设置两个。
事实证明,答案只是重复旗帜,对不起。请看 Github .在这个例子中, --dns=192.168.1.100 --dns=192.168.1.101 会起作用。
Shakiba Moshiri
Shakiba Moshiri
发布于 2022-05-25
0 人赞同

DNS services

--dns IP

一个DNS服务器的IP地址。要指定多个DNS服务器,请使用多个-dns标志。如果容器不能到达你指定的任何一个IP地址,就会添加谷歌的公共DNS服务器8.8.8.8,这样你的容器就可以解析互联网域名。

如果我们把IP地址传给 --dns 选项,那么 /etc/resolv.conf 的名字服务器仍然和以前一样;因为Docker使用默认的嵌入式DNS服务器,并且 --dns 的值是为该网络设置的。

Example

我们可以这样运行CoreDNS。

docker container run --rm -it -v  $PWD:/root/ --network mybr --ip 10.11.12.244  coredns/coredns:latest -dns.port 53 -conf /root/coredns

因此,我们的DNS服务器是在--ip 10.11.12.244上启动和运行的。

同时,我们可以在网络上运行另一个容器(自定义定义的)并检查一些记录。

docker container run --rm -it --network mybr --ip 10.11.12.11 --dns 10.11.12.244   nicolaka/netshoot bash

因此,通过在该容器内传递--dns 10.11.12.244,我们仍然看到默认的,这是不正确的。

bash-5.1# cat /etc/resolv.conf 
nameserver 127.0.0.11
options ndots:0
bash-5.1# dig node.examp1e.ir @10.11.12.244 +nocmd +nostats +nocomments
;node.examp1e.ir.       IN  A
node.examp1e.ir.    3600    IN  A   10.11.12.10
examp1e.ir.     3600    IN  NS  a.ns.examp1e.ir.
examp1e.ir.     3600    IN  NS  b.ns.examp1e.ir.
bash-5.1#
bash-5.1#
bash-5.1#
bash-5.1# dig node.examp1e.ir  +nocmd +nostats +nocomments
;node.examp1e.ir.       IN  A
node.examp1e.ir.    3600    IN  A   10.11.12.10
examp1e.ir.     3600    IN  NS  a.ns.examp1e.ir.
examp1e.ir.     3600    IN  NS  b.ns.examp1e.ir.
bash-5.1# 

这里是examp1e.ir的配置和区域。

examp1e.ir {
    file /root/db.10.11.12.0
    errors

而且db.10.11.12.0

$TTL    3600
@   IN  SOA a.ns.examp1e.ir. webmaster.examp1e.ir. (
                  3     ; Serial
             604800     ; Refresh
              86400     ; Retry
            2419200     ; Expire
             604800 )   ; Negative Cache TTL
@   IN  NS  a.ns.examp1e.ir.
@   IN  NS  b.ns.examp1e.ir.
a.ns    IN  A   10.11.12.244
b.ns    IN  A   10.11.12.244
node        IN  A  10.11.12.10
nginx       IN  A  10.11.12.11
nginx       IN  TXT "this is nginx design pattern"

替换代码12】是一个自定义定义的网络

docker network ls | grep mybr
02884d702083   mybr                     bridge    local

and ... inspect mybr

    "IPAM": {
        "Driver": "default",
        "Options": {},
        "Config": [
                "Subnet": "10.11.12.0/24",
                "Gateway": "10.11.12.1"