CentOS 7上的Docker-DNS在容器内不工作

CentOS 7上的Docker-DNS在容器内不工作,docker,dns,centos,centos7,Docker,Dns,Centos,Centos7,我在CentOS 7机器上安装了Docker,DNS在容器中不工作 因此,如果我在主机上运行nslookup google.com,它将正确解析。但是,如果我运行busybox nslookup google.comdocker容器,我会得到: Server: 8.8.8.8 Address: 8.8.8.8:53 Non-authoritative answer: Name: google.com Address: 142.250.72.46 *** Ca

我在CentOS 7机器上安装了Docker,DNS在容器中不工作

因此,如果我在主机上运行
nslookup google.com
,它将正确解析。但是,如果我运行busybox nslookup google.com
docker容器,我会得到:

Server:         8.8.8.8
Address:        8.8.8.8:53

Non-authoritative answer:
Name:   google.com
Address: 142.250.72.46

*** Can't find google.com: No answer
我已经尝试将默认DNS服务器设置为8.8.8.8,并遵循各种其他故障排除指南,但没有任何效果。值得一提的是,服务器是由hostgator配置的,并且安装了cPanel。我请求hostgator禁用防病毒和防火墙。他们不支持Docker,也无法帮助解决我的问题

非常感谢您的帮助,如果需要更多信息来帮助解决此问题,请告诉我

更新: 这不仅发生在busybox上,也发生在其他平台上。我的主要问题是无法运行从以下Dockerfile生成的映像容器:

FROM python:3.9.5-buster

ENV HOME_PATH=/root
ENV PATH="${HOME_PATH}/.local/bin:${PATH}"
WORKDIR ${HOME_PATH}

COPY requirements.txt cron-job ${HOME_PATH}/
RUN apt-get update
RUN apt-get install -y cron
RUN useradd --create-home service
RUN pip install --user -r ${HOME_PATH}/requirements.txt

COPY . ${HOME_PATH}
RUN ls \
    && mv cron-job /etc/cron.d/cron-job \
    && chmod 0644 /etc/cron.d/cron-job \
    && crontab /etc/cron.d/cron-job \
    && touch ${HOME_PATH}/agl_history.log

CMD cron && tail -f ${HOME_PATH}/agl_history.log
docker-compose.yml:

version: "3.9"
services:
  agl-history:
    depends_on:
        - mariadb
    build: .
    restart: on-failure
    networks:
        - main
  mariadb:
    image: "mariadb:10.5"
    restart: on-failure
    environment:
        MYSQL_ROOT_PASSWORD: ${MARIADB_PASSW}
    ports:
        - 3306:3306
    volumes:
        - /var/lib/docker/volumes/add3-data:/var/lib/mysql
    networks:
        - main
networks:
    main:
        driver: bridge
这项服务运行良好,并在我运行最新Ubuntu的个人计算机上进行了测试

更新2:

因此,评论中的建议通过执行docker run--rm busybox nslookup-type=a google.com

但是,我仍然存在运行上述buster容器的问题。情况就是这样:

Building agl-history
Sending build context to Docker daemon  918.5kB
Step 1/12 : FROM python:3.9.5-buster
 ---> a6a0779c5fb2
Step 2/12 : ENV HOME_PATH=/root
 ---> Using cache
 ---> 7aea834621d4
Step 3/12 : ENV PATH="${HOME_PATH}/.local/bin:${PATH}"
 ---> Using cache
 ---> dc16e6178688
Step 4/12 : WORKDIR ${HOME_PATH}
 ---> Using cache
 ---> 950712b33f21
Step 5/12 : COPY requirements.txt cron-job ${HOME_PATH}/
 ---> Using cache
 ---> 6923c1410731
Step 6/12 : RUN apt-get update
 ---> Using cache
 ---> aa4c4a4d25c4
Step 7/12 : RUN apt-get install -y cron
 ---> Running in 26c7517a05d0
Reading package lists...
Building dependency tree...
Reading state information...
E: Unable to locate package cron
The command '/bin/sh -c apt-get install -y cron' returned a non-zero code: 100
ERROR: Service 'agl-history' failed to build : Build failed

正如您在错误中看到的:

找不到google.com

容器无法访问网络,因此无法找到google

在上面的问题中,我看不到您的
Dockerfile
docker compose.yml
(如果您使用它的话)

但是

第一步,最好使用
docker network create--help

--帮助------>查看容器网络要使用哪些选项:)(根据)

第二步是
公开:
docker文件上的端口(&)

最后:尝试用另一种方式检查容器网络,只需使用
docker run

尝试在您的主映像中使用bash,这是用于检查容器网络的CentOS


由于Dockerfile中的这两行代码,您似乎遇到了缓存问题:

FROM python:3.9.5-buster

ENV HOME_PATH=/root
ENV PATH="${HOME_PATH}/.local/bin:${PATH}"
WORKDIR ${HOME_PATH}

COPY requirements.txt cron-job ${HOME_PATH}/
RUN apt-get update
RUN apt-get install -y cron
RUN useradd --create-home service
RUN pip install --user -r ${HOME_PATH}/requirements.txt

