我有一个名为centos7_hadoop的docker镜像,我运行此命令create container
docker run --network hadoop-network --name hadoop1 --hostname hadoop1 -d -P centos7_hadoop
运行它时,我感到非常高兴,好像我输入了hadoop1这样的新主机
docker exec -it hadoop1 /bin/bash
所以我想存储我的足迹,我在/ etc / hosts中写了一行。 之前
172.18.0.4 hadoop1
之后
172.18.0.4 hadoop1
172.18.0.2 hadoop0
我很高兴,看来我成功了!但是当我重新启动容器时,我丢失了数据,它只是
172.18.0.4 hadoop1
所以我将更改提交给centos7_hadoop:hadoop1
[root@hadoop1 /]# vi /etc/hosts //add one line 172.18.0.2 hadoop0
[root@hadoop1 /]# exit
exit
[lalala@localhost ~]$ docker commit a5e2c4a0a09f centos7_hadoop:hadoop1
我重新启动容器,我想我会飞。但是我失败了。我用这个命令输入容器
[lalala@localhost ~]$ docker run -it centos7_hadoop:hadoop1 /bin/bash
[root@8ef3b77807d6 /]# 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 8ef3b77807d6
似乎我输入了一个具有新主机名的新容器!我不喜欢它,我要输入主机名为hadoop1的容器!所以我尝试
[lalala@localhost ~]$ docker exec -it hadoop1 /bin/bash
[root@hadoop1 /]# cat /etc/hosts
...
172.18.0.4 hadoop1
可以预见,我失败了。我检查了容器
a5e2c4a0a09f c143e0f071c1 "/usr/sbin/sshd -D" 15
hours ago Up About a minute 0.0.0.0:32779->22/tcp
hadoop1
15小时前! 那么,重新启动容器后如何获取正确的数据?
答案 0 :(得分:1)
您应该学习如何use Dockerfiles to build custom images。 Dockerfile系统非常简单:如果记下启动容器后对容器所做的更改,并将RUN
放在每一行之前,则您很接近正确的Dockerfile。有了图像后,就可以docker build
在需要时使用该图像,在出现安全更新或其他更改时进行更新,将其置于相对安全的源代码控制中,并且通常不必担心会丢失自定义手形,内置图像。
您列出的IP地址看起来像其他容器的IP地址一样可疑。切勿直接查看这些内容!如果您从同一个docker-compose.yml
文件启动多个容器,或者直接创建自定义Docker网络并在其上启动容器
docker network create hadoop
docker run -d --name hadoop1 --net hadoop centos7_hadoop:hadoop1
docker run -d --name hadoop2 --net hadoop centos7_hadoop:hadoop1
然后,不同的容器将能够使用容器名称hadoop1
和hadoop2
作为DNS名称。 (请记住,如果您删除并重新创建容器,它们的IP地址可能会更改,并且删除和重新创建容器是很常规的事情。)这使您不必直接担心这些IP地址可能是什么。
如果这些IP地址来自其他地方,请考虑设置DNS服务器,这样您就不必手动维护它们。如果您确实必须使用/etc/hosts
,则Docker实际上可以相当直接地控制其内容。您可以使用docker run --add-host
在此处注入值。图像中的/etc/hosts
文件将在运行时被忽略并覆盖。
根据我的经验,docker commit
或将值推入/etc/hosts
都不被视为最佳实践:它们会导致脆弱,难以复制的设置。