docker-compose шпаргалка

Thank you for reading this post, don't forget to subscribe!

Базо­вый шаблон
В первую оче­редь, пред­ла­гаю заго­тов­ку для docker-compose фай­ла, на осно­ве кото­рой мож­но начи­нать писать свой сце­на­рий для docker.

Созда­ем файл:

vi docker-compose.yml

* где:

  • version — вер­сия спе­ци­фи­ка­ции фай­ла. Начи­ная с docker-compose v1.27.0 явля­ет­ся опциональной.
  • services — основ­ной раз­дел, где мы будем созда­вать и опи­сы­вать наши сер­ви­сы (кон­тей­не­ры docker). В дан­ном при­ме­ре сер­вис один. Для добав­ле­ния еще одно­го добав­ля­ем еще строч­ки <srv_name>.
    • <srv_name> — назва­ние для наше­го сер­ви­са, на осно­ве кото­ро­го будет создан контейнер.
    • image — имя обра­за, кото­рый будет исполь­зо­вать­ся для созда­ния контейнера.
    • container_name — имя, кото­рое полу­чен создан­ный контейнер.
    • hostname — имя хоста внут­ри контейнера.
    • restart — пове­де­ния кон­тей­не­ра при паде­нии. В нашем при­ме­ре мы ука­зы­ва­ем на необ­хо­ди­мость авто­ма­ти­че­ской пере­за­груз­ки, за исклю­че­ни­ем слу­ча­ев, когда мы его сами оста­но­ви­ли коман­дой stop.
    • environment — зада­ем пере­мен­ные окру­же­ния. В нашем при­ме­ре толь­ко одна, кото­рая ука­зы­ва­ет на часо­вой пояс (мос­ков­ское время).
    • networks — при­вя­зы­ва­ем наш кон­тей­нер к сети. Опци­о­наль­но, но луч­ше опре­де­лять само­му под­сеть. Это упро­ща­ет настрой­ку неко­то­рых сер­ви­сов, напри­мер, мы можем огра­ни­чить доступ для опре­де­лен­ных под­се­тей и не жела­тель­но, что­бы под­се­ти зада­ва­лась слу­чай­ным образом.
  • networks — опи­са­ние для сети. В нашем при­ме­ре исполь­зу­ют­ся стан­дарт­ные настрой­ки, но ука­зы­ва­ет­ся кон­крет­ная под­сеть 172.28.0.0/16.

Сервисы

В дан­ном раз­де­ле рас­смот­рим при­ме­ры настро­ек сер­ви­сов (кон­тей­не­ров). Синтаксис:

1. Созда­ние кон­тей­не­ра из гото­во­го обра­за. Образ ука­зы­ва­ет­ся с помо­щью дирек­ти­вы image:

image: nginx

* в дан­ном при­ме­ре будет взят образ nginx для под­ня­тия контейнера.

2. Сбор­ка кон­тей­не­ра из Dockerfile. Для это­го исполь­зу­ем опцию build:

* где:

  • build — ука­за­ние на необ­хо­ди­мость сбор­ки из Dockerfile.
  • context — путь, где нуж­но искать Dockerfile отно­си­тель­но места, где нахо­дит­ся docker-compose файл.
  • buildno — номер для сборки.

3. Про­брос папок (volumes). Настра­и­ва­ет­ся с помо­щью опции volumes:

* в нашем при­ме­ре мы смон­ти­ру­ем локаль­ный ката­лог /data/mysql на хосте внутрь кон­тей­не­ра в каче­стве ката­ло­га /var/lib/mysql.

4. Рабо­та с пор­та­ми. С помо­щью опции ports мы можем ука­зы­вать, на каких пор­тах дол­жен слу­шать кон­тей­нер и на какие пор­ты долж­ны про­бра­сы­вать­ся запросы:

* в дан­ном при­ме­ре наш кон­тей­нер будет слу­шать запро­сы на пор­ту 8080 и пере­да­вать их внутрь кон­тей­не­ра на порт 80.

5. Пере­мен­ные окру­же­ния. В нашей уни­вер­саль­ной заго­тов­ке мы уже исполь­зо­ва­ли одну систем­ную переменную:

Что­бы пере­дать несколь­ко пере­мен­ных, про­сто их перечисляем:

Для каж­до­го при­ло­же­ния есть свой набор систем­ных пере­мен­ных, кото­рые оно пони­ма­ет и интер­пре­ти­ру­ет. Напри­мер, MYSQL_ROOT_PASSWORD пой­мет СУБД и уста­но­вит зна­че­ние в каче­стве паро­ля для поль­зо­ва­те­ля root.

