🐳 Управление Docker контейнерами с помощью Docker Compose

by itisgood
Если ваш проект / приложение использует несколько контейнеров, то будет неразумно пытаться запускать контейнеры по отдельность и затем их связывать.
Это возможно, но утомительно, приносит сложность в масштабировании и не является одной из рекомендаций DevOps.
Так что тут приходит на помощь Docker-compose.
Docker-compose позволяет запускать несколько контейнеров, связывать их и определять различные свойства контейнера в одном файле.
Этот файл называется docker-compose.yml.

Файл Docker-compose

Этот файл содержит все определенные свойства контейнера и их образа, которые будут использоваться в указанном проекте / приложении.
С годами он изменился с версии 1 на версию 3.
Поэтому необходимо указать, какую версию вы используете в начале каждого файла docker-compose.yml.
Файлы Docker-compose написаны в формате YAML и имеют формат docker-compose.yml.
Типичный файл docker-compose выглядит так:
version: "3"
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: zuri
      POSTGRES_DB: zuri
      POSTGRES_PASS: zuri1234
    volumes:
      - pgdata:/var/lib/posgresql/data
  zuri:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./zuri:/zuri
    command: python manage.py runserver 0.0.0.0:8000
    depends_on:
      - db
volumes:
  pgdata:

Файл docker-compose состоит из различных компонентов.

Я не буду говорить обо всех из них, но затрону некоторые важные.

По сути, файл compose определяет сервисы, которые контролируют контейнеры.

Из приведенного выше примера видно, что у меня есть две службы: db и zuri.

Служба db – это мой контейнер базы данных, а служба zuri – мой проект.

Эти две сущности общаются через свойство depends_on, что говорит docker-compose создать сервис, если он не существует при запуске сервиса zuri.

Под каждой службой вы можете определить множество свойств, таких как порты, тома для использования, сеть и т. д.

Конечно, каждый контейнер использует образ, и поэтому вы можете напрямую определить образ в файле docker-compose или указать используемый Dockerfile.

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

Но у службы базы данных есть образ, определенный Postgres.

Вот docker file службы zuri:

#base image
FROM python:3

#maintainer
LABEL Author="CodeGenes"

# The enviroment variable ensures that the python output is set straight
# to the terminal with out buffering it first
ENV PYTHONBUFFERED 1

#directory to store app source code
RUN mkdir /zuri

#switch to /app directory so that everything runs from here
WORKDIR /zuri

#copy the app code to image working directory
COPY ./zuri /zuri

#let pip install required packages
RUN pip install -r requirements.txt

Жизненный цикл Docker контейнера

Контейнеры Docker эфемерны, то есть они удаляются при удалении контейнера.
Их статус зависит от статуса приложений, которые они размещают.
Различные состояния включают в себя:
Создать контейнер $ docker create –name <container-name> <image-name>
Запустить контейнер $ docker run -it -d –name <container-name> <image-name>
Пауза контейнера $ docker pause <container-id/name>
Снять с паузы $ docker unpause <container-id/name>
Стартануть контейнер $ docker start <container-id/name>
Остановить контейнер $ docker stop <container-id/name>
Перезапустить контейнер $ docker restart <container-id/name>
Убить контейнер $docker kill <container-id/name>
Удалить / очистить контейнер $docker rm <container-id/name>

Разница между Docker run и Docker start

Run: создать новый контейнер из образа и выполнить его.
Вы можете создать N клонов одного образа.
Команда: Docker run IMAGE_ID, а не Docker run CONTAINER_ID
Start: запуск контейнера, остановленного ранее.
Например, если вы остановили базу данных с помощью команды docker stop CONTAINER_ID, вы можете перезапустить тот же контейнер с помощью команды docker start CONTAINER_ID, и данные и настройки будут такими же.

Команды Docker-compose

Конечно, его основная задача в том, чтобы управлять контейнерами и он содержит различные команды для управления всем жизненным циклом контейнеров.
Некоторые из команд включают в себя запуск, остановку, сборку представления и т.д.
Чтобы просмотреть эти команды и их действия, запустите их на своем терминале:
$ docker-compose --help
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

Docker-compose run, up, exec – какая разница?

Что ж, когда я начал использовать docker, я заметил, что в руководствах часто использовались docker-compose up, docker-compose run и docker-compose exec, в основном без объяснений.

Я знаю, что вы можете просто прочитать разницу в документах командной справки, но иногда полезно полностью оценить разницу, копая немного глубже.

Docker Compose Up

Эта команда используется, когда вы хотите запустить или вызвать все службы в вашем файле docker-compose.yml.
Файл Docker-compose.yml определяет ваши сервисы, их свойства, переменные и зависимости.
$ docker-compose up

Для просмотра запущенных контейнеров:

$ docker-compose ps
Вы также можете указать docker-compose запустить только один сервис, например
$ docker-compose up zuri

Docker Compose Run

Эта команда раскрутит новый контейнер.

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

$ docker-compose run zuri python manage.py migrate

Docker Compose Exec

Эта команда используется, когда вы хотите взаимодействовать с уже запущенным контейнером.

Поэтому его необходимо запускать с аргументом.

Перед выполнением контейнер должен быть в рабочем состоянии!

Вот и все пока.

Как всегда, комментарии привествуются!

You may also like

Leave a Comment