如何在更改容器并在Docker中重新启动容器后获取正确的数据

时间:2018-11-29 00:41:54

标签: docker

我有一个名为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小时前! 那么,重新启动容器后如何获取正确的数据?

1 个答案:

答案 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

然后,不同的容器将能够使用容器名称hadoop1hadoop2作为DNS名称。 (请记住,如果您删除并重新创建容器,它们的IP地址可能会更改,并且删除和重新创建容器是很常规的事情。)这使您不必直接担心这些IP地址可能是什么。

如果这些IP地址来自其他地方,请考虑设置DNS服务器,这样您就不必手动维护它们。如果您确实必须使用/etc/hosts,则Docker实际上可以相当直接地控制其内容。您可以使用docker run --add-host在此处注入值。图像中的/etc/hosts文件将在运行时被忽略并覆盖。

根据我的经验,docker commit或将值推入/etc/hosts都不被视为最佳实践:它们会导致脆弱,难以复制的设置。