COPY . ${HOME_PATH}
RUN ls \
    && mv cron-job /etc/cron.d/cron-job \
    && chmod 0644 /etc/cron.d/cron-job \
    && crontab /etc/cron.d/cron-job \
    && touch ${HOME_PATH}/agl_history.log

CMD cron && tail -f ${HOME_PATH}/agl_history.log
运行apt-get-update
运行apt get安装-y cron
如中所述,在两个单独的
RUN
指令中使用
apt-get-update
apt-get-install
可能会使您面临缓存问题:

RUN
语句中单独使用
apt-get-update
会导致缓存问题,随后的
apt-get-install
指令会失败。例如,假设您有一个Dockerfile:

FROM python:3.9.5-buster

ENV HOME_PATH=/root
ENV PATH="${HOME_PATH}/.local/bin:${PATH}"
WORKDIR ${HOME_PATH}

COPY requirements.txt cron-job ${HOME_PATH}/
RUN apt-get update
RUN apt-get install -y cron
RUN useradd --create-home service
RUN pip install --user -r ${HOME_PATH}/requirements.txt

COPY . ${HOME_PATH}
RUN ls \
    && mv cron-job /etc/cron.d/cron-job \
    && chmod 0644 /etc/cron.d/cron-job \
    && crontab /etc/cron.d/cron-job \
    && touch ${HOME_PATH}/agl_history.log

CMD cron && tail -f ${HOME_PATH}/agl_history.log
来自ubuntu:18.04的

运行apt获取更新
运行apt get install-y curl
构建图像后,所有层都位于Docker缓存中。假设您稍后通过添加额外的软件包来修改apt get install:

来自ubuntu:18.04的

运行apt获取更新
运行apt get install-y curl nginx
Docker认为初始指令和修改后的指令是相同的,并重用前面步骤中的缓存。因此,
apt get update
不会执行,因为生成使用了缓存版本。由于未运行
apt get update
,因此您的构建可能会获得
curl
nginx
包的过时版本

使用
RUN-apt-get-update&&apt-get-install-y
确保Dockerfile安装最新的软件包版本,无需进一步编码或手动干预。这种技术被称为“缓存破坏”

资料来源:

因此,您最好的选择是:

运行apt-get-update&&apt-get-install-y\
克朗

将每行一个包裹按字母顺序排列在下一行中是很重要的。

这是否回答了您的问题?不幸的是,这不仅仅发生在busybox上。事实上,busybox仅用于说明。我的主要形象是在巴斯特。当我运行该映像的容器时,它无法从internet获取依赖项,因为DNS存在此问题。我将使用此图像的docker文件更新问题OK,但是一旦您将
--dns
标志放置到
docker run
-type=a
-type=aaaa
放置到
nslookup
中,同样的
nslookup
工作是否正常谢谢!你是对的,当我运行docker时,它起作用了——rm busybox nslookup-type=a google.com。我将尝试找出如何使用这些知识来解决在buster容器中安装依赖项的原始问题。如果你有任何建议,请告诉我。我发布了Dockerfile的内容以及有关该问题的更多信息。再次感谢你的帮助!我在Dockerfile中看到的一个错误是,您在两个不同的
运行
指令上执行了
apt get update
apt get install
,如中所述,这可能会导致缓存问题。请运行apt get update&&apt get install-y cron。检查上述步骤将确保您的容器上有一个健康的网络感谢回复,但主要问题是我甚至无法启动容器,因为它无法安装必要的依赖项。您可以在更新部分看到我的Dockerfile和compose。在我的个人Ubuntu机器上,从docker compose up开始的服务运行良好。nslookup的问题是我在调试启动buster的原始问题时发现的container@itshosyn
来自python:3.9.5-buster
>。CentOS是OP的主机操作系统。那么对于这个特定的错误,你看到了吗?这解决了我的问题!非常感谢你!
Building agl-history
Sending build context to Docker daemon  918.5kB
Step 1/12 : FROM python:3.9.5-buster
 ---> a6a0779c5fb2
Step 2/12 : ENV HOME_PATH=/root
 ---> Using cache
 ---> 7aea834621d4
Step 3/12 : ENV PATH="${HOME_PATH}/.local/bin:${PATH}"
 ---> Using cache
 ---> dc16e6178688
Step 4/12 : WORKDIR ${HOME_PATH}
 ---> Using cache
 ---> 950712b33f21
Step 5/12 : COPY requirements.txt cron-job ${HOME_PATH}/
 ---> Using cache
 ---> 6923c1410731
Step 6/12 : RUN apt-get update
 ---> Using cache
 ---> aa4c4a4d25c4
Step 7/12 : RUN apt-get install -y cron
 ---> Running in 26c7517a05d0
Reading package lists...
Building dependency tree...
Reading state information...
E: Unable to locate package cron
The command '/bin/sh -c apt-get install -y cron' returned a non-zero code: 100
ERROR: Service 'agl-history' failed to build : Build failed