如何在容器hosts文件中添加解析条目,用于临时测试?
docker ps -q > crt
docker ps --format '{{.ID}}' > crt
while read ctr;do ResolvConfPath=`docker inspect $ctr --format "{{ .HostsPath }}" `; echo '172.16.111.92 www.example.com' >> $ResolvConfPath; done < <(docker ps --format '{{.ID}}' )
docker exec -it 033bf5013226 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 033bf5013226
172.16.111.92 www.example.com
这几条命令涉及到 Docker 容器的操作和文件系统的修改。我们逐条解析它们:
-
docker ps -q > crt
这个命令的作用是列出所有正在运行的 Docker 容器的 ID,并将这些 ID 存储到一个名为
crt
的文件中。-
docker ps -q
:docker ps
命令列出正在运行的容器。-q
选项表示只输出容器 ID。 -
> crt
: 将docker ps -q
的输出重定向到名为crt
的文件中。这样,所有容器 ID 都会被保存到crt
文件中,每个 ID 一行。
-
-
while read ctr; do ResolvConfPath=$(docker inspect $ctr --format "{{ .HostsPath }}"); echo '172.16.111.92 www.example.com' >> $ResolvConfPath; done < <(docker ps --format '{{.ID}}')
这条命令是一个循环,读取每一个容器的 ID,然后对每个容器执行一些操作。具体步骤如下:
-
while read ctr; do ... done < <(docker ps --format '{{.ID}}')
:-
docker ps --format '{{.ID}}'
: 列出所有正在运行的容器的 ID,并以每个 ID 一行的格式输出。这些 ID 被传递给while read ctr
循环。 -
while read ctr; do ... done
: 读取每个容器 ID,并将其赋值给变量ctr
,然后执行循环体内的命令。
-
-
ResolvConfPath=$(docker inspect $ctr --format "{{ .HostsPath }}")
:-
docker inspect $ctr --format "{{ .HostsPath }}"
: 通过docker inspect
命令获取指定容器ctr
的配置。--format "{{ .HostsPath }}"
选项用来提取容器的HostsPath
。这个路径是容器内的/etc/hosts
文件的路径,通常是/var/lib/docker/containers/<container-id>/hosts
。 -
ResolvConfPath=$(...)
: 将提取到的路径存储在变量ResolvConfPath
中。
-
-
echo '172.16.111.92 www.example.com' >> $ResolvConfPath
:- 将
172.16.111.92 www.example.com
这行文本追加到ResolvConfPath
指定的文件中,即容器的/etc/hosts
文件中。
- 将
-
总结
这些命令的总体功能是:
- 列出所有正在运行的 Docker 容器的 ID 并保存到
crt
文件中。 - 对每个正在运行的容器,获取其
/etc/hosts
文件的路径。 - 向每个容器的
/etc/hosts
文件中追加一行172.16.111.92 www.example.com
。
这种操作通常用于在容器内动态添加 DNS 记录。需要注意的是,这种直接操作容器文件系统的做法可能会有一定的风险,可能会导致容器的不稳定或数据损坏,尤其是在容器重启后更改可能会丢失。
# docker ps --format '{{.ID}}'
033bf5013226
7a28788b0947
1a26fb4e808d
81baca76c094
4b7ccbf15559
# docker ps -q
033bf5013226
7a28788b0947
1a26fb4e808d
81baca76c094
4b7ccbf15559
# docker inspect 033bf5013226 --format "{{ .HostsPath }}"
/var/lib/docker/containers/033bf5013226aca0f75115fc702053109f872293cd5d18facded74b026907bb0/hosts
# cat /var/lib/docker/containers/033bf5013226aca0f75115fc702053109f872293cd5d18facded74b026907bb0/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 033bf5013226
这些输出展示了如何通过 Docker 命令获取容器的 /etc/hosts
文件路径,并查看其内容。具体解读如下:
-
docker ps -q
输出了正在运行的 Docker 容器的 ID 列表:
033bf5013226 7a28788b0947
这些 ID 表示两个正在运行的容器。
-
docker inspect 033bf5013226 --format "{{ .HostsPath }}"
通过
docker inspect
命令获取容器 ID 为033bf5013226
的容器的HostsPath
,即容器内部/etc/hosts
文件的路径:/var/lib/docker/containers/033bf5013226aca0f75115fc702053109f872293cd5d18facded74b026907bb0/hosts
这个路径指向 Docker 主机上存储该容器
/etc/hosts
文件的实际位置。 -
cat /var/lib/docker/containers/033bf5013226aca0f75115fc702053109f872293cd5d18facded74b026907bb0/hosts
显示了容器
033bf5013226
的/etc/hosts
文件内容:127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 033bf5013226
这个文件包括:
-
127.0.0.1 localhost
: 将127.0.0.1
映射到localhost
,表示本地回环地址。 -
::1 localhost ip6-localhost ip6-loopback
: IPv6 的回环地址和localhost
的映射。 -
fe00::0 ip6-localnet
,ff00::0 ip6-mcastprefix
,ff02::1 ip6-allnodes
,ff02::2 ip6-allrouters
: IPv6 地址的特殊目的地。 -
172.17.0.3 033bf5013226
: 容器的内部 IP 地址172.17.0.3
与容器 ID033bf5013226
的映射。
-
这些信息显示了容器内部的 DNS 和主机名映射。
容器中的 /etc/hosts 不是一个只读文件吗?
你实际上是向容器的/etc/hosts
文件中添加条目,因为/etc/hosts
是一个容器内部的文件,容器运行时会用它来解析主机名。Docker容器的/etc/hosts
文件位于主机系统中,与容器文件系统相隔离,但Docker允许在运行时直接操作这些文件。通过这种方式,容器可以即时更新DNS解析记录,适用于临时修改网络配置。
在运行的容器中,/etc/hosts
文件是可读写的,不是只读的。虽然Docker容器的/etc/hosts
文件是由Docker管理和自动生成的,但在运行时可以对其进行写操作。
你的脚本通过主机的文件路径将内容追加到该文件中,这种方法可以实现动态修改容器内部的/etc/hosts
文件。
网友评论