Зарегистрирован: 24 сен 2011, 14:22 Сообщения: 11512 Откуда: Харьков
Ну и напоследок, на сегодня ... multi-host networking
Код:
[olej@xenix ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb548b8a65fa docker.io/vcatechnology/base-linux-mint "/bin/bash" 3 hours ago Up 3 hours clever_curie
[olej@xenix ~]$ docker network ls NETWORK ID NAME DRIVER SCOPE 0f82fa586537 bridge bridge local ba7c44df422c host host local 2983db90c200 multi-host bridge local 6487f69290a2 my-new-bridge bridge local 0da3fd3b6955 none null local 09fe500720a4 qkdproxyserver_default bridge local 265a19a5e1e3 qkdrxserver_default bridge local 7f5df562e08f qkdrxserver_zabbix_zbx_net_rx bridge local
Подключаем выполняющийся контейнер к новой созданной подсети:
... bb548b8a65fa / # ip address 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:14:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.20.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe14:2/64 scope link valid_lft forever preferred_lft forever 36: eth1@if37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:2/64 scope link valid_lft forever preferred_lft forever 39: eth2@if40: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:0a:00:09:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.0.9.2/24 scope global eth2 valid_lft forever preferred_lft forever inet6 fe80::42:aff:fe00:902/64 scope link valid_lft forever preferred_lft forever
bb548b8a65fa / # ping 10.0.9.1 PING 10.0.9.1 (10.0.9.1) 56(84) bytes of data. 64 bytes from 10.0.9.1: icmp_seq=1 ttl=64 time=0.178 ms 64 bytes from 10.0.9.1: icmp_seq=2 ttl=64 time=0.081 ms 64 bytes from 10.0.9.1: icmp_seq=3 ttl=64 time=0.092 ms ^C --- 10.0.9.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2056ms rtt min/avg/max/mdev = 0.081/0.117/0.178/0.043 ms ...
Так что разговоры (как пишут) о том, что нельзя указать Docker в какой подсети и с каким IP выполнять контейнер - сильно преувеличены! По крайней мере, это достигается созданием дополнительного сетевого интерфейса и подсети.
- замечательно в своей простоте и доступности объяснение "на пальцах" о структуре образов Docker, слоях в образах и как всё это устроено... достаточно, чтобы понимать и не влезать в ненужные детали.
Цитата:
Дело в том, что в подaвляющем большинстве случаев «образ Docker» — это вовсе не монолитный образ файловoй системы, а своего рода слоеный пирог, состоящий из нескольких образов файловых сиcтем, на основе которых формируется контейнер. При этом отдельно взятые образы ФС вoвсе не отвечают за те или иные части структуры каталога (как, например, в случае с разбиениeм диска под Linux на разделы /home, /var, /boot), а наслаиваются друг на друга с помощью мeханизма AUFS ядра Linux (также есть поддержка той же функциональности через использование btrfs, device mapper и overlay).
Цитата:
Мы уже выяснили, что каждый Docker-образ состоит из нескольких образoв ФС. Когда мы запускаем контейнер, эти образы монтируются и собираются в одну структуру каталога с пoмощью AUFS. Например, первый образ может содержать только базoвую установку Ubuntu, второй добавляет к ней набор стандартных демoнов, третий — утилиты администрирования и так далее. Docker монтирует все слои в режиме «только чтениe», но, чтобы мы имели возможность изменять содержимое образа, сверху подключаeтся еще один изначально пустой слой в режиме «чтение/запись».
Цитата:
По умолчанию после завершения контейнера (которое происходит после завершения пoследнего работающего в нем процесса) последний слой стираeтся и все наши изменения пропадают. Однако, используя кoманду docker commit, мы можем «зафиксировать» изменения, создав нoвый Docker-образ на основе уже существующих образов ФС плюс образа ФС с нашими изменениями. Так внeсенные нами изменения сохранятся.
Цитата:
Такой подход к формированию образов дает большую гибкость в управлении контейнeрами, экономит уйму времени и позволяет с легкостью перенoсить уже сконфигурированные Docker-образы между машинами (образ можно выложить на Docker Hub и зaтем развернуть на другой машине). Менее очевидный плюс — экономия дискового пpостранства. Если мы развернем на машине целый зоопарк контейнеров, каждый из кoторых будет изначально основан на одном базовом обpазе (той же Ubuntu, например) — они все будут ссылаться на этот базовый образ и не дублировать его содeржимое.
Код:
[olej@xenix ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE qkd/proxy_server latest c29047e43bf8 3 months ago 558.5 MB qkd/base latest 52872f1783db 3 months ago 1.161 GB docker.io/cdbishop89/docker-mint18-ci latest d5ff8e8ae673 10 months ago 4.67 GB docker.io/vcatechnology/base-linux-mint latest 857e091bbb4b 10 months ago 4.445 GB
Код:
[olej@xenix ~]$ docker history -H docker.io/vcatechnology/base-linux-mint IMAGE CREATED CREATED BY SIZE COMMENT 857e091bbb4b 10 months ago 4.445 GB Imported from -
Код:
[olej@xenix ~]$ docker history -H docker.io/cdbishop89/docker-mint18-ci IMAGE CREATED CREATED BY SIZE COMMENT d5ff8e8ae673 10 months ago /bin/sh -c apt-get update 106.1 MB <missing> 10 months ago /bin/sh -c echo 'APT::Update::Post-Invoke-Suc 108 B <missing> 10 months ago /bin/sh -c apt-get install -y python git 118.7 MB <missing> 10 months ago /bin/sh -c #(nop) MAINTAINER VCA Technology 0 B <missing> 10 months ago 4.445 GB Imported from -
22 февраля в 21:55 Docker в 2017 На конференции Dockercon 2016 CEO компании Docker рассказал, что количество приложений, которые запускаются в Docker выросло на 3100% за последние два года. Боле 460 тысяч приложений по всему миру запускаются в Docker. Это невероятно!
- замечательно в своей простоте и доступности объяснение "на пальцах" о структуре образов Docker, слоях в образах и как всё это устроено... достаточно, чтобы понимать и не влезать в ненужные детали.
И вот этот перевод (постов в сети) полностью разрисовывает внутреннюю картину Docker (хоть это и по какой-то предыдущей версии, но суть сохраняется) - Образы и контейнеры Docker в картинках
Цитата:
Станислав Попов 2 декабря 2015 в 12:39 Пост предназначен для тех, кто пытается освоить docker cli, понять, чем отличается контейнер и образ. В частности, будет объяснена разница между просто контейнером и запущенным контейнером. ...
Содержимое Docker (образы, контейнеры, метаданные) находятся (у меня! ... и у вас, полагаю ) здесь (это отличает от публикации выше):
Зарегистрирован: 24 сен 2011, 14:22 Сообщения: 11512 Откуда: Харьков
Olej писал(а):
Вся структура становится совершенно понятной!
Самые не очевидные детали, нужные при работе:
Цитата:
Команда 'docker images' выводит список образов верхнего уровня (top-level images). ... Только те образы, которые имеют присоединенные контейнеры или те, что были получены с помощью pull, считаются образами верхнего уровня. Это различие нужно для удобства, так как за каждым образом верхнего уровня может быть множество слоев. ... Команда 'docker images -a' выводит все образы на хост-машине. Это фактически список всех слоев для чтения в системе. Если вы хотите увидеть все слои одного образа, воспользуйтесь командой 'docker history'.
Цитата:
В отличие от 'docker stop' и 'docker kill', которые посылают настоящие UNIX сигналы процессам контейнера, команда 'docker pause' используют специальную возможность cgroups для заморозки запущенного пространства процессов. Подробности можно прочитать здесь, если вкратце, отправки сигнала Ctrl+Z (SIGTSTP) не достаточно, чтобы заморозить все процессы в пространстве контейнера.
Цитата:
Команда 'docker rmi' удаляет слой для чтения, который определяет «сущность» образа. Она удаляет образ с хост-системы, но образ все еще может быть получен из репозитория через 'docker pull'. Вы можете использовать 'docker rmi' только для слоев верхнего уровня (или образов), для удаления промежуточных слоев нужно использовать 'docker rmi -f'.
Цитата:
Команда 'docker commit' берет верхний уровень контейнера, тот, что для записи и превращает его в слой для чтения. Это фактически превращает контейнер (вне зависимости от того, запущен ли он) в неизменяемый образ.
Цитата:
Команда 'docker exec' применяется к запущенному контейнеру, запускает новый процесс внутри пространства процессов контейнера.
Цитата:
Команда 'docker save' создает один файл, который может быть использован для импорта образа на другую хост-систему. В отличие от команды 'export', она сохраняет все слои и их метаданные. Может быть применена только к образам.
Цитата:
Команда 'docker export' создает tar архив с содержимым файлов контейнера, в результате получается папка, пригодная для использования вне docker. Команда убирает слои и их метаданные. Может быть применена только для контейнеров.
Зарегистрирован: 24 сен 2011, 14:22 Сообщения: 11512 Откуда: Харьков
Olej писал(а):
Размер!
Привожу Docker в исходное, девственное состояние (1-й тур мусорных экспериментов закончен, начнём 2-й более осмысленный)...
1. Удалить все сохранённые контейнеры:
Код:
[olej@xenix lib]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1b752deedd31 docker.io/cdbishop89/docker-mint18-ci "bash" 20 hours ago Exited (0) 11 hours ago boring_turing bb548b8a65fa docker.io/vcatechnology/base-linux-mint "/bin/bash" 39 hours ago Exited (1) 33 hours ago clever_curie 488f17699a70 qkd/proxy_server "/bin/sh -c rabbitmq-" 6 days ago Exited (137) 11 hours ago qkdproxyserver_proxy_server_1
[olej@xenix lib]$ docker ps -a -q 1b752deedd31 bb548b8a65fa 488f17699a70
Зарегистрирован: 24 сен 2011, 14:22 Сообщения: 11512 Откуда: Харьков
Olej писал(а):
Вот и всё :
Не совсем всё ...
3. Нужно убрать сетевые интерфейсы, которые созданы образами / контейнерами Docker:
Код:
[olej@xenix lib]$ docker network list NETWORK ID NAME DRIVER SCOPE ee4a0d513069 bridge bridge local ba7c44df422c host host local 2983db90c200 multi-host bridge local 6487f69290a2 my-new-bridge bridge local 0da3fd3b6955 none null local 09fe500720a4 qkdproxyserver_default bridge local 265a19a5e1e3 qkdrxserver_default bridge local 7f5df562e08f qkdrxserver_zabbix_zbx_net_rx bridge local
[olej@xenix lib]$ docker network --help
Usage: docker network COMMAND
Manage Docker networks
Options: --help Print usage
Commands: connect Connect a container to a network create Create a network disconnect Disconnect a container from a network inspect Display detailed information on one or more networks ls List networks rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
[olej@xenix lib]$ docker network list NETWORK ID NAME DRIVER SCOPE ee4a0d513069 bridge bridge local ba7c44df422c host host local 0da3fd3b6955 none null local
3 предопределённых сетевых интерфейса Docker не могут быть удалены!
Код:
[olej@xenix lib]$ docker network rm host Error response from daemon: host is a pre-defined network and cannot be removed
Код:
[olej@xenix lib]$ ip address 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 8c:89:a5:74:f4:a5 brd ff:ff:ff:ff:ff:ff inet 192.168.1.20/24 brd 192.168.1.255 scope global enp2s0 valid_lft forever preferred_lft forever inet6 fe80::8e89:a5ff:fe74:f4a5/64 scope link valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:bf:0e:b9:65 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 scope global docker0 valid_lft forever preferred_lft forever
4. И ещё:
Код:
olej@xenix lib]$ docker volume ls DRIVER VOLUME NAME local qkdrxserver_auth_link_rx local qkdrxserver_config_rx local qkdrxserver_key_producer_rx local qkdrxserver_monitor_rx local qkdrxserver_storage_rx
Зарегистрирован: 24 сен 2011, 14:22 Сообщения: 11512 Откуда: Харьков
Olej писал(а):
Так что разговоры (как пишут) о том, что нельзя указать Docker в какой подсети и с каким IP выполнять контейнер - сильно преувеличены! По крайней мере, это достигается созданием дополнительного сетевого интерфейса и подсети.
Вот так можно запустить любой контейнер в любой подсети и с принудительно заданным ему IP:
[olej@xenix lib]$ docker network ls NETWORK ID NAME DRIVER SCOPE 004727ebdb24 bridge bridge local ba7c44df422c host host local 0435cb761c08 host-10 bridge local 0da3fd3b6955 none null local
[olej@xenix lib]$ docker run -ti --network=host-10 --ip=10.0.9.100 dc112c92acb3 bash e5fbd33864ba / # ip address 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:0a:00:09:64 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.0.9.100/24 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:aff:fe00:964/64 scope link valid_lft forever preferred_lft forever ...
Но это нельзя сделать только единственно на дефаултном интерфейсе Docker:
Код:
olej@xenix lib]$ docker run -ti --ip=172.17.0.100 dc112c92acb3 bash /usr/bin/docker-current: Error response from daemon: User specified IP address is supported on user defined networks only.
Зарегистрирован: 24 сен 2011, 14:22 Сообщения: 11512 Откуда: Харьков
То, как, опробовав свои дополнения (слои), сохранить образ как новый, командой docker-а commit детально расписано здесь рядом, на примере: графические приложения в Docker. Там же можно найти о командах save - сохранить образ в файл для переноса на новый компьютер, и load - развернуть образ из ранее сохранённого файла.
Зарегистрирован: 24 сен 2011, 14:22 Сообщения: 11512 Откуда: Харьков
Olej писал(а):
То, как, опробовав свои дополнения (слои), сохранить образ как новый, командой docker-а commit детально расписано здесь рядом, на примере: графические приложения в Docker.
Подход docker commit, описанный в предыдущей статье, не является рекомендованным для Docker. Его плюс состоит в том, что мы настраиваем контейнер практически так, как привыкли настраивать стандартный сервер.
Вместо этого подхода мы рекомендуем использовать подход Dockerfile и команду docker build. Dockerfile использует обычный DSL с инструкциями для построения образов Docker. После этого выполняется команда docker build для построения нового образа с инструкциями в Dockerfile.
Почему так уж "не рекомендуется" мне не совсем понятно и не очевидно. Но в ближайшем сообщении я покажу, альтернативно, как это делается.
В этой же публикации подробно расписаны инструкции Dockerfile - в этом её плюс.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения