Docker. Swarm. Compose.
Заметки ниже не описывают работу с докер в полной мере, это лишь выписки того, что показалось интересным лично мне. Настоятельно рекомендую начинать знакомство с docker с официального сайта, либо пройти данный курс.
Полезные ссылки
- Документация docker. Вообще стоит начинать с нее, а не с моего сайта ;p
- Песочница докер. Да, тут можно потыкать всякое.
- Udemy курс по изучению докера (К слову, весьма неплохой, однако не раскрывает особенности работы с kubernetes)
Docker. Работа с образами и контейнерами.
Создать имедж
docker build ./local -t my-tag
Создание контейнера
Контейнер с проименнованным volume
Для начала загрузим образо mysql
Вот тут загрузим, прямо под спойлером 🙂
$ docker image pull mysql
Using default tag: latest
latest: Pulling from library/mysql
ffbb094f4f9e: Pull complete
df186527fc46: Pull complete
fa362a6aa7bd: Pull complete
5af7cb1a200e: Pull complete
949da226cc6d: Pull complete
bce007079ee9: Pull complete
eab9f076e5a3: Pull complete
8a57a7529e8d: Pull complete
b1ccc6ed6fc7: Pull complete
b4af75e64169: Pull complete
3aed6a9cd681: Pull complete
23390142f76f: Pull complete
Digest: sha256:ff9a288d1ecf4397967989b5d1ec269f7d9042a46fc8bc2c3ae35458c1a26727
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
Контейнер можно создать с проименнованным разделом:
$ docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql
Проверим что все создалось
$ docker volume ls
DRIVER VOLUME NAME
local mysql-db
К данному volume можно прекрутить несколько инстансов mysql!
$ docker container run -d --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql
c7b8a5c59857865fdb34956846a728fa80559c37bfcc275ff2f1c77155ce2617
Docker volume с полным путем до директории
$ docker container run -d --name nginx -p 80:80 -v $(pwd):/usr/share/nginx/html nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
e5ae68f74026: Pull complete
21e0df283cd6: Pull complete
ed835de16acd: Pull complete
881ff011f1c9: Pull complete
77700c52c969: Pull complete
44be98c0fab6: Pull complete
Digest: sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
Status: Downloaded newer image for nginx:latest
386547c9d64283826a3e5fffe94e04c01008842e3408a6fa7e3bd20612059317
Создать раздел
docker volume create angular-dist --driver local \
--opt device=../dist/verifika
--opt
- настройки специфичные для драйвера
Инспекция докер контейнера
docker inspect<container>
- вся небходимая информация о докер контейнереdocker top <container>
- список процессов кнутри контейнераdocker stats <container>
- монитор контейнера в реальном времени
Просмотр логов
docker logs --tail 1000 <CONTAINER_ID>
Docker оркестрация.
Docker swarm
swarm mode - встроенное решение для кластеризации внутри докера, позволяющее масштабировать контейнеры с помощью менеджера, который автоматически их орекстрирует. Пыхали:
Инициализируем swarm
docker swarm init
output
Swarm initialized: current node (3i2ejgrrjjxior4zqdb4toisc) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5mgsyr4mknvcedi602cj7b0dboe8sspr0wawvrdj3pt96cb50v-829hqu6yxl7s4568i4m99rjvd 192.168.65.3:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions
Что случилось:
- Создался рут сертификат для сворма
- подписал сертификат для 1 управляющего узла
- выпустил специальный токен для входа в swarm
- Создал специальный стородже для сертификатов, конфигов и секретов (зашифровал на диске)
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
3i2ejgrrjjxior4zqdb4toisc * docker-desktop Ready Active Leader 20.10.8
Создадим простой сервис
Создадим простой сервис
Сервис это кусочки распределенного прилождения, работают они в продакшене и содержат в себе лишь 1 образ, + информацию о портах, репликах, и т.д. чтобы сервис мог обеспечивать необходимую вычислительную мощность.
docker service create alpine ping 8.8.8.8
Посмотрим список всех сервисов docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
td73r47wtjqu vigorous_newton replicated 1/1 alpine:latest
Отмасштабриуем! docker service update td73 --replicas 3
❯ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
td73r47wtjqu vigorous_newton replicated 3/3 alpine:latest
Как видно, реплики стало 3. docker services ps vigorous_newton
❯ docker service ps vigorous_newton
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jp2aougzlly4 vigorous_newton.1 alpine:latest docker-desktop Running Running 6 minutes ago
81v0rf2wm2g2 vigorous_newton.2 alpine:latest docker-desktop Running Running about a minute ago
n1hkuwr2aa5t vigorous_newton.3 alpine:latest docker-desktop Running Running about a minute ago
При этом если мы грохнем контейнер, например docker container rm -f <containerid>
мы увидим что он поднялся снова. Это 1 из отличий swarm от запуска докер контейнеров, он обеспечивает запуск и поддержание необходимых узлов.
Docker swarm между несколькими хостами
Для изучения нужны реальные сервера, либо топаем на play-with-docker.com. Доступно только 4 часа, но нам нужно минут ~30
Создаем 3 узла (add new instance, далее node1, node2, node3)
Инициализируем мастер-ноду swamr на node1 docker swarm init --advertise-addr 192.168.0.4
где взять ip? Это публичный адресс, в play-with-docker он будет показан при попытке ввода docker swarm init
Вывод:
Swarm initialized: current node (byqb6e4xpjzr1tm3f8028g3r8) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4cehtg8nzk3yn5chwx5tcbn0jkn5bk41b0eqws82yb2m9y1ol8-9kmbq2pxr5yrjwqlpetyecsyr 192.168.0.4:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Переключимся на node2 и присоеденимся к нашему узлу
docker swarm join --token SWMTKN-1-4cehtg8nzk3yn5chwx5tcbn0jkn5bk41b0eqws82yb2m9y1ol8-9kmbq2pxr5yrjwqlpetyecsyr 192.168.0.4:2377
Переходим в node1 чтобы узнать сколько узлов в рамках 1 роя: docker node ls
, их должно быть 2:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
byqb6e4xpjzr1tm3f8028g3r8 * node1 Ready Active Leader 20.10.0
vgue6t0curtyvl6nuf2pvuvey node2 Ready Active 20.10.0
Если вввести docker node ls
в worker то получим ошибку. Т.к. у него нет привелегий на взаимодействие с мастер фичами. Однако, его можно сделать менеджером docker node update --role manager node2
, после чего команда снова будет работатье Менеджера можно установить сразу при добавлении узла, для этого на master node1: docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4cehtg8nzk3yn5chwx5tcbn0jkn5bk41b0eqws82yb2m9y1ol8-2u04evh2lpg755hi8odqzd92q 192.168.0.4:2377
На node 3:
$ docker swarm join --token SWMTKN-1-4cehtg8nzk3yn5chwx5tcbn0jkn5bk41b0eqws82yb2m9y1ol8-2u04evh2lpg755hi8odqzd92q 192.168.0.4:2377
This node joined a swarm as a manager.
[node3] (local) root@192.168.0.5 ~
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
byqb6e4xpjzr1tm3f8028g3r8 node1 Ready Active Leader 20.10.0
vgue6t0curtyvl6nuf2pvuvey node2 Ready Active Reachable 20.10.0
oiagv8l1mirl7ggbrjvuka8vf * node3 Ready Active Reachable 20.10.0
Congratilations. Рой построен! можно отправляться войной на протосов…
теперь создадим сервис с простой командой пинг и 3 репликами: docker service create --replicas 3 alpine ping 8.8.8.8
Создаем несколько реплик приложения
[node3] (local) root@192.168.0.5 ~
$ docker service create --replicas 3 alpine ping 8.8.8.8
reetypdrfkei351bc323dihji
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
[node3] (local) root@192.168.0.5 ~
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
reetypdrfkei thirsty_ganguly replicated 3/3 alpine:latest
Масштабирование сервиса
docker service scale servicen_name=3
Обновление
docker service update --image image_name servicen_name
Изменение настроек существующего сервиса
docker service update --publish-rm 8088 --publish-add 9090:80
Пересоздать полностью сервис + все контейнеры
docker service update --force service_name
Docker Multi-Host
Масштабирование сети с overlay networking
Для масштабирования достаточно выбрать
--driver overlay
когда создаем networkЭто позволяет общаться узлам в рамках 1 сварм сервиса
Данный нетворк преднозначен только для коммуникации между контейнерами в рамках 1 swarm
Существует AES - encryption on network creation, по умолчанию выключен т.к. дает меньший перформанс.
Каждый сервис может быть соединен с несколькими сетями.
Поехали:
- Создадим нашу сеть с overlay драйвером
$ docker network create --driver overlay mydrupal
fkah9kefrm2lantetv0ic5ydl
Проверим сети
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
666522df5862 bridge bridge local
0c9e768d6bdf docker_gwbridge bridge local
3dab547b3b23 host host local
5qtrulz5p28c ingress overlay swarm
fkah9kefrm2l mydrupal overlay swarm # O, это мы создали ;3
39802f55273d none null local
- Создадим постгрес сервис в рамках
mydrupal
сети:
[manager2] (local) root@192.168.0.5 ~
$ docker service create --name psql --network mydrupal -e POSTGRES_PASSWORD=upass postgres
qs7rwujfkd3he4951oprmnuih
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
Проверим что все создалось:
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
qs7rwujfkd3h psql replicated 1/1 postgres:latest
Теперь посмотрим создался ли контейнер:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
221b3320b1b8 postgres:latest "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 5432/tcp psql.1.v4livfk5uztz3c1oaqugrtoob
И посмотрим его логи docker container logs 221
. Должно высветиться сообщение, в конце которого написано, что соединение с базой создано.
2021-12-07 19:52:05.988 UTC [1] LOG: database system is ready to accept connections
- Создадим еще сервис с drupal (это такая php cms)
docker service create --name drupal --network mydrupal -p 80:80 drupal
docker service ps drupal
покажет что контейнер запущен на другой ноде (в рамках 1 сварма)
Теперь можнем перейти на паблик айпи (нажав open port), и увидим панель настройки друпала.
Введем так:
(пароль - upass, его мы ввели выше)
из интересного, для хоста базы данных мы указали psql, это name нашего докер сервиса. Под копотом докера происходит масса всего интересного, вклюая линковку ns записей, которые позволяют декларативно настраивать наши сервисы.
После всего выше введенного мы должны увидеть установку drupal 🤢.
Но самое крутое в этом то, что мы можем открыть любой из публичных ip наших узлов..и увидеть тот-же самый сайт! Это реально круто, потому что мы отмасштабировали его без особого погружения в реализацию внутри инфраструктуры.
Но почему так происходит? Ведь в docker serivce ls мы видим лишь 1 реплику?
Swarm создает virtual ip, вместо того чтобы общаться с контейнерами напрямую, с их реальным ip, клиент будет обращаться через этот id. Также swarm позволяет построить маршрут до любого узла, входяшего в сервис, автоматически решая за нас проблемы с днс и роутингом.
Кроме того, в сварм встроен лоад балансер, что также избавляет нас от лишних хлопот.
Swarm load balancer
$ docker service create --name search --replicas 3 -p 9200:9200 elasticsearch:2
o4ykueyx6ufprva1s5bv8kp40
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
Теперь если поочередно вводить curl localhost:9200
то можно увидеть разные ответы, с разных узлов, которые балансируются по принципу round robin.
Использование нескольких сервисов
Просто пример, голосовалка с 5 сервисами, коты против собак! Что может быть лучше в статье про докер! Создадим сети, для бекенда и фронтенда!
$ docker network create --driver overlay frontend
hj22fgvv4cmpbkk4ohahgxx6m
$ docker network create --driver overlay backend
v1np0h3p6u2b1yqolz2rojj3h
Установим фронтенд!
$ docker service create --network frontend --name vote -p 80:80 dockersamples/examplevotingapp_vote:before
kqtivcyy3jgib2sdvwo7puvfi
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
Теперь редис!
$ docker service create --network frontend --name redis --replicas 2 redis:3.2
w0iu89ydrc83zkkhs7muhq0y3
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
postgres
$ docker service create --name db --network backend --mount type=volume,source=db-data,target=/var/lib/postgresql/data -e POSTGRES_PASSWORD=pass -e POSTGRES_HOST_AUTH_METHOD=trust postgres:9.4
j33y2p8136lhkvdg6aqaw2fbv
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
worker
WARNING worker нужно запускать ПОСЛЕ postgres. В курсе который смотрел я, было наоборот.
$ docker service create --name worker --network frontend --network backend dockersamples/examplevotingapp_worker
Окей, наконец бекенд
$ docker service create --name result --network backend -p 5001:80 dockersamples/examplevotingapp_result:before
rztrwm1b84j7ebqs33dnwj50z
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
Посмотрим что вышло:
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
j33y2p8136lh db replicated 1/1 postgres:9.4
f52jm7xdxea7 redis replicated 1/1 redis:3.2
rztrwm1b84j7 result replicated 1/1 dockersamples/examplevotingapp_result:before *:5001->80/tcp
o4ykueyx6ufp search replicated 3/3 elasticsearch:2 *:9200->9200/tcp
kqtivcyy3jgi vote replicated 2/2 dockersamples/examplevotingapp_vote:before *:80->80/tcp
m82oogttpx85 worker replicated 1/1 dockersamples/examplevotingapp_worker:latest
Теперь можно открыть 80 порт, проголосовать, а затем посетить 5001 порт чтобы увидеть результат 🙂
Swarm stacks
Swarm stacks - слой абстракции для docker swarm, позволяющий декларативно создавать реплики, разделы. Больше не нужен docker-compose
для того чтобы работать с compose файлами.
- Stacks может принимать Compose файлы для сервисов, сетей и разделов
docker stack deploy
- импортирует compose файлы
Пыхали создавать че ;p
voting-app-stack.yml
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
database:
image: postgres:9.4
environment:
- POSTGRES_PASSWORD=qwe
- POSTGRES_HOST_AUTH_METHOD=trust
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
$ docker stack deploy -c test.yml voteapp
Creating service voteapp_redis
Creating service voteapp_database
Creating service voteapp_vote
Creating service voteapp_result
Creating service voteapp_worker
Флаг -с для выбора композ файла
Посмотрим что вышло
$ docker stack ls
NAME SERVICES ORCHESTRATOR
voteapp 5 Swarm
$ docker stack services voteapp
ID NAME MODE REPLICAS IMAGE PORTS
89o9ncnf2row voteapp_database replicated 0/1 postgres:9.4
ikuilovttpga voteapp_redis replicated 2/2 redis:alpine *:30000->6379/tcp
yyi72e1lu5i8 voteapp_result replicated 1/1 dockersamples/examplevotingapp_result:before *:5001->80/tcp
odnxz7fl3dvg voteapp_vote replicated 2/2 dockersamples/examplevotingapp_vote:before *:5000->80/tcp
yhzvfdqizke6 voteapp_worker replicated 0/1 dockersamples/examplevotingapp_worker:latest
Swarm Secret Storage
- Secret storage служит для хранения сертификатов, паролей, личной информации, любых других данных которые должны оставаться приватными в зашифрованном виде.
- Secret storage позволяет хранить контент в виде строк/бинарных данных объемом до 500кб.
- Данное хранилище весьма умное, и шарит зашифрованные данные только тем контейнерам, которые объеденены в 1 сервис.
- Использовать secret storage невозможно без swarm.
- swarm доступен с версии 3.1+
Команда для записи в стор
docker secret create <secret_name> <file_name>
echo "mySecret" | docker secret create <store_name> -
Пример
$ echo "mypsqluser" > psql_user.txt $ docker secret create psql_user psql_user.txt > w7wcguif4jed8rt1ym9th3csr $ echo "myDBpassWPRD" | docker secret create psql_pass -
Посмотрим секреты
$ docker secret ls ID NAME DRIVER CREATED UPDATED k997qx9l3324owhsj73tl4z0s psql_pass About a minute ago About a minute ago w7wcguif4jed8rt1ym9th3csr psql_user 3 minutes ago 3 minutes ago
Получить данные напрямую не выйдет, но можно использовать при создании сущностей
$ docker service create --name psql --secret psql_user \ --secret psql_pass \ -e POSTGRES_PASSWORD_FILE=/run/secrets/psql_pass \ -e POSTGRES_USER_FILE=/run/secrets/psql_user postgres
$ docker service ps psql ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS qmg3pkhtfqxx psql.1 postgres:latest manager3 Running Running 9 minutes ago
Посетим наш контейнер, внутри сможем обнаружить файлы с секретами docker container ls выполняется на той ноде где присутствует база, у меня это manager3 с трейса выше
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2fd292c5b7d3 postgres:latest "docker-entrypoint.s…" 25 minutes ago Up 25 minutes 5432/tcp psql.1.qmg3pkhtfqxxioq47l14vhz9o [manager3] (local) root@192.168.0.9 ~ $ docker exec -ti 2fd bash root@2fd292c5b7d3:/# ls bin boot dev docker-entrypoint-initdb.d etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@2fd292c5b7d3:/# ls /run/secrets/ psql_pass psql_user root@2fd292c5b7d3:/# cat /run/secrets/psql_user mypsqluser root@2fd292c5b7d3:/#
Docker stack + docker secret storage*
version: "3" services: psql: image: postgres secrets: - psql_user - psql_password environment: POSTGRE_PASSWORD_FILE: /run/secrets/psql_password POSTGRES_USER_FILE: /run/secrets/psql_user secrets: psql_user: file: ./psql_user.txt psql_password: file: ./psql_password.txt
Задеплоим и проверим создались ли секреты
$ docker stack deploy -c docker-compose.yaml mydb Creating secret mydb_psql_user Creating secret mydb_psql_password Creating service mydb_psql [manager3] (local) root@192.168.0.9 ~ $ docker secret ls ID NAME DRIVER CREATED UPDATED pdgisb0cu2311yklxtikbv8o5 mydb_psql_password 42 seconds ago 42 seconds ago 1125grobosyoc98qe5x96cryd mydb_psql_user 42 seconds ago 42 seconds ago k997qx9l3324owhsj73tl4z0s psql_pass 2 hours ago 2 hours ago w7wcguif4jed8rt1ym9th3csr psql_user 2 hours ago 2 hours ago
При удалении стека, также удаляются и секреты
$ docker stack rm mydb Removing service mydb_psql Removing secret mydb_psql_user Removing secret mydb_psql_password Removing network mydb_default [manager3] (local) root@192.168.0.9 ~ $ docker secret ls ID NAME DRIVER CREATED UPDATED k997qx9l3324owhsj73tl4z0s psql_pass 2 hours ago 2 hours ago w7wcguif4jed8rt1ym9th3csr psql_user 2 hours ago 2 hours ago
Docker healthcheck
Healthcheck использует exit статусы, возвращаемые исполненными команддами, где 0 говорит что ошибок нет (OK), и 1 - ошибки есть (ERROR) По умолчаню healthcher ждет 30 секунд перед повторной попыткой
Пример запуска
$ docker run \
--health-cmd="curl -f localhost:9200/_clusted/health || false" \
--health-interval=5s \
--health-retries=3 \
--health-timeout=2s \
--health-start-period=15s \
elasticsearch:2
Nginx dockerfile + healthcheck
FROM nginx:1.13
HEALTHCHECK --interval=30s --timeout=3s
CMD curl -f https://localhost:5639/ || exit 1
exit 1 == false
Тоже самое но с docker-compose.yaml
healthcheck появился с версии 2.1
start_period доступен с версии 3.4
verison "3.1"
services:
web:
image: nginx
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 1m # this option allowed from 3.4 version
Пример с postgres
FROM postgres
HEALTHCHECK --interval=5s --timeout=3s \
CMD pg_isready -U postgres || exit 1
Пример запущенного контейнера с healthcheck
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3169c76f5e1c postgres "docker-entrypoint.s…" 20 seconds ago Up 19 seconds (health: starting) 5432/tcp p2
Docker private registry
- По дефолту использует 5000 порт
- Docker не будет работать с репозиторием без https
Как поднять?
❯ docker container run -d -p 5000:5000 --name registry -v $(pwd)/registry-data:/var/lib/registry registry
77806c4a4cadfc448886481ccf93953d3d42ffeb57a7ecf3eb41199e21e7ce7e
Как пользоваться?
Загрузка image для примера (нужен чтобы далее добавить в наш реестр)
❯ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
Теперь можем создать тег и опубликовать в нашем реестре
Публикация своего образа
❯ docker tag hello-world 127.0.0.1:5000/hello-world
❯ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
verifika-base latest be25980aef3a 3 days ago 3.45GB
postgres latest e94a3bb61224 6 days ago 374MB
verifika-front latest 829479c31185 9 days ago 88.5MB
alpine <none> c059bfaa849c 2 weeks ago 5.59MB
mongo latest 4253856b2570 3 weeks ago 701MB
registry latest b8604a3fe854 3 weeks ago 26.2MB
127.0.0.1:5000/hello-world latest feb5d9fea6a5 2 months ago 13.3kB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
❯ docker push 127.0.0.1:5000/hello-world
Using default tag: latest
The push refers to repository [127.0.0.1:5000/hello-world]
e07ee1baac5f: Pushed
latest: digest: sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4 size: 525
Использование со swarm
docker run
-> docker service
Повторим предыдущие шаги, но уже внутри swarm
Повторим предыдущие шаги, но уже внутри swarm
$ docker service create --name registry --publish 5000:5000 registry
hlllk67ppt1rdrzrnb5g6y1sx
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
[manager1] (local) root@192.168.0.6 ~
$ docker service ps registry
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vhmu3mq7qzom registry.1 registry:latest manager5 Running Running 59 seconds ago
[manager1] (local) root@192.168.0.6 ~
$ docker tag hello-world 127.0.0.1:5000/my-new-name
[manager1] (local) root@192.168.0.6 ~
$ docker push 127.0.0.1:5000/my-new-name
Using default tag: latest
The push refers to repository [127.0.0.1:5000/my-new-name]
e07ee1baac5f: Pushed
latest: digest: sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4 size: 525
{"repositories":["my-new-name"]}
Разного рода полезности
Просмотр занятого пространства
docker system df
Увеличение лимитов для размера докер volume
sudo systemctl stop docker vi /etc/docker/daemon.json
{"storage-driver": "devicemapper", "storage-opts": ["dm.basesize=40G"]}
:wq
sudo rm -rf /var/lib/docker sudo systemctl start docker
Создание Dockerfile из image
Хрен знает где такое может пригодиться, но мне вот пригодилось. Нашел тут
docker history --no-trunc $argv | tac | tr -s ' ' | cut -d " " -f 5- | sed 's,^/bin/sh -c #(nop) ,,g' | sed 's,^/bin/sh -c,RUN,g' | sed 's, && ,\n & ,g' | sed 's,\s*[0-9]*[\.]*[0-9]*\s*[kMG]*B\s*$,,g' | head -n -1