CentOS 7上的Docker-DNS在容器内不工作
我在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
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
*** 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