Так­же систем­ные пере­мен­ные мож­но пере­дать не в сце­на­рии docker-compose, а в фай­ле .env — про­сто созда­дим этот файл в одной дирек­то­рии с фай­лом docker-compose.yml:

vi .env

MYSQL_ROOT_PASSWORD=secret
MYSQL_PWD=secret

6. Зави­си­мо­сти для кон­тей­не­ров. Мы можем ука­зать с помо­щью опции depends_on, от како­го кон­тей­не­ра зави­сит сервис:

* в кон­крет­ном при­ме­ре, кон­тей­нер не запу­стит­ся, пока не под­ни­мет­ся db.

7. Пере­опре­де­лить коман­ду. С помо­щью дирек­ти­вы command мы можем пере­опре­де­лить коман­ду для запус­ка, например:

* в дан­ном при­ме­ре мы запу­стим redis-server с аль­тер­на­тив­ным кон­фи­гу­ра­ци­он­ным файлом.

8. Мет­ки. С помо­щью опции labels мы можем ука­зы­вать допол­ни­тель­ную инфор­ма­цию для ори­ен­ти­ро­ва­ния или филь­тров при поис­ке контейнеров:

* дан­ные могут быть про­из­воль­ные. Обра­ти­те вни­ма­ние, что в каче­стве зна­че­ний мы ука­за­ли пере­мен­ные, кото­рые мож­но про­сто пере­дать из систем­но­го окружения.

Healthcheck

Дан­ная дирек­ти­ва, хоть и явля­ет­ся частью сер­ви­са, мы рас­смот­рим ее в отдель­ном раз­де­ле. Синтаксис:

* где:

  • test — наш скрипт, кото­рый дол­жен вер­нуть 0, если все хоро­шо, или 1 — если все плохо.
  • interval — как часто запус­кать проверку.
  • timeout — как дол­го нуж­но ждать ответа.
  • retries — сколь­ко раз тест дол­жен вер­нуть отри­ца­тель­ный резуль­тат, что­бы кон­тей­нер пере­шел в состо­я­ние «unhealthy».

1. Про­вер­ка рабо­ты веб-пор­та­ла. Рас­смот­рим при­мер, когда сайт при пра­виль­ной рабо­ты дол­жен воз­вра­щать сло­во works:

* в дан­ном при­ме­ре мы запро­сим у наше­го сер­ве­ра стра­ни­цу по http и выве­дем стро­ку, в кото­рой есть сло­во works. Если такой стро­ки не най­дет­ся, коман­да вер­нет код 1.

2. Про­вер­ка СУБД mysql. Про­вер­ку мож­но выпол­нить с помо­щью запро­са SELECT 1. В ком­поз-фай­ле это выгля­дит так:

Networks

Отдель­но рас­смот­рим вари­ан­ты сете­вых настроек.

1. Ука­зать опре­де­лен­ную под­сеть. Зада­ет­ся с помо­щью опции subnet в отдель­ной сек­ции networks. В послед­ней мы созда­ем кон­фи­гу­ра­цию для опре­де­лен­ной сети (в дан­ном при­ме­ре, default). Для кон­крет­но­го сер­ви­са мы так­же зада­ем при­вяз­ку к создан­ной сети default в под­раз­де­ле networks:

* где 172.28.0.0/16 — под­сеть, в кото­рой будут рабо­тать все кон­тей­не­ры, кото­рые при­вя­за­ны к создан­ной сети default.

2. Али­а­сы. Дан­ная настрой­ка поз­во­лит видеть кон­тей­не­ры по аль­тер­на­тив­ным име­нам (по умол­ча­нию, они обна­ру­жи­ва­ют­ся по име­ни кон­тей­не­ра). Настрой­ка ука­зы­ва­ет­ся в под­раз­де­ле networks сервиса:

* в дан­ном при­ме­ре наш кон­тей­нер будет так­же резолвить­ся по име­ни <alternative_name>.

3. Внеш­няя сеть. Если необ­хо­ди­мо, что­бы наши кон­тей­не­ры мог­ли видеть по сети дру­гие кон­тей­не­ры, созда­ем сеть external:

 

Запуск docker-compose

Рас­смот­рим раз­лич­ные при­ме­ры выпол­не­ния коман­ды docker-compose.

1. Посмот­реть версию:

docker-compose --version

2. Созда­ние и запуск контейнеров:

docker-compose up -d

3. Пере­чи­тать файл docker-compose:

docker-compose up -d

* на самом деле, коман­да такая же, как для запус­ка. Систе­ма если опре­де­лит, что есть изме­не­ния, пере­со­здаст контейнер.

4. Оста­но­вить контейнеры:

docker-compose down

5. Оста­но­вить кон­тей­не­ры с уда­ле­ние дан­ных (в volumes):

docker-compose down --volumes