________________________________________________
            /                                                \
           |    _________________________________________     |
           |   |                                         |    |
           |   |  docker ps -a                           |    |
           |   |                                         |    |
           |   |  Docker compose                         |    |
           |   |                                         |    |
           |   |  Dockerfile                             |    |
           |   |                                         |    |
           |   |                                         |    |
           |   |                                         |    |
           |   |                                         |    |
           |   |                                         |    |
           |   |                                         |    |
           |   |                                         |    |
           |   |_________________________________________|    |
           |                                                  |
            \_________________________________________________/
                   \___________________________________/
                ___________________________________________
             _-'    .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  --- `-_
          _-'.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.--.  .-.-.`-_
       _-'.-.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-`__`. .-.-.-.`-_
    _-'.-.-.-.-. .-----.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-----. .-.-.-.-.`-_
 _-'.-.-.-.-.-. .---.-. .-------------------------. .-.---. .---.-.-.-.`-_
:-------------------------------------------------------------------------:
`---._.-------------------------------------------------------------._.---'
      ==Данный пост находится в процессе написания==

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

Запуск через командную строку

Первый способ работы с Docker, база, так сказать. В данном случае работа с контейнерами происходит также как и с большинством программ в Linux- через терминал. После названия программы прописываются ключи и параметры. Самый простой способ запуска контейнера выглядит примерно так:

$ docker run nginx

В данному случае будет загружен из Docker Hub (если это не было сделано ранее) и запущен избранный контейнер (в нашем случае это nginx). Однако, в данном случает пользы от контейнера будет мало. Предлагаю дополнить команду:

docker run -v /opt/mynginx:/usr/share/nginx/html -e NGINX_HOST=balalaika.com -e NGINX_PORT=80 -p 8080:80 -d nginx

Разберём, что же мы сделали:

КлючОписание
-vСвязь локальной директории и директории в контейнере. Этот параметр позволяет сохранить данные приложений в локальной машине, чтобы они не потерялись после удаления контейнера
-pПеренаправить данные с одного порта на другой. В данном примере данные извне приходят на порт 8080 локальной машины и перенаправляются на 80 порт контейнера
-dЗа пустить контейнер как фоновый процесс.
-eПрописать параметры окружения. Их можно использовать в дальнейшем.

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

Применение Docker Compose

По сути, Docker Compose- это способ упростить развёртывание контейнеров. В данном случае создаётся .yml файл, в котором описываются все необходимые инструкции. Docker считывает инструкции из файла и выполняет их. В таком случае отпадает необходимость каждый раз вводить длинные команды в строку и самостоятельно запускать контейнеры по отдельности. Также стоит отметить, что в виде .yml файла инструкции становится проще читать. Приведённая ранее команда в рамках Docker Compose будет выглядеть следующим образом:

web:
  image: nginx
  volumes:
   - /opt/mynginx:/usr/share/nginx/html
  ports:
   - "8080:80"
  environment:
   - NGINX_HOST=balalaika.com
   - NGINX_PORT=80

В одном Docker Compose фале может содержаться несколько инструкций по запуску контейнеров. Это удобно в ситуации, когда запускаются контейнеры, работающие в связке. Для того, чтобы передать запустить Docker Compose, необходимо прописать команду:

docker compose up

Работа с контейнерами

Мало контейнер запустить, его нужно ещё уметь остановить, убить, удалить и так далее. Далее рассмотрим что да как. Далее будут приведены наиболее часто встречающиеся команды:

КомандаОписание
docker psВывести список запущенных контейнеров. Чаще всего используют вместе с ключом -a, что позволяет вывести список не только запущенных, но и остановленных контейнеров
docker imagesВывести список докер-образов, доступных в системе
docker stopОстановить запущенный контейнер
docker killУбить Принудительно остановить контейнер
docker rmУдалить остановленный контейнер
docker rmiУдалить докер-образ
docker execПодключиться к контейнеру.
docker inspectВывести информацию о контейнере

Написание Dockerfile

Docker Swarm

Очень интересная и важная тема в рамках Docekr. Как жаль, что я ей ещё не занимался. Данный раздел будет обновлён в дальнейшем.

Типичный пример работы с Docker:

В моём случае план внедрения какого-либо сервиса выглядит следующим образом:

  1. Найти интересующий нас сервис
  2. Поднять Docker контейнер
  3. Настроить переадресацию портов в роутере
  4. Подключиться к сервису и настроить его

Всё просто и незамысловато. Далее будет приведён пример запуска сервиса Gitea На официальном сайте представлены очень подробные инструкции. Будем следовать им. Первым делом подготовка. Необходимо создать директорию, в которой будем хранить Docker-compose файл:

mkdir gitea && cd gitea 
vim docker-compose.yml

Итак, мы внутри, пока что, пустого файла docker-compose. В необходимо вставить наиболее подходящую для Вас инструкцию. Я остановлюсь на той, которая предлагает использование Gitea в связке с PostgreSQL: ==Не забудьте в данной инструкции сменить стандартные параметры на свои==

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.21.4
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=db:5432
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"
    depends_on:
      - db

  db:
    image: postgres:14
    restart: always
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=gitea
      - POSTGRES_DB=gitea
    networks:
      - gitea
    volumes:
      - ./postgres:/var/lib/postgresql/data

Всё прописали, запускаем:

docker compose up -d

Ждём, пока всё скачается и запустится. Если всё сделано правильно, то по адресу http://localhost:3000/будет доступна страница установки. Прошли все пункты и, собственно, всё. Теперь у нас есть свой собственный сервис, аналогичный GitHub.