Docker · 9 min read · Feb 05, 2026

Управление контейнерами Linux с помощью Docker на Ubuntu - Страница 2

4.2 Создание образов с помощью Dockerfile

Dockerfile использует базовый DSL с инструкциями для создания образов Docker. Затем мы используем команду docker build для создания нового образа из инструкций в Dockerfile. Команда Docker, Inc. также опубликовала учебник по Dockerfile, чтобы помочь вам научиться создавать Dockerfile здесь.

Теперь я создам простой docker файл, который можно будет дополнительно улучшить в соответствии с требованиями пользователя. Сначала создайте директорию, например dir=kishore:

mkdir kishore  
cd kishore

Теперь создайте Dockerfile следующим образом:

vi Dockerfile  

и введите содержимое следующим образом:

| FROM ubuntu:12.04 MAINTAINER Srijan Kishore <[email protected]> RUN apt-get -qq update RUN apt-get -qqy install apache2 |

Теперь, чтобы открыть настроенный контейнер, используйте:

sudo docker build -t="srijan/custom1" .

Это даст следующий результат:

srijan@vboxtest:~/kishore$ sudo docker build -t="srijan/custom1" .
[sudo] пароль для srijan: 
Отправка контекста сборки демону Docker  2.56 kB
Отправка контекста сборки демону Docker 
Шаг 0 : FROM ubuntu:12.04
Получение репозитория ubuntu
ea7d6801c538: Загрузка завершена 
511136ea3c5a: Загрузка завершена 
65b7e9ccb809: Загрузка завершена 
f8dd6bd14f58: Загрузка завершена 
a343823119db: Загрузка завершена 
 ---> ea7d6801c538
Шаг 1 : MAINTAINER Srijan Kishore <[email protected]>
 ---> Выполнение в a6135f405eb4
 ---> be97c22efa82
Удаление промежуточного контейнера a6135f405eb4
Шаг 2 : RUN apt-get -qq update
 ---> Выполнение в b5681cd85ba8
 ---> cbc3a95de894
Удаление промежуточного контейнера b5681cd85ba8
Шаг 3 : RUN apt-get -qqy install apache2
 ---> Выполнение в 5765c09b530f
