Сервер: Основные команды Docker

Рассмотрим основные команды для работы Docker, а также приведём несколько примеров.

Детальная официальная документация Docker: https://docs.docker.com/

В Windows для ввода команд используйте "Командную строку" (cmd.exe)

В лучших традициях Linux каждая команда Docker имеет встроенную документацию для этого добавьте --help


# Например, документация для команды images
docker images --help



1. Общие команды



2. Команды для управления образами

Образ (Docker Image) — неизменяемая, изолированная файловая система. Содержит всё необходимое для запуска приложения — все зависимости, конфигурации, сценарии, двоичные файлы и т. д. Образ также содержит конфигурацию контейнера: переменные среды, команды по умолчанию для запуска, и другие метаданные.


# Синтаксис
docker image %команда%

# Вывести список всех образов
docker images



3. Команды для управления контейнерами

Контейнер (Docker Container) — это исполняемый экземпляр запущенного образа. Можно создать, запустить, остановить, переместить или удалить контейнер с помощью DockerAPI или CLI. Контейнер можно запускать на локальных машинах, виртуальных машинах или развертывать в облаке. Контейнер может работать на любой ОС. Контейнер изолирован от других контейнеров и запускает собственное программное обеспечение, двоичные файлы и конфигурации.


# Синтаксис
docker container %команда%

# Выводит список запущенных контейнеров
docker ps

# Выводит список всех контейнеров
docker ps -a

# Выводит список id всех контейнеров
docker ps -a -q

# Запуск существующего контейнера 
docker start %container-id%

# Выполнить команду внутри запущенного контейнера
docker exec -it %container-id% /bin/bash 

# Остановка существующего контейнера
docker stop %container-id%

# Удаление существующего контейнера
docker rm %container-id%



4. Команды для управления томами

Том (Docker Volumes) — способ хранения данных, представляющий собой примонтированный каталог хоста к файловой системе контейнера.

Контейнеры могут создавать, обновлять и удалять файлы, но эти изменения теряются при удалении контейнера, и все изменения изолируются в этом контейнере. С помощью томов это можно изменить. Тома предоставляют возможность подключать определенные пути файловой системы контейнера обратно к хост-компьютеру. Если каталог в контейнере смонтирован, то изменения в этом каталоге также видны на хост-компьютере. Если мы смонтируем один и тот же каталог при перезапуске контейнера, мы увидим одни и те же файлы.


# Создать том с именем user-data без контейнера
docker volume create --name user-data

# Вывести список томов
docker volume ls

# Вывести детальную информацию по имени тома
docker inspect user-data

# Запустить контейнер ubuntu и подключить созданный том -v
docker run --rm -v user-data:/data -it ubuntu:22.04 /bin/bash

# Записать случайное число в файл
echo $RANDOM > /data/test

# Прочитать файл
cat /data/test

# В нашем примере это число 
12415

# Теперь нужно запустить любой другой контейнер и подключить тот же том user-data
# Например запустим centos v.8 и попробуем прочитать содержимое того же файла из тома user-data
docker run --rm -v slurm-storage:/data -it centos:8 /bin/bash -c "cat /data/test"

# Получим тот же результат. Задача выполнена - данные были сохранены в томе.
12415



5. Команды для работы портами

Docker запускает сервис изолированно — все порты между хостом и контейнером закрыты. Для доступа к сервису нужно указать сопоставление портов или создать маппинг. Тогда все запросы, проходящие через указанный порт хоста, будут перенаправляться в контейнер. Сопоставление портов делает сервисы контейнера доступными извне.


-p <host_post>:<container_port>

Для примера поднимем сервер и сделаем его доступным в основной ОС через порт 8082.


# 0. Создать каталог и перейти в него
mkdir apache 
cd apache

# 1. Создать файл Dockerfile с содержимым
FROM php:7.4-apache
WORKDIR /var/www/html
COPY . /var/www/html
# разрешить подключение к 80 порту контейнера
EXPOSE 80

# 2. Создать файл index.php с содержимым
printf("Текущее время: %s<br/>", date('H:i:s', time() ) );

# 3. Создать
docker build . --tag apache

# 4. Запустить контейнер с указанием порта хоста и контейнера
docker run --rm -p 8082:80 apache

# 5. Перейти в браузере по адресу http://localhost:8082
# Вывод будет примерно таким
> Текущее время: 09:02:04

# 6. Найти id контейнера и остановить 
docker ps
docker stop %container-id%



6. Команды Docker-Compose

Docker-Compose — это инструмент в составе Docker, который позволяет запускать несколько контейнеров одновременно и маршрутизировать потоки данных между ними. Написан на Python.

При работе в Compose используется конфигурационный файл YAML. Создание и запуск всех служб производится выполнением одной команды.

