- Create a base image
- Create a full image using tar
- Create a simple parent image using scratch
- More resources
- Создание собственного образа Docker
- Установка Docker
- Red Hat/CentOS
- Debian/Ubuntu
- После установки
- Сборка нового образа
- Редактирование образа
- Загрузка образа на Docker Hub
- Описание инструкций Dockerfile
- Импорт и экспорт образа
- Создание резерва (экспорт)
- Восстановление
- Volume
- Дополнительные команды
Create a base image
Most Dockerfiles start from a parent image. If you need to completely control the contents of your image, you might need to create a base image instead. Here’s the difference:
- A parent image is the image that your image is based on. It refers to the contents of the FROM directive in the Dockerfile. Each subsequent declaration in the Dockerfile modifies this parent image. Most Dockerfiles start from a parent image, rather than a base image. However, the terms are sometimes used interchangeably.
- A base image has FROM scratch in its Dockerfile.
This topic shows you several ways to create a base image. The specific process will depend heavily on the Linux distribution you want to package. We have some examples below, and you are encouraged to submit pull requests to contribute new ones.
Create a full image using tar
In general, start with a working machine that is running the distribution you’d like to package as a parent image, though that is not required for some tools like Debian’s Debootstrap, which you can also use to build Ubuntu images.
It can be as simple as this to create an Ubuntu parent image:
$ sudo debootstrap focal focal > /dev/null $ sudo tar -C focal -c . | docker import - focal sha256:81ec9a55a92a5618161f68ae691d092bf14d700129093158297b3d01593f4ee3 $ docker run focal cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04 LTS"
There are more example scripts for creating parent images in the Docker GitHub repository.
Create a simple parent image using scratch
You can use Docker’s reserved, minimal image, scratch , as a starting point for building containers. Using the scratch “image” signals to the build process that you want the next command in the Dockerfile to be the first filesystem layer in your image.
While scratch appears in Docker’s repository on the hub, you can’t pull it, run it, or tag any image with the name scratch . Instead, you can refer to it in your Dockerfile . For example, to create a minimal container using scratch :
# syntax=docker/dockerfile:1 FROM scratch ADD hello / CMD ["/hello"]
Assuming you built the “hello” executable example by using the source code at https://github.com/docker-library/hello-world, and you compiled it with the -static flag, you can build this Docker image using this docker build command:
Don’t forget the . character at the end, which sets the build context to the current directory.
Note: Because Docker Desktop for Mac and Docker Desktop for Windows use a Linux VM, you need a Linux binary, rather than a Mac or Windows binary. You can use a Docker container to build it:
$ docker run --rm -it -v $PWD:/build ubuntu:20.04 container# apt-get update && apt-get install build-essential container# cd /build container# gcc -o hello -static hello.c
To run your new image, use the docker run command:
This example creates the hello-world image used in the tutorials. If you want to test it out, you can clone the image repo.
More resources
There are lots of resources available to help you write your Dockerfile .
- There’s a complete guide to all the instructions available for use in a Dockerfile in the reference section.
- To help you write a clear, readable, maintainable Dockerfile , we’ve also written a Dockerfile best practices guide.
- If your goal is to create a new Docker Official Image, read Docker Official Images.
Создание собственного образа Docker
Обновлено: 17.03.2023 Опубликовано: 29.06.2019
Тематические термины: Docker, Linux. Docker позволяет не только загружать и использовать готовые контейнеры, но создавать свои. В данной инструкции мы пошагово разберем установку Docker на Linux, создание собственного образа и загрузку его на Docker Hub.
Установка Docker
Red Hat/CentOS
* если система вернет ошибку, устанавливаем wget командой yum install wget. . и переносим его в каталог yum.repos.d:
Если система вернет ошибку Необходимо: container-selinux >= . , переходим на страницу пакетов CentOS, находим нужную версию container-selinux и копируем на него ссылку: . с помощью данной ссылки выполняем установку:
yum install http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.99-1.el7_6.noarch.rpm
Debian/Ubuntu
После установки
Сборка нового образа
Сборка начинается с создания файла Dockerfile — он содержит инструкции того, что должно быть в контейнере. В качестве примера, соберем свой веб-сервер nginx. И так, чтобы создать свой образ с нуля, создаем каталог для размещения Dockerfile:
* где /opt/docker/mynginx — полный путь до каталога, где будем создавать образ. . переходим в данный каталог:
RUN yum install -y epel-release && yum install -y nginx
RUN yum clean all
RUN echo «daemon off;» >> /etc/nginx/nginx.conf
RUN sed -i «0,/nginx/s/nginx/docker-nginx/i» /usr/share/nginx/html/index.html
- используем базовый образ centos 7;
- в качестве автора образа указываем Dmitriy Mosk;
- задаем временную зону внутри контейнера Europe/Moscow.
- устанавливаем epel-release и nginx;
- чистим систему от метаданных и кэша пакетов после установки;
- указываем nginx запускаться на переднем плане (daemon off);
- в индексном файле меняем первое вхождение nginx на docker-nginx;
- запускаем nginx.
* подробное описание инструкций Dockerfile смотрите ниже.
docker build -t dmosk/nginx:v1 .
* где dmosk — имя автора; nginx — название для сборки; v1 — тег с указанием версии. Точка на конце указывает, что поиск Dockerfile выполняем в текущей директории.
. начнется процесс сборки образа — после его завершения мы должны увидеть что-то на подобие:
Successfully built eae801eaeff2
Successfully tagged dmosk/nginx:v1
Посмотреть список образов можно командой:
Создаем и запускаем контейнер из образа:
docker run -d -p 8080:80 dmosk/nginx:v1
* в данном примере мы запустим контейнер из образа dmosk/nginx:v1 и укажем, что необходимо опубликовать внешний порт 8080, который будет перенаправлять трафик на порт 80 внутри контейнера.
Открываем браузер и переходим по адресу http://:8080 — мы должны увидеть страницу приветствия с нашим docker-nginx:
Посмотреть созданные контейнеры можно командой:
Запустить или остановить контейнеры можно командами:
docker start 5fe78aca2e1d
* где 5fe78aca2e1d — идентификатор контейнера.
Редактирование образа
В примере выше мы рассмотрели создание нового образа с нуля. Также, мы можем взять любой другой образ, отредактировать его и сохранить под своим названием.
Скачаем образ операционной системы CentOS:
Войдем в скачанный образ для его изменения:
docker run -t -i centos:latest /bin/bash
Внесем небольшие изменения, например, создадим учетную запись:
[root@8f07ef93918f /]# useradd dmosk -G wheel -m
[root@8f07ef93918f /]# passwd dmosk
* в данном примере мы создали пользователя dmosk и задали ему пароль.
docker commit -m «Add user dmosk» -a «Dmitry Mosk» 8f07ef93918f centos:my
* где -m — параметр для указания комментария; -a — указывает автора; 8f07ef93918f — идентификатор контейнера, который был нами изменен (его можно было увидеть в приглашении командной строки); centos:my — название нашего нового образа.
Загрузка образа на Docker Hub
Заходим на Docker Hub страницу регистрации. Создаем пользователя:
На следующей странице также заполняем данные профиля. После переходим в почтовый ящик, который был указан при регистрации и переходим по ссылке Confirm Your Email With Docker для подтверждения регистрации. Регистрация закончена.
Переходим на страницу Repositories и создаем свой репозиторий, например, dmosk. Теперь можно загрузить наши образы в репозиторий.
Сначала авторизуемся в Linux под нашим зарегистрированным пользователем:
docker login —username dmosk
Задаем тег для одного из образов и загружаем его в репозиторий:
docker tag centos:my dmosk/dmosk:centos
docker push dmosk/dmosk:centos
docker tag dmosk/nginx:v1 dmosk/dmosk:nginx
docker push dmosk/dmosk:nginx
В Docker Hub должны появиться наш образы:
Чтобы воспользоваться образом на другом компьютере, также авторизуемся под зарегистрированным пользователем docker:
docker login —username dmosk
docker pull dmosk/dmosk:nginx
docker run -d -p 8080:80 dmosk/dmosk:nginx
Описание инструкций Dockerfile
Инструкция | Описание | Пример |
---|---|---|
FROM | Указывает, какой базовый образ нужно использовать. Обязательная инструкция для Dockerfile | FROM ubuntu:16.04 |
MAINTAINER | Автор образа. | MAINTAINER DMosk |
RUN | Выполняет команду в новом слое при построении образа. | RUN apt-get install python |
CMD | Запускает команду каждый раз при запуске контейнера. Может быть вызвана только один раз. Если в Dockerfile указать несколько таких инструкций, то выполнена будет последняя. | CMD [«openvpn»] |
LABEL | Добавляет метаданные. | LABEL version=»2″ |
EXPOSE | Указывает, какой порт должно использовать приложение внутри контейнера. | EXPOSE 8080 |
ENV | Задает переменные окружения в образе. | ENV PGPASSWORD pass |
ADD | Добавляет файлы/папки из текущего окружения в образ. Если в качестве копируемого файла указать архив, то он будет добавлен в образ в распакованном виде. Также в качестве источника принимает URL. | ADD /root/.ssh/ /root/.ssh/ |
COPY | Также как и ADD добавляет файлы в образ, но обладает меньшими функциями — не принимает URL и не распаковывает архивы. Рекомендован для использования в случаях, где не требуются возможности ADD или когда нужно перенести архив, как архив. | COPY ./mypasswd /root/ |
ENTRYPOINT | Указывает команду, которой будет передаваться параметр при запуске контейнера. | ENTRYPOINT [«/sbin/apache2»] |
VOLUME | Добавляет том в контейнер. | VOLUME [«/opt/myapp»] |
USER | Задает пользователя, от которого будет запущен образ. | USER user:group |
WORKDIR | Можно задать каталог, откуда будут запускаться команды ENTRYPOINT и CMD. | WORKDIR /opt/apps |
ARG | Создает переменную, которую может использовать сборщик. | ARG folder=/opt/apps WORKDIR $folder |
ONBUILD | Действия, которые выполняются, если наш образ используется как базовый для другой сборки. | ONBUILD ADD . /app/src |
STOPSIGNAL | Переопределяет сигнал SIGTERM для завершения контейнера. | STOPSIGNAL SIGINT |
HEALTHCHECK | Команда, которая будет проверять работоспособность контейнера. | HEALTHCHECK —interval=5m —timeout=3s CMD curl -f http://localhost/ || exit 1 |
SHELL | Позволяет заменить стандартную оболочку для выполнения команд на пользовательскую. | SHELL [«/bin/sh», «-c»] |
Импорт и экспорт образа
Наши образы docker мы можем экспортировать для переноса на другой сервер. Рассмотрим процесс подробнее.
Создание резерва (экспорт)
Созданный нами образ можно сохранить в виде архива и, при необходимости, перенести на другой сервер или оставить как бэкап.
И так, для создания резервной копии образа, смотрим их список:
. и для нужного выполняем команду:
docker save -o /backup/docker/image_name.tar
* в данном примере мы создаем архив контейнера в файл /backup/docker/container.tar.
Чтобы уменьшить размер, занимаемый созданным файлом, заархивируем его командой:
* в итоге, мы получим файл container.tar.gz.
Или, чтобы сразу создать заархивированную копию:
docker save | gzip > /backup/docker/image_name.tar.gz
Для создания архива всех образов в нашей системе выполняем:
docker save $(docker images -q) | gzip > /backup/docker/all_image.tar.gz
* в файле /backup/docker/all_image.tar.gz мы получим архив со всем образами, которые есть в нашей системе.
Восстановление
Сначала распаковываем архив:
После восстанавливаем образ:
docker load -i image_name.tar
Смотрим, что нужный нам образ появился:
Volume
1. Для экспорта вольюма вводим:
docker run —rm —volumes-from container-name -v $(pwd):/backup ubuntu bash -c «cd /volume-path && tar zcf /backup/backup.tar.gz .»
* где container-name — имя контейнера, к которому привязан нужный нам вольюм; volume-path — путь монтирования вольюма внутри контейнера.
После ввода команды docker запустит контейнер с Ubuntu и создаст архив backup.tar.gz. Мы его должны увидеть в текущем каталоге:
Данный файл можно переносить на другой сервер.
2. Для восстановления на целевом сервере переходим в каталог, где лежит наш файл backup.tar.gz и вводим:
docker run —rm —volumes-from container-name -v $(pwd):/backup ubuntu bash -c «cd /volume-path && tar zxf /backup/backup.tar.gz»
* где container-name — имя контейнера, к которому будет привязан вольюм; volume-path — путь монтирования вольюма внутри контейнера.
Дополнительные команды
В данном подразделе приведем примеры команд, которые могут оказаться полезными при работе с образами.