1276 Nov. 21, 2022, 2:22 p.m.

Шпаргалка по docker & docker-compose (Debian 11)

Задачи:

  1. Установить docker и docker-compose
  2. Создать Dockerfile
  3. Объединить несколько образов с помощью docker-compose

Установка

apt update
apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list  /dev/null
apt update
apt-cache policy docker-ce
apt install docker-ce docker-compose

Если не работает, то необходимо его перезапустить, после установки docker-compose единоразово может выпать в ошибку.

systemctl status docker 

Базовые команды docker

docker -v 

Список рабочих контейнеров

docker ps

Список всех контейнеров

docker ps -a

Список образов

docker images

Поиск образа в репозитории hub.docker.com

docker search nginx

Скачивание ИЛИ обновление образа

docker pull nginx

Запуск с отображением состояния контейнера

docker run -it -p 80:80 nginx:latest

Запуск в фоновом режиме

docker run -d -p 80:80 nginx:latest

Создание копии контейнера с другим тегом

docker tag nginx:v1 nginx:v2

Сборка контейнера из Dockerfile в текущей директории

docker build -t customimage:latest .

Команды для удаления всех контейнеров и образов

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
yes| docker container prune
docker rmi $(docker images -q)
docker images -q |xargs docker rmi
docker volume rm $(docker volume ls -q)

Команды для входа в контейнер и сохранения изменений

$docker exec -it bash

если нужно сохранить изменения:

$docker commit updated_image:v3

Создание Dockerfile – пример

# Исходный образ для создания контейнера
FROM debian:latest 

# Копирование дополнительных файлов с конфигурациями nginx.conf & entrypoint.sh
COPY conf /conf

# Запуск процедуры сборки контейнера, первым шагом идет установка часового пояса, далее установка nginx+php8.0 _fpm, установка даты и времени в php, скачивание(последней версии)-разархивирование-установка прав доступа на phpMyAdmin. И только в конце устанавливаются файлы конфигурации, в противном случае процесс сборки контейнера закончится с ошибкой.
RUN cp /usr/share/zoneinfo/Asia/Yekaterinburg /etc/localtime \ 
 && apt-get update \
 && apt-get install -y \ 
 ca-certificates \
 apt-transport-https \
 software-properties-common \
 wget \
 curl \
 nginx \
 gpg \
 lsb-release \
 && wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg \
 && sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' \
 && apt-get update \
 && apt-get install -y \ 
 php8.0-fpm \
 php8.0-common \
 php8.0-mysql \
 php8.0-zip \
 php8.0-gd \
 php8.0-mbstring \
 php8.0-curl \
 php8.0-xml \
 php-pear \
 php8.0-bcmath \ 
  && echo "timezone = Asia/Yekaterinburg" >> /etc/php/8.0/php.ini \ 
 && wget https://sourceforge.net/projects/postfixadmin/files/postfixadmin-3.3.8/PostfixAdmin%203.3.8.tar.gz -O PostfixAdmin-tar.gz \
 && tar xvf PostfixAdmin-tar.gz --strip-components=1 -C /var/www/html/ \
 && rm PostfixAdmin-tar.gz \
 && mkdir /var/www/html/templates_c \
 && mv /conf/entrypoint.sh /entrypoint.sh \
 && mv /conf/nginx.conf /etc/nginx/nginx.conf \
 && rm -R /conf \
 && chown -R www-data:www-data /var/www/html \
 && chmod -R 500 /var/www/html \
 && chmod -R 700 /var/www/html/templates_c/ \
 && chmod a+x /entrypoint.sh

# Указание стартового скрипта с которого будет начинаться каждый запуск контейнера
ENTRYPOINT ["/entrypoint.sh"]

# Открытие порта внутри контейнера
EXPOSE 80

Создание файла entrypoint.sh

#!/bin/bash
echo "Start nginx & php-fpm"
nginx
service php8.0-fpm start

# Выдача логов, если данный параметр убрать то контейнер после запуска будет сразу завершатся.
tail -f /var/log/nginx/error.log

Объединение контейнеров в docker-compose

# Версия docker-compose
version: '3'
# Список наших сервисов (контейнеров)
services:
    phpmyadmin:
        restart: always
        image: h963z57/phpmyadmin:main
        # маршрутизируем порты
        ports:
            - "83:80"
        # монтируем директории, слева директории на основной машине, справа - куда они монтируются в контейнере
        volumes:
            - /mnt/cfg/phpMyAdmin.config.inc.php:/var/www/html/config.inc.php:ro
    postfixadmin:
        restart: always
        image: h963z57/postfixadmin:main
        # маршрутизируем порты
        ports:
            - "84:80"
        # монтируем директории, слева директории на основной машине, справа - куда они монтируются в контейнере
        volumes:
            - /mnt/cfg/poftfixadmin.config.php:/var/www/html/config.inc.php:ro

Источники