1.Установка Docker
Для установки Docker требуется 64-х разрядная операционная система и ядро версии 3.10 и выше.
1 |
# uname -r |
1 |
3.10.0-327.36.2.el7.x86_64 |
1 |
# cat /etc/redhat-release |
1 |
CentOS Linux release 7.2.1511 (Core) |
Обновим пакеты
1 |
# yum update |
Добавляем репозитарий Docker
1 |
# tee /etc/yum.repos.d/docker.repo <<-'EOF' |
1 2 3 4 5 6 7 |
[dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF |
Непосредственно установим Docker
1 |
# yum install docker-engine |
Добавление Docker в автозагрузку
1 |
# systemctl enable docker |
Запуск Docker
1 |
# systemctl start docker |
Проверка состояния Docker
1 |
# systemctl status docker |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2016-10-20 23:10:36 EEST; 6s ago Docs: https://docs.docker.com Main PID: 1366 (dockerd) Memory: 18.5M CGroup: /system.slice/docker.service ├─1366 /usr/bin/dockerd └─1370 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --st... Oct 20 23:10:35 centos71.kamaok.org.ua dockerd[1366]: time="2016-10-20T23:10:35.240268299+03:00" level=warning msg="mountpoint for pids not found" Oct 20 23:10:35 centos71.kamaok.org.ua dockerd[1366]: time="2016-10-20T23:10:35.240569857+03:00" level=info msg="Loading containers: start." Oct 20 23:10:35 centos71.kamaok.org.ua dockerd[1366]: time="2016-10-20T23:10:35.530700626+03:00" level=warning msg="Running modprobe bridge br_netfilter f... Oct 20 23:10:35 centos71.kamaok.org.ua dockerd[1366]: time="2016-10-20T23:10:35.718801030+03:00" level=info msg="Firewalld running: false" Oct 20 23:10:36 centos71.kamaok.org.ua dockerd[1366]: time="2016-10-20T23:10:36.303073111+03:00" level=info msg="Default bridge (docker0) is assig...address" Oct 20 23:10:36 centos71.kamaok.org.ua dockerd[1366]: time="2016-10-20T23:10:36.430876877+03:00" level=info msg="Loading containers: done." Oct 20 23:10:36 centos71.kamaok.org.ua dockerd[1366]: time="2016-10-20T23:10:36.431063740+03:00" level=info msg="Daemon has completed initialization" Oct 20 23:10:36 centos71.kamaok.org.ua dockerd[1366]: time="2016-10-20T23:10:36.431087154+03:00" level=info msg="Docker daemon" commit=bb80604 gra...n=1.12.2 Oct 20 23:10:36 centos71.kamaok.org.ua dockerd[1366]: time="2016-10-20T23:10:36.457437494+03:00" level=info msg="API listen on /var/run/docker.sock" Oct 20 23:10:36 centos71.kamaok.org.ua systemd[1]: Started Docker Application Container Engine. Hint: Some lines were ellipsized, use -l to show in full. |
Просмотр Docker компонентов и их версий
1 |
# docker version |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Client: Version: 1.12.2 API version: 1.24 Go version: go1.6.3 Git commit: bb80604 Built: OS/Arch: linux/amd64 Server: Version: 1.12.2 API version: 1.24 Go version: go1.6.3 Git commit: bb80604 Built: OS/Arch: linux/amd64 |
Просмотр размещения различных компонентов, кол-ва контейнеров и образов, информации о операционноой системе, версии ядра, процессоре, памяти, имени хоста и т.д.
1 |
# docker info |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 1.12.2 Storage Driver: devicemapper Pool Name: docker-9:1-523134-pool Pool Blocksize: 65.54 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file: /dev/loop0 Metadata file: /dev/loop1 Data Space Used: 11.8 MB Data Space Total: 107.4 GB Data Space Available: 18.49 GB Metadata Space Used: 581.6 kB Metadata Space Total: 2.147 GB Metadata Space Available: 2.147 GB Thin Pool Minimum Free Space: 10.74 GB Udev Sync Supported: true Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Data loop file: /var/lib/docker/devicemapper/devicemapper/data WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device. Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.107-RHEL7 (2016-06-09) Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: null host bridge overlay Swarm: inactive Runtimes: runc Default Runtime: runc Security Options: seccomp Kernel Version: 3.10.0-327.36.2.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 1.946 GiB Name: centos71.kamaok.org.ua ID: 2BFA:DA3E:3H4A:GZDE:IYZJ:5NHY:APJO:LFHP:J2UC:RQQ4:SGUT:2RRN Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled Insecure Registries: 127.0.0.0/8 |
Docker-демон слушает запросы на Unix-сокете вместо TCP-порта. По умолчанию владельцем Unix-сокета является пользователь root (другие пользователи могут иметь доступ к сокету только через sudo).
По этой причине Docker всегда запускается под пользователем root
1 |
# ps uax | grep [d]ocker |
1 2 |
root 1366 0.1 1.4 647904 28932 ? Ssl 23:10 0:00 /usr/bin/dockerd root 1370 0.0 0.4 349072 8276 ? Ssl 23:10 0:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --runtime docker-runc |
Для использования Docker команд без sudo необходимо создать группу docker и включить в нее пользователя, которому необходимо дать право выполнения Docker команд
Когда Docker запускается, для группы docker устанавливается права чтения/запись.
Cоздаем группу docker, если она не было создана при установке Docker
1 |
# groupadd docker |
Добавляем в эту группу пользователя, которому необходимо дать право выполнять команды Docker
1 |
# usermod -aG username |
Пользователю username необходимо перелогиниться в системе, после чего он сможет выполнять команды Docker без использования sudo
Удаление Docker
Просмотр установленных пакетов Docker
1 |
# yum list installed | grep docker |
1 |
# yum list installed | grep docker |
1 2 |
docker-engine.x86_64 1.12.2-1.el7.centos @dockerrepo docker-engine-selinux.noarch 1.12.2-1.el7.centos @dockerrepo |
Удаление найденных пакетов
1 |
# yum -y remove docker-engine docker-engine-selinux |
1 |
# yum -y remove docker-engine docker-engine-selinux |
Удаление образов,контейнеров,томов
1 |
# rm -rf /var/lib/docker |
2.Запуск контейнера Docker
Для проверки корректности установки Docker запустим тестовый образ в контейнере
1 |
# yum list installed | grep docker |
1 2 |
docker-engine.x86_64 1.12.2-1.el7.centos @dockerrepo docker-engine-selinux.noarch 1.12.2-1.el7.centos @dockerrepo |
1 |
# docker run hello-world |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world c04b14da8d14: Pull complete Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/engine/userguide/ |
3.Работа с Docker/полезные команды Docker
Поиск доступных Docker-образов c операционной системой Ubuntu
1 |
# docker search ubuntu |
Скачать образ, не создавая контейнер
1 |
# docker pull ubuntu:14.04 |
Если не указывать версию, то скачивается последняя стабильная версия ubuntu:latest
Скачать последнюю версию Centos
1 |
# docker pull centos |
Скачать последнюю версию Debian
1 |
# docker pull debian |
Просмотр список доступных Docker-образов в системе
1 |
# docker images |
1 2 3 4 5 |
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 1e0c3dd64ccd 6 days ago 187.9 MB debian latest ddf73f48a05d 3 weeks ago 123 MB centos latest 980e0e4c79ec 6 weeks ago 196.7 MB hello-world latest c54a2cc56cbb 3 months ago 1.848 kB |
Удалить Docker-образ hello-world c системы
1 |
# docker rmi hello-world |
1 |
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 25df573ebd71 is using its referenced image c54a2cc56cbb |
Пока невозможно удалить этот образ т.к. он используется в контейнере
Просмотр существующих контейнеров(как запущенных, так и остановленных)
1 |
# docker ps -a |
1 2 |
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 25df573ebd71 hello-world "/hello" 18 minutes ago Exited (0) 18 minutes ago grave_shockley |
Просмотр ТОЛЬКО запущенных контейнеров
1 |
# docker ps |
1 |
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
Удалить контейнер (имя контейнера или его ID можно определить с предыдущей команды)
1 |
# docker rm grave_shockley |
1 |
grave_shockley |
Удалить все контейнеры
1 |
# docker rm $(docker ps -q) |
Удалить Docker-образ hello-world c системы
1 |
# docker rmi hello-world |
Проверка существующих в системе образов
1 |
# docker images |
1 2 3 4 |
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 1e0c3dd64ccd 6 days ago 187.9 MB debian latest ddf73f48a05d 3 weeks ago 123 MB centos latest 980e0e4c79ec 6 weeks ago 196.7 MB |
Создадим/запустим контейнер с Ubuntu14.04 (если образ предварительно не был скачан, то Docker сам автоматически его скачает с Docker public registry)
1 |
# docker run -dit --name docker-ubuntu14.04 --hostname="ubuntu14.04" ubuntu:14.04 /bin/bash |
1 |
c1b370fb03e7cc25f79b6bb72e259d23f8822e12c0d9c944910f066c5fa1572d |
1 2 3 4 5 |
-d – запускать контейнер в фоновом режиме -t - запускать контейнер в интерактивном режиме -i - выделить tty-терминал, который требуется для присоединения к контейнеру --name – имя Docker-контейнера --hostname – установить имя хоста внутри контейнера |
Создадим/запустим контейнер с Centos7
1 |
# docker run -dit --name docker-centos7 --hostname="centos7" centos:latest /bin/bash |
Создадим/запустим контейнер с Debian8
1 |
# docker run -dit --name docker-debian8 --hostname="debian8" debian:latest /bin/bash |
Проверим состояния наших контейнеров
1 |
# docker ps -a |
1 2 3 4 |
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4aa0534b3129 debian:latest "/bin/bash" 37 seconds ago Up 34 seconds docker-debian8 aab2b0545b1a centos:latest "/bin/bash" About a minute ago Up About a minute docker-centos7 c1b370fb03e7 ubuntu:14.04 "/bin/bash" 3 minutes ago Up 3 minutes docker-ubuntu14.04 |
Подключимся к контейнеру docker-ubuntu14.04 и выполним команду
1 |
# docker attach docker-ubuntu14.04 |
1 |
root@ubuntu14:/# hostname |
1 |
ubuntu14.04 |
Отключиться от контейнера без его выключения
1 |
CTRL+P+Q |
Просмотр запущенных процессов внутри Docker-контейнера
1 |
# docker top docker-ubuntu14.04 |
1 2 |
UID PID PPID C STIME TTY TIME CMD root 1844 1837 0 00:01 pts/1 00:00:00 /bin/bash |
Использование ресурсов контейнером
(процессорного времени, памяти, дисковой подсистемы, сетевой подсистемы)
1 |
# docker stats docker-ubuntu14.04 |
1 2 |
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS docker-ubuntu14.04 0.00% 4.051 MiB / 1.946 GiB 0.20% 648 B / 648 B 4.428 MB / 0 B 0 |
Копирование файлов с Docker-контейнера на хостовую ноду
(например,каталога /etc контейнера в каталог /root хостовой ноды)
1 |
# mkdir /root/ubuntu14.04 |
1 |
# docker cp docker-ubuntu14.04:/etc /root/ubuntu14.04/ |
Остановка контейнера
1 |
# docker stop docker-ubuntu14.04 |
Остановка всех контейнеров
1 |
# docker stop $(docker ps -q) |
Запуск контейнера
1 |
# docker start docker-ubuntu14.04 |
Перезаупуск контейнера
1 |
# docker restart docker-ubuntu14.04 |
Переименование контейнера
1 |
# docker rename docker-ubuntu14.04 docker-myubuntu14.04 |
1 |
# docker rename docker-centos7 docker-mycentos7 |
1 |
# docker rename docker-debian8 docker-mydebian8 |
Просмотр всех настроек контейнера
1 |
# docker inspect docker-myubuntu14.04 | less |
4. Построение Docker-образа
1.Запускаем/создаем контейнер из необходимого/первоначального образа операционной системы
2.Устанавливаем необходимые пакеты и делаем необходимые настройки конфигурационных файлов
3.Сохраняем состояние контейнера(commit) как новый Docker-образ локально на сервере
4.Заливаем новый образ на Docker Hub(push) (предварительно необходимо зарегистрироваться на нем)
https://hub.docker.com/
Итого схема имеет вид/последовательность
1 |
Build images->Commit Image->Push image to Docker Registry/Hub->Pull Image from Docker Registry/Hub |
1.В системе уже есть запущенный контейнер с Debian8.
Подключимся к нему
1 |
# docker attach docker-mydebian8 |
1 |
root@debian8:/# |
2.Установим Apache внутри контейнера
1 |
# apt-get update && apt-get install apache2 |
1 |
# /etc/init.d/apache2 start |
1 |
# ps ax | grep [a]pache |
1 2 3 |
1346 ? Ss 0:00 /usr/sbin/apache2 -k start 1348 ? Sl 0:00 /usr/sbin/apache2 -k start 1349 ? Sl 0:00 /usr/sbin/apache2 -k start |
Выходим с контейнера
1 |
CTRL+P+Q |
3.Сохраняем локально новое состояние контейнера, тем самым создавая новый Docker-образ
Сохраняем изменения делая commit, предварительно посмотрим ID-контейнера(4aa0534b3129)
1 |
# docker ps -a | grep debian |
1 |
4aa0534b3129 debian:latest "/bin/bash" 25 minutes ago Up 10 minutes docker-mydebian8 |
1 |
# docker commit -m "Installed Apache" -a "Eugene Kamenev" 4aa0534b3129 kamaok/debian8_apache2 |
1 |
sha256:d7a092cd2799357a639e0985f96c2c6412c5b0b047be435e93a7c7ca623e0dc4 |
1 2 3 4 5 |
-m – сообщение,которое будет информировать других пользователей о том, какие изменения были сделаны(аналогично опции -m при использовании систему управления версиями) -a - автор коммита 4aa0534b3129 – ID-контейнера kamaok –имя пользователя, с которым была произведена регистрация на Docker Hub debian8_apache2– имя нового Docker-образа |
Проверяем налииче нового Docker-образа
1 |
# docker images | grep debian |
1 2 |
kamaok/debian8_apache2 latest d7a092cd2799 55 seconds ago 191.4 MB debian latest ddf73f48a05d 3 weeks ago 123 MB |
Теперь этот образ можно использовать при запуске/создании контейнера
1 |
# docker run -tid kamaok/debian8_apache2 /bin/bash |
4.Заливаем новый образ на Docker Hub
Предварительно залогинимся на Docker Hub с командной строки, используя имя пользователя и пароль,указанные при регистрации
1 |
# docker login -u kamaok |
1 2 3 |
Password: Login Succeeded [root@centos71 ~]# |
Заливаем
1 |
# docker push kamaok/debian8_apache2 |
1 2 3 4 |
The push refers to a repository [docker.io/kamaok/debian8_apache2] adbce29d8581: Pushed 142a601d9793: Mounted from library/debian latest: digest: sha256:d419b767a54d503fb4c42b2cd7a4d1d5d0b92cb1f88971b7626cc358b4ffb978 size: 741 |
5.Проверим наличие нашего нового образа на Docker Hub
https://hub.docker.com/
6.Для запуска нового контейнера с нового образа используем команды:
1 |
# docker pull kamaok/debian8_apache2 |
1 2 3 4 |
Using default tag: latest latest: Pulling from kamaok/debian8_apache2 Digest: sha256:d419b767a54d503fb4c42b2cd7a4d1d5d0b92cb1f88971b7626cc358b4ffb978 Status: Image is up to date for kamaok/debian8_apache2:latest |
1 |
# docker images | grep debian |
1 2 |
kamaok/debian8_apache2 latest d7a092cd2799 10 minutes ago 191.4 MB debian latest ddf73f48a05d 3 weeks ago 123 MB |
1 |
# docker run -dit --name docker-debian8-apache2 --hostname="debian8-apache2" kamaok/debian8_apache2 |
1 |
2409ce1e85549c38a5400c9ad7aea37938c9b9d46d5abf74fcf420c018976d3c |
5.Настройка сети в Docker
После установки Doсker автоматически создается 3 сети автоматически
1 |
# docker network ls |
1 2 3 4 |
NETWORK ID NAME DRIVER SCOPE 926f2f73b731 bridge bridge local d5d2b9e299c8 host host local 0ba6c5dde459 none null local |
Можно указать тип сети, который доkжен использовать контейнер при старте контейнера с помощью опции —network=
Именно сеть типа Bridge используется по умолчанию.
Docker использует Linux bridge для внутреннего межконтейнерного взаимодействия, а также для соединения контейнера с внешними сетями.
После установки Doсker автоматически создается bridge с именем docker0
Каждый контейнер будет соединяться с docker0 bridge-интерфейсом, при этом на ноде будет создававаться новый интерфейс для каждого контейнера
Просмотр сети типа bridge на ноде
1 |
# docker network inspect bridge | less |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
[ { "Name": "bridge", "Id": "926f2f73b731f78edbac7c61926fa6339cb2f46145f1dd246f5bc0bb4079115d", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Containers": { "2409ce1e85549c38a5400c9ad7aea37938c9b9d46d5abf74fcf420c018976d3c": { "Name": "docker-debian8-apache2", "EndpointID": "49f03d3da7f8a4f7d472c42cefdb49bcc7e2372394ceebb0f30fba0594dd0dd8", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" }, "4aa0534b31291633a91adce06ecad819fbd65033f6ece451ea14364c706f3936": { "Name": "docker-mydebian8", "EndpointID": "9d97c4e06be62176317836e109449d9886b78cf0a3b68c0ac52a3959edb53918", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" }, "aab2b0545b1a5c0f701d7df785d61a3286afd7990e3ab409034bc771aaf35201": { "Name": "docker-mycentos7", "EndpointID": "33e12720ebcd0a1aa099f7f3615a62bcf977a6536ed8ce8df1ad770c4fe0a168", "MacAddress": "02:42:ac:11:00:04", "IPv4Address": "172.17.0.4/16", "IPv6Address": "" }, "c1b370fb03e7cc25f79b6bb72e259d23f8822e12c0d9c944910f066c5fa1572d": { "Name": "docker-myubuntu14.04", "EndpointID": "6418c6bafc7e8da59a227865d2c47c49e1f0a862674b8c66717ca9dd442b3a3c", "MacAddress": "02:42:ac:11:00:05", "IPv4Address": "172.17.0.5/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ] |
Проверяем настройки сети контейнера
Для первого контейнера docker-debian8-apache2
1 |
# docker inspect docker-debian8-apache2 | less |
1 2 3 4 5 6 7 8 9 |
… "Networks": { "bridge": { "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, ………. "MacAddress": "02:42:ac:11:00:02" … |
В самом контейнере,например, docker-mydebian8, сетевые настройки имеют вид
1 |
# docker attach docker-debian8-apache2 |
1 |
# ip addr show |
1 2 3 4 5 6 7 8 9 10 11 12 |
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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 6: eth0@if7: <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 inet 172.17.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:3/64 scope link valid_lft forever preferred_lft forever |
1 |
# ip route show |
1 2 |
default via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2 |
Cоздание пользовательский сетей типа Bridge
По умолчанию,контейнеры имеет доступ друг к другу через хостовый Bridge-интерфейс docker0
Для изоляция контейнеров друг от друга можно создавать пользовательский/свои сети типа Bridge
Например, создадим новую сеть типа Bridge с именем isolated_network
1 |
# docker network create --driver bridge isolated_network |
1 |
c2fcfb10c69962c9c890a3caecdb6270b5befd02a0a25bda1ebaf1406601d74d |
Проверка наличия новой сети
1 |
# docker network ls | grep -Ei 'isolated|name' |
1 2 |
NETWORK ID NAME DRIVER SCOPE c2fcfb10c699 isolated_network bridge local |
Просмотрим характеристики этой сети
1 |
# docker network inspect isolated_network |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[ { "Name": "isolated_network", "Id": "c2fcfb10c69962c9c890a3caecdb6270b5befd02a0a25bda1ebaf1406601d74d", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1/16" } ] }, "Internal": false, "Containers": {}, "Options": {}, "Labels": {} } ] |
Видно,что в этой сети используется другая подсеть 172.18.0.0/16 отличная от сети по умолчанию,которая используется для всех остальных контейнеров(172.17.0.0./16)
На ноде появился новый Bridge-интерфейс
1 2 3 4 5 6 7 |
br-c2fcfb10c699: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 ether 02:42:e8:cf:a2:65 txqueuelen 0 (Ethernet) RX packets 11 bytes 830 (830.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 36 bytes 2560 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
Теперь создадим новый контейнер с debian8 для работы с новой сетью.
1 |
# docker run -dit --name docker-mydebian8-isolated --hostname="docker-mydebian8-isolated" --network=isolated_network debian:latest /bin/bash |
1 |
d2940fb8eaf887229d1f188d8e423d58fb0227e673771d08b8e8e37a54cce86d |
1 |
# docker ps -a | grep debian8-isolated |
1 |
d2940fb8eaf8 debian:latest "/bin/bash" About a minute ago Up About a minute docker-mydebian8-isolated |
Проверим наличие подсоединенного к сети с именем isolated_network запущенного контейнера docker-mydebian8-isolated
1 |
# docker network inspect isolated_network |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[ { "Name": "isolated_network", "Id": "c2fcfb10c69962c9c890a3caecdb6270b5befd02a0a25bda1ebaf1406601d74d", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1/16" } ] }, "Internal": false, "Containers": { "d2940fb8eaf887229d1f188d8e423d58fb0227e673771d08b8e8e37a54cce86d": { "Name": "docker-mydebian8-isolated", "EndpointID": "ea317f7781df4c6822a568e578ce3c1ef2177dd8410b5e718098eaff0385e918", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] |
Подключимся к новому контейнеру и проверим доступность с него других контейнеров и доступа в Интернет
1 |
# docker attach docker-mydebian8-isolated |
1 |
root@docker-mydebian8-isolated:/# |
1 |
# ip addr show |
1 2 3 4 5 6 7 8 9 10 11 12 |
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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 15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff inet 172.18.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe12:2/64 scope link valid_lft forever preferred_lft forever |
Доступ в Интернет есть благодаря новому интерфейсу на ноде
1 |
# ping i.ua |
1 2 3 4 5 6 |
PING i.ua (91.198.36.14): 56 data bytes 64 bytes from 91.198.36.14: icmp_seq=0 ttl=54 time=9.371 ms ^C--- i.ua ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max/stddev = 9.371/9.371/9.371/0.000 ms root@docker-mydebian8-isolated:/# |
Ожидаемо, что доступ к соседнему контейнеру отсутствует
1 |
root@docker-mydebian8-isolated:/# ping 172.17.0.3 |
1 |
PING 172.17.0.3 (172.17.0.3): 56 data bytes |
6.Создание/построение образа из Dockerfile
Создадим образ с Ubuntu 16.04, который впоследствии может быть использован для создания контейнера
Для этого создадим Dockerfile, в котором пропишем необходимые инструкции
1 |
# mkdir -p /root/ubuntu16.04 && cd /root/ubuntu16.04 |
1 |
# nano Dockerfile |
1 2 3 4 |
# This is a comment FROM ubuntu:16.04 MAINTAINER Eugene Kamenev <username@mydomain.com> RUN apt-get update && apt-get install -y apache2 |
Формат Dockerfile имеет вид
1 |
INSTRUCTION statement |
Комментариям предшествует символ #
Название инструкции пишутся с большой буквы
В Dockerfile были использованы следующие инструкции
1 2 3 4 |
FROM - определяет какой источник использовать для нашого образа – устанавливаем Ubuntu 16.04 MAINTAINER – имя и E-mail лица, обслуживающего этот образ RUN - команды, которые необходимо выполнить внутри образа – обновляемый локальный кеш пакетов и устанавливаем Apache Запустим сборку/создание образа |
1 |
# docker build -t kamaok/ubuntu16.04 . |
1 2 3 |
kamaok - имя пользователя,которому принадлежит образ ubuntu16.04 – имя образа . (Точка) – размещение Dockerfile – в текущем каталоге. (также можно определять полный путь к Dockerfile) |
Проверяем наличие созданного образа с именем kamaok/ubuntu16.04
1 |
# docker images | grep -E 'ubuntu16|REPOSITORY' |
1 2 |
REPOSITORY TAG IMAGE ID CREATED SIZE kamaok/ubuntu16.04 latest 11e09ab98db5 3 minutes ago 265.4 MB |
Теперь создаем контейнера из этого образа
1 |
# docker run -dit --name docker-ubuntu16.04 --hostname="ubuntu16.04" kamaok/ubuntu16.04 /bin/bash |
1 |
b4ecdc0b1e2f3f7bcb0bccc51e873e230a7531300cc99356e484bc3b78276134 |
Проверяем наличие контейнера запущенного из нового образа
1 |
# docker ps -a | grep -E 'ubuntu16.04|IMAGE' |
1 2 |
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b4ecdc0b1e2f kamaok/ubuntu16.04 "/bin/bash" 26 seconds ago Up 23 seconds docker-ubuntu16.04 |
Подключаемся к контейнеру и проверяем версию операционной системы
1 |
# docker attach docker-ubuntu16.04 |
1 |
root@ubuntu16:/# cat /etc/issue |
1 |
Ubuntu 16.04.1 LTS \n \l |
Источник:
https://docker.github.io/engine/installation/linux/centos/
https://docs.docker.com/engine/userguide/networking/
http://prakhar.me/docker-curriculum/