Для примера поднимем сервер и сделаем редактирование файлов на лету, без ребилда. В конфигурационном файле для Compose укажем 2 сервиса: app и mysql. При этом для сервиса app укажем зависимость (depends_on) от сервиса mysql.


# 0. Создать каталог и перейти в него
mkdir apache2
cd apache2

# 1. Создать файл Dockerfile с содержимым
FROM php:7.4-apache
# указываем рабочий каталог 
WORKDIR /var/www/html
# запускаем обновление по и установку wget
RUN apt-get update
# запускаем установку расширений php для работы с бд
RUN docker-php-ext-install pdo pdo_mysql mysqli
EXPOSE 80

# 2. Создать файл index.php с содержимым
# Выводим текущее время, 
# а также подключаемся в базе данных и выводим её версию
printf("Текущее время: %s\n", date('H:i:s', time() ) );
$mysqli = new mysqli("mysql", "app", "secret", "db");
if( mysqli_connect_errno() )
{
	printf("Не удалось подключиться к mysql: %s<br/>", mysqli_connect_error());
	exit();
}
printf("Версия mysql сервера: %d<br/>", $mysqli->server_version);


# 3. Создать файл docker-compose.yml с содержимым
# В примере запускается только два сервиса app и mysql, 
# на практике файлы конфигурации, конечно, содержат множество сервисов
# Указываем, что монтируется текущий каталог ОС. Это позволит вносить изменения без перестроения/ребилда.
services:
  app:    
    container_name: php-server
    build:
      context: .
    ports:
      - 8082:80
    volumes:
      - .:/var/www/html    
    depends_on:
      - mysql
  mysql:
    image: mysql:8
    container_name: mysql-server-8
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - .:/application      
    restart: "always"
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: db
      MYSQL_USER: app
      MYSQL_PASSWORD: secret     
    ports:
        - "33099:3306"

# 4. Парсинг конфига YML и создание сервисов
docker-compose build

# 5. Запуск сервисов
docker-compose up

# 6. Перейти в браузере по адресу http://localhost:8082
# При изменении файлов в примонтированном каталоге основной ОС ,
# изменения будут сразу применяться в контейнере
# Вывод будет примерно таким
> Текущее время: 09:33:41
> Версия mysql сервера: 80031

Пример получения образа и запуска контейнера:


# 1. Скачать с Dockerhub.com образ Ubuntu 22.04
docker pull ubuntu:22.04

# 2. Создать контейнер образа ubuntu:22.04, запустить его и выполнить команду echo
# после выполнения команды контейнер завершает работу
docker run ubuntu:22.04 echo 'hello from ubuntu v.22.04'

# 3. Запуск контейнера с выполнением неограниченного количества команд
# открыть консоль виртуальной ОС Ubuntu для выполнения команд
docker run -it ubuntu:22.04 /bin/bash

# 4. Запуск контейнера с монтированием локальной директории C:\Users\username\docker
# в запущенной ubuntu будет доступна директория локальной ОС Windows
docker run -it -v C:\Users\username\docker\app:/mounted  ubuntu:22.04 /bin/bash

# 5. Можно добавить флаг --rm
# в таком случае контейнер будет удалён после завершения работы
docker run -it --rm ubuntu:22.04 /bin/bash

# 6. Если открыть новое окно cmd.exe, то команда ps отобразить список запущенных контейнеров
docker ps

# 7. Выход из контейнера
exit

Пример сборки образа с помощью Dockerfile и запуска контейнера:


# 0. Перейти в каталог проекта
cd /Users/username/docker/app

# 1. Создать файл Dockerfile с содержимым
FROM php:7.4-cli
COPY board.php /board.php
RUN chmod +x /board.php
CMD php /board.php

# 2. Создать файл board.php с содержимым
$size = $argv[1] ?? 4;

$board = "";

for( $y = 0; $y < $size; $y++)
{
	for( $x = 0; $x < $size; $x++ )
	{
    	if( ( $x + $y ) % 2 == 0 )
		{
      		$board .= " ";
    	} else {
      		$board .= "#";
    	}
  	}
  	$board .= "\n";
}
echo $board;


# 3. Создание образа с названием kolotun из конфигурационного файла Dockerfile, 
# расположенного в текущей директории (.)
docker build . --tag kolotun

# 4. Запуск и удаление после выполнения
docker run --rm kolotun

# 5. Запуск для выполнения команды ls (просмотра списка файлов)
docker run --rm kolotun ls

# 6. Запуск с параметром для скрипта
docker run --rm kolotun php board.php 10

# 7. Альтернативный файл Dockerfile
FROM php:7.4-cli
COPY board.php /board.php
RUN chmod +x /board.php
ENTRYPOINT ["php", "/board.php"]
CMD  ["4"]

# 8. Пересобираем образом с новым конфигом
docker build . --tag kolotun

# 9. Запуск с параметром для контейнера
docker run --rm kolotun 10


Сервер Docker просмотров: 243