ONE DUDE`S BLOG

/media/docker-post-img.webp

Docker. Swarm. Compose.

26.12.2021
Мои заметки по работе с докером.

Заметки ниже не описывают работу с докер в полной мере, это лишь выписки того, что показалось интересным лично мне. Настоятельно рекомендую начинать знакомство с docker с официального сайта, либо пройти данный курс.

Полезные ссылки

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 - настройки специфичные для драйвера

Инспекция докер контейнера

  1. docker inspect<container> - вся небходимая информация о докер контейнере
  2. docker top <container> - список процессов кнутри контейнера
  3. 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, по умолчанию выключен т.к. дает меньший перформанс.

  • Каждый сервис может быть соединен с несколькими сетями.

Поехали:

  1. Создадим нашу сеть с 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
  1. Создадим постгрес сервис в рамках 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

  1. Создадим еще сервис с 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 файлы

img

Пыхали создавать че ;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+
  1. Команда для записи в стор

    docker secret create <secret_name> <file_name>

    echo "mySecret" | docker secret create <store_name> -

  2. Пример

    $ 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:/#
    
  3. 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
Перейдя по адресу /v2/catalog можно увидеть доступные образы
{"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
Docker
докер
docker-compose
swarm
1
2696