Как получить правильные данные после изменения контейнера и перезапустить контейнер в Docker - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть один образ докера с именем centos7_hadoop, я запускаю эту команду создания контейнера

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 голосов
/ 29 ноября 2018

Вы должны научиться использовать Dockerfiles для создания пользовательских образов .Система 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 не считаются лучшими практиками: они ведут к хрупкому, жесткомудля воспроизведения настроек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...