debconf: задержка конфигурации пакета, так как apt-utils не установлен
Выбор ранее не выбранного пакета libsqlite3-0.
(Чтение базы данных ... 7551 файлов и каталогов в настоящее время установлено.)
Распаковка libsqlite3-0 (из .../libsqlite3-0_3.7.9-2ubuntu1.1_amd64.deb) ...
Выбор ранее не выбранного пакета libroken18-heimdal.
Распаковка libroken18-heimdal (из .../libroken18-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libasn1-8-heimdal.
Распаковка libasn1-8-heimdal (из .../libasn1-8-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libgpg-error0.
Распаковка libgpg-error0 (из .../libgpg-error0_1.10-2ubuntu1_amd64.deb) ...
Выбор ранее не выбранного пакета libgcrypt11.
Распаковка libgcrypt11 (из .../libgcrypt11_1.5.0-3ubuntu0.2_amd64.deb) ...
Выбор ранее не выбранного пакета libgdbm3.
Распаковка libgdbm3 (из .../libgdbm3_1.8.3-10_amd64.deb) ...
Выбор ранее не выбранного пакета libp11-kit0.
Распаковка libp11-kit0 (из .../libp11-kit0_0.12-2ubuntu1_amd64.deb) ...
Выбор ранее не выбранного пакета libtasn1-3.
Распаковка libtasn1-3 (из .../libtasn1-3_2.10-1ubuntu1.1_amd64.deb) ...
Выбор ранее не выбранного пакета libgnutls26.
Распаковка libgnutls26 (из .../libgnutls26_2.12.14-5ubuntu3.8_amd64.deb) ...
Выбор ранее не выбранного пакета libhcrypto4-heimdal.
Распаковка libhcrypto4-heimdal (из .../libhcrypto4-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libheimbase1-heimdal.
Распаковка libheimbase1-heimdal (из .../libheimbase1-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libwind0-heimdal.
Распаковка libwind0-heimdal (из .../libwind0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libhx509-5-heimdal.
Распаковка libhx509-5-heimdal (из .../libhx509-5-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libkrb5-26-heimdal.
Распаковка libkrb5-26-heimdal (из .../libkrb5-26-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libheimntlm0-heimdal.
Распаковка libheimntlm0-heimdal (из .../libheimntlm0-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libgssapi3-heimdal.
Распаковка libgssapi3-heimdal (из .../libgssapi3-heimdal_1.6~git20120311.dfsg.1-2ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libsasl2-2.
Распаковка libsasl2-2 (из .../libsasl2-2_2.1.25.dfsg1-3ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета libldap-2.4-2.
Распаковка libldap-2.4-2 (из .../libldap-2.4-2_2.4.28-1.1ubuntu4.4_amd64.deb) ...
Выбор ранее не выбранного пакета libcap2.
Распаковка libcap2 (из .../libcap2_1%3a2.22-1ubuntu3_amd64.deb) ...
Выбор ранее не выбранного пакета libexpat1.
Распаковка libexpat1 (из .../libexpat1_2.0.1-7.2ubuntu1.1_amd64.deb) ...
Выбор ранее не выбранного пакета libmagic1.
Распаковка libmagic1 (из .../libmagic1_5.09-2ubuntu0.3_amd64.deb) ...
Выбор ранее не выбранного пакета file.
Распаковка file (из .../file_5.09-2ubuntu0.3_amd64.deb) ...
Выбор ранее не выбранного пакета mime-support.
Распаковка mime-support (из .../mime-support_3.51-1ubuntu1_all.deb) ...
Выбор ранее не выбранного пакета netbase.
Распаковка netbase (из .../netbase_4.47ubuntu1_all.deb) ...
Выбор ранее не выбранного пакета libsasl2-modules.
Распаковка libsasl2-modules (из .../libsasl2-modules_2.1.25.dfsg1-3ubuntu0.1_amd64.deb) ...
Выбор ранее не выбранного пакета openssl.
Распаковка openssl (из .../openssl_1.0.1-4ubuntu5.16_amd64.deb) ...
Выбор ранее не выбранного пакета libapr1.
Распаковка libapr1 (из .../libapr1_1.4.6-1_amd64.deb) ...
Выбор ранее не выбранного пакета libaprutil1.
Распаковка libaprutil1 (из .../libaprutil1_1.3.12+dfsg-3_amd64.deb) ...
Выбор ранее не выбранного пакета libaprutil1-dbd-sqlite3.
Распаковка libaprutil1-dbd-sqlite3 (из .../libaprutil1-dbd-sqlite3_1.3.12+dfsg-3_amd64.deb) ...
Выбор ранее не выбранного пакета libaprutil1-ldap.
Распаковка libaprutil1-ldap (из .../libaprutil1-ldap_1.3.12+dfsg-3_amd64.deb) ...
Выбор ранее не выбранного пакета apache2.2-bin.
Распаковка apache2.2-bin (из .../apache2.2-bin_2.2.22-1ubuntu1.6_amd64.deb) ...
Выбор ранее не выбранного пакета apache2-utils.
Распаковка apache2-utils (из .../apache2-utils_2.2.22-1ubuntu1.6_amd64.deb) ...
Выбор ранее не выбранного пакета libswitch-perl.
Распаковка libswitch-perl (из .../libswitch-perl_2.16-2_all.deb) ...
Выбор ранее не выбранного пакета libclass-isa-perl.
Распаковка libclass-isa-perl (из .../libclass-isa-perl_0.36-3_all.deb) ...
Выбор ранее не выбранного пакета perl-modules.
Распаковка perl-modules (из .../perl-modules_5.14.2-6ubuntu2.4_all.deb) ...
Выбор ранее не выбранного пакета perl.
Распаковка perl (из .../perl_5.14.2-6ubuntu2.4_amd64.deb) ...
Выбор ранее не выбранного пакета apache2.2-common.
Распаковка apache2.2-common (из .../apache2.2-common_2.2.22-1ubuntu1.6_amd64.deb) ...
Выбор ранее не выбранного пакета apache2-mpm-worker.
Распаковка apache2-mpm-worker (из .../apache2-mpm-worker_2.2.22-1ubuntu1.6_amd64.deb) ...
Выбор ранее не выбранного пакета apache2.
Распаковка apache2 (из .../apache2_2.2.22-1ubuntu1.6_amd64.deb) ...
Выбор ранее не выбранного пакета ssl-cert.
Распаковка ssl-cert (из .../ssl-cert_1.0.28ubuntu0.1_all.deb) ...
Настройка libsqlite3-0 (3.7.9-2ubuntu1.1) ...
Настройка libroken18-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Настройка libasn1-8-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Настройка libgpg-error0 (1.10-2ubuntu1) ...
Настройка libgcrypt11 (1.5.0-3ubuntu0.2) ...
Настройка libgdbm3 (1.8.3-10) ...
Настройка libp11-kit0 (0.12-2ubuntu1) ...
Настройка libtasn1-3 (2.10-1ubuntu1.1) ...
Настройка libgnutls26 (2.12.14-5ubuntu3.8) ...
Настройка libhcrypto4-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Настройка libheimbase1-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Настройка libwind0-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Настройка libhx509-5-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Настройка libkrb5-26-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Настройка libheimntlm0-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Настройка libgssapi3-heimdal (1.6~git20120311.dfsg.1-2ubuntu0.1) ...
Настройка libsasl2-2 (2.1.25.dfsg1-3ubuntu0.1) ...
Настройка libldap-2.4-2 (2.4.28-1.1ubuntu4.4) ...
Настройка libcap2 (1:2.22-1ubuntu3) ...
Настройка libexpat1 (2.0.1-7.2ubuntu1.1) ...
Настройка libmagic1 (5.09-2ubuntu0.3) ...
Настройка file (5.09-2ubuntu0.3) ...
Настройка mime-support (3.51-1ubuntu1) ...
update-alternatives: использование /usr/bin/see для предоставления /usr/bin/view (view) в автоматическом режиме.
Настройка netbase (4.47ubuntu1) ...
Настройка libsasl2-modules (2.1.25.dfsg1-3ubuntu0.1) ...
Настройка openssl (1.0.1-4ubuntu5.16) ...
Настройка libapr1 (1.4.6-1) ...
Настройка libaprutil1 (1.3.12+dfsg-3) ...
Настройка libaprutil1-dbd-sqlite3 (1.3.12+dfsg-3) ...
Настройка libaprutil1-ldap (1.3.12+dfsg-3) ...
Настройка apache2.2-bin (2.2.22-1ubuntu1.6) ...
Настройка apache2-utils (2.2.22-1ubuntu1.6) ...
Настройка libclass-isa-perl (0.36-3) ...
Настройка ssl-cert (1.0.28ubuntu0.1) ...
debconf: невозможно инициализировать интерфейс: Диалог
debconf: (TERM не установлен, поэтому интерфейс диалога не может быть использован.)
debconf: переход на интерфейс: Readline
debconf: невозможно инициализировать интерфейс: Readline
debconf: (Этот интерфейс требует управляющего tty.)
debconf: переход на интерфейс: Teletype
Настройка libswitch-perl (2.16-2) ...
Настройка perl-modules (5.14.2-6ubuntu2.4) ...
Настройка perl (5.14.2-6ubuntu2.4) ...
update-alternatives: использование /usr/bin/prename для предоставления /usr/bin/rename (rename) в автоматическом режиме.
Настройка apache2.2-common (2.2.22-1ubuntu1.6) ...
Включение сайта по умолчанию.
Включение модуля alias.
Включение модуля autoindex.
Включение модуля dir.
Включение модуля env.
Включение модуля mime.
Включение модуля negotiation.
Включение модуля setenvif.
Включение модуля status.
Включение модуля auth_basic.
Включение модуля deflate.
Включение модуля authz_default.
Включение модуля authz_user.
Включение модуля authz_groupfile.
Включение модуля authn_file.
Включение модуля authz_host.
Включение модуля reqtimeout.
Настройка apache2-mpm-worker (2.2.22-1ubuntu1.6) ...
invoke-rc.d: policy-rc.d отказал в выполнении старта.
Настройка apache2 (2.2.22-1ubuntu1.6) ...
Обработка триггеров для libc-bin ...
ldconfig отложенная обработка теперь происходит
 ---> 634855a43331
Удаление промежуточного контейнера 5765c09b530f
Успешно создан 634855a43331
srijan@vboxtest:~/kishore$

Теперь давайте взглянем на наш новый образ. Мы можем сделать это, используя команду docker images.

docker images srijan/custom1
srijan@vboxtest:~/kishore$ docker images srijan/custom1
РЕПОЗИТОРИЙ          ТЕГ                 ID ОБРАЗА            СОЗДАН              ВИРТУАЛЬНЫЙ РАЗМЕР
srijan/custom1      latest              634855a43331        Около минуты назад   277.4 MB
srijan@vboxtest:~/kishore$

Здесь вы увидите, что образы по умолчанию будут иметь установленный apache2. Давайте проверим это:

docker run -t -i srijan/apache2:webserver /bin/bash

Теперь вы попадете в новый контейнер с предустановленным apache2 на 12.04ubuntu.

5 Изменение имени хоста

Предположим, вы хотите изменить имя хоста или хотите настроенное имя хоста, например в моем случае server1.example.com.

Я буду использовать

docker run -h 'server1.example.com' -t -i srijan/custom1 /bin/bash

Это даст контейнер образа как

srijan@vboxtest:~/kishore$ docker run -h 'server1.example.com' -t -i srijan/custom1 /bin/bash
root@server1:/# hostname -f
server1.example.com
root@server1:/#

6 Полезные команды для docker

  • pull (pull используется для загрузки образа или репозитория из реестра)
    например.
docker run -i -t ubuntu /bin/bash
  • commit (commit используется для сохранения контейнера)
    например.
docker commit 73527b8b4261 srijan/apache2 8ce0ea7a1528
  • cp (Копировать файлы/каталоги из файловой системы контейнера в путь хоста. Пути относительны к корню файловой системы.)
    например.
docker cp CONTAINER:PATH HOSTPATH

где CONTAINER - это контейнер и копирует файлы/каталоги из PATH в HOSTPATH

  • start и stop контейнера:
docker start 4386fb97867d
docker stop 4386fb97867d

где 4386fb97867d - это номер вашего контейнера

  • export (Экспортировать содержимое файловой системы в виде tar-архива в STDOUT)
docker export 4386fb97867d > latest.tar
  • import (Создать пустой образ файловой системы и импортировать содержимое tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) в него, затем, при необходимости, тегировать его.)
docker import http://example.com/exampleimage.tgz

Импорт из локального файла:
Импорт в docker через pipe и stdin.

cat exampleimage.tgz | sudo docker import - exampleimagelocal:new

Импорт из локального каталога:

sudo tar -c . | sudo docker import - exampleimagedir

  • history (Показать историю образа)
docker history [OPTIONS] IMAGE
sudo docker history  ea7d6801c538
  • images (Покажет образы)
docker images [OPTIONS] [NAME]

Он имеет некоторые параметры:

-a, –all=false Показать все образы (по умолчанию фильтруются промежуточные слои образов)
-f, –filter=[]: Предоставить значения фильтра (т.е. ‘dangling=true’)
–no-trunc=false Не обрезать вывод
-q, –quiet=false Показать только числовые ID

  • info (Отобразить информацию по всей системе)
srijan@VE130214:~$ sudo docker info
srijan@vboxtest:~$ sudo docker info
Контейнеры: 20
Образы: 65
Драйвер хранения: aufs
 Корневая директория: /var/lib/docker/aufs
 Директории: 105
Драйвер выполнения: native-0.2
Версия ядра: 3.13.0-30-generic
ПРЕДУПРЕЖДЕНИЕ: Поддержка ограничения обмена не поддерживается
  • inspect (Вернуть низкоуровневую информацию о контейнере/образе)
docker inspect CONTAINER|IMAGE [CONTAINER|IMAGE...]
  • kill (Убить работающий контейнер/отправить SIGKILL или указанный сигнал)
docker kill [OPTIONS] CONTAINER [CONTAINER...]
  • login (Зарегистрироваться или войти на сервер реестра docker, если сервер не указан, “ https://index.docker.io/v1/ “ является значением по умолчанию.)
docker login localhost:8080  

Это войдет в самохостимый реестр.

  • logs (Получить логи контейнера)
docker logs CONTAINER
  • ps (Список контейнеров)
docker ps [OPTIONS]

Он имеет параметры:

-a, –all=false Показать все контейнеры. По умолчанию показываются только работающие контейнеры.
–before=”” Показать только контейнер, созданный до Id или имени, включая неработающие.
-l, –latest=false Показать только последний созданный контейнер, включая неработающие.
-n=-1 Показать n последних созданных контейнеров, включая неработающие.
–no-trunc=false Не обрезать вывод
-q, –quiet=false Показать только числовые ID
-s, –size=false Показать размеры
–since=”” Показать только контейнеры, созданные с Id или имени, включая неработающие.

  • push (Отправить образ или репозиторий в реестр)
docker push NAME[:TAG]
  • restart (Перезапустит работающий контейнер)
docker restart [OPTIONS] CONTAINER [CONTAINER...]
  • rm (Удалит один или несколько контейнеров)
docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • rmi (Удалит один или несколько образов)
docker rmi IMAGE [IMAGE...]
  • run (Запустить команду в новом контейнере)
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Он имеет следующие параметры:

-a, –attach=[] Присоединиться к stdin, stdout или stderr.
-c, –cpu-shares=0 Доля CPU (относительный вес)
–cidfile=”” Записать ID контейнера в файл
-d, –detach=false Режим отсоединения: Запустить контейнер в фоновом режиме, напечатать новый ID контейнера
–dns=[] Установить пользовательские dns-серверы
–dns-search=[] Установить пользовательские домены поиска dns
-e, –env=[] Установить переменные окружения
–entrypoint=”” Перезаписать точку входа по умолчанию образа
–env-file=[] Прочитать файл переменных ENV, разделенных строками
–expose=[] Открыть порт из контейнера без публикации его на вашем хосте
-h, –hostname=”” Имя хоста контейнера
-i, –interactive=false Держать stdin открытым, даже если не подключен
–link=[] Добавить ссылку на другой контейнер (имя:псевдоним)
–lxc-conf=[] (только драйвер выполнения lxc) Добавить пользовательские параметры lxc –lxc-conf=”lxc.cgroup.cpuset.cpus = 0,1”
-m, –memory=”” Ограничение памяти (формат: <число><необязательная единица>, где единица = b, k, m или g)
–name=”” Назначить имя контейнеру
–net=”bridge” Установить сетевой режим для контейнера
‘bridge’: создает новый стек сети для контейнера на мосту docker
‘none’: нет сетевого подключения для этого контейнера
‘container:’: повторно использует стек сети другого контейнера
‘host’: использовать стек сети хоста внутри контейнера
-p, –publish=[] Опубликовать порт контейнера на хосте
формат: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
(используйте ‘docker port’, чтобы увидеть фактическое сопоставление)
-P, –publish-all=false Опубликовать все открытые порты на интерфейсах хоста
–privileged=false Предоставить расширенные привилегии этому контейнеру
–rm=false Автоматически удалить контейнер, когда он выйдет (несовместимо с -d)
–sig-proxy=true Проксировать все полученные сигналы процессу (даже в режиме без tty)
-t, –tty=false Выделить псевдо-tty
-u, –user=”” Имя пользователя или UID
-v, –volume=[] Привязать том (например, с хоста: -v /host:/container, из docker: -v /container)
–volumes-from=[] Смонтировать тома из указанных контейнеров
-w, –workdir=”” Рабочий каталог внутри контейнера

  • save (Сохранить образ в tar-архив (по умолчанию передается в stdout)
docker save IMAGE
  • search (Искать в индексе docker образы)
docker search TERM
  • tag (Тегировать образ в репозитории)
docker tag [OPTIONS] IMAGE [REGISTRYHOST/][USERNAME/]NAME[:TAG]
  • top (Посмотреть запущенные процессы контейнера)
docker top CONTAINER [ps OPTIONS]
  • version (Показать информацию о версии docker.)
sudo docker version
srijan@vboxtest:~$ sudo docker version
[sudo] пароль для srijan: 
Версия клиента: 1.0.1
Версия API клиента: 1.12
Версия Go (клиент): go1.2.1
Git commit (клиент): 990021a
Версия сервера: 1.0.1
Версия API сервера: 1.12
Версия Go (сервер): go1.2.1
Git commit (сервер): 990021a

6 Резюме

Я постарался сделать вас более знакомыми с docker, надеюсь, этот гид поможет вам понять docker и использовать docker в ваших тестовых/продуктивных средах.

Для получения дополнительной информации смотрите http://www.docker.com/

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.