Введение
Продолжить предыдущую статьюобразы и контейнеры докеров, в этой статье рассказывается о том, как создать файл Dockerfile для создания образа. В прошлой статье упоминалось, что сборка кастомного образа делается вручную.Хотя шаги понятны, операция громоздкая, а раздача образов не очень удобная.Поэтому необходимо заменить этот режим на более лучший способ.Создание кастомных образов , поэтому Dockerfile — лучшая альтернатива. Без лишних слов давайте посмотрим, как написать Dockerfile и создать образ контейнера.Давайте сначала объясним операционную среду этой статьи.Друзья, прочитавшие предыдущую статью, должны знать, что адрес ускорения образа докера, который я использую, принадлежит Alibaba Cloud. Я думаю, что это самая безболезненная среда для использования докера.
2. Пример Dockerfile
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER lorenwe
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.13.7.tar.gz /tmp/
#RUN 执行以下命令
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 \
&& yum update -y \
&& yum install -y vim less wget curl gcc automake autoconf libtool make gcc-c++ zlib zlib-devel openssl openssl-devel perl perl-devel pcre pcre-devel libxslt libxslt-devel \
&& yum clean all \
&& rm -rf /usr/local/src/*
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /tmp/nginx-1.13.7
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN cd / && rm -rf /tmp/
COPY nginx.conf /usr/local/nginx/conf/
#EXPOSE 映射端口
EXPOSE 80 443
#ENTRYPOINT 运行以下命令
ENTRYPOINT ["nginx"]
#CMD 运行以下命令
CMD ["-h"]
Вышеприведенный пример кода представляет собой файл dockerfile, который я написал, и я думаю, что он очень репрезентативен. Он не включает много контента, но в основном используются все инструкции dockerfile, а также включены некоторые детали. Чтобы добиться эффекта примера, поэтому Это не самый краткий файл docker.Создайте папку и поместите в файл вышеуказанный файл dockerfile, затем перейдите на официальный сайт nginx, чтобы загрузить исходный пакет nginx и поместить его в эту папку, а затем откройте окно командной строки в этой папке. , Откройте окно командной строки с правами администратора, чтобы избежать некоторых проблем с разрешениями.Структура каталогов в это время должна быть следующей
3. Анализ инструкций
FROM указывает, что является базовым образом этого dockerfile для создания образа. Это немного похоже на наследование классов в коде. Функции базового образа также существуют во вновь созданном образе. Как правило, он используется для основы изображение. Самые чистые из них не были изменены какой-либо третьей стороной. Например, я использую самый простой Centos. Здесь необходимо объяснить, потому что источник ускорения изображения, который я использую, взят из Alibaba Cloud, поэтому Centos, который я стащил, приходит с Alibaba Cloud. Если вы не используете источник ускорения изображения Alibaba Cloud, источник yum для извлеченного изображения будет другим. Вы можете столкнуться со многими проблемами при установке программного обеспечения с помощью yum (вы это знаете).
MAINTAINER — это информация о сопровождающем, просто введите свое имя, не нужно ничего говорить
ENV устанавливает переменные среды. Проще говоря, это помогает системе найти программное обеспечение, необходимое для запуска. Например, я написал выше: «ENV PATH /usr/local/nginx/sbin:$PATH», что означает, что если система запускает программу без указанного пути, ее можно найти в пути /usr/local/nginx/sbin, только после того, как это установлено, команду nginx можно использовать непосредственно для запуска nginx позже, в противном случае система выдаст сообщение о том, что приложение не найдено.
ДОБАВИТЬ, как следует из названия, это функция добавления файлов, но она делает немного больше, чем обычное добавление.Исходный файл может быть файлом или URL-адресом.Если исходный файл является сжатым пакетом, он будет добавлен при сборке Автоматически распаковать сжатый пакет, пример, который я написал: «ДОБАВИТЬ nginx-1.13.7.tar.gz /tmp/», где сжатый пакет nginx-1.13.7.tar.gz должен находиться в каталоге файла dokefile Да , если вы напишите полный путь D:test/nginx-1.13.7.tar.gz, если он не находится в каталоге файлов dockerfile, будет указано, что файл не может быть найден.
RUN означает выполнение команды. RUN может выполнять несколько команд, просто разделите их с помощью &&. Если команда слишком длинная и ее нужно обернуть, добавьте '\' в конце, чтобы обернуть команду. Значение RUN очень простое , то есть выполнить команду.Но есть некоторые детали, на которые все же нужно обратить внимание.Теперь давайте на приведенном выше примере посмотрим, на что нужно обратить внимание. Функция RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 состоит в том, чтобы импортировать подпись пакета, чтобы проверить, был ли пакет изменен.Кроме того, программное обеспечение также должно быть гарантировано быть заслуживающим доверия. yum update -y обновляет все пакеты, изменяет настройки программного обеспечения и системные настройки, а также обновляет версию системы и ядро. Мы знаем, что программное обеспечение Linux имеет зависимости. Иногда, когда мы устанавливаем новое программное обеспечение, инструменты и программное обеспечение, от которых оно зависит, также должны быть последней версии, если она не работает Если эта команда используется для обновления исходного пакета программного обеспечения, легко вызвать проблемы с нашим вновь установленным программным обеспечением Нам еще труднее найти проблему, когда сообщение об ошибке не очевидно .Чтобы избежать такой ситуации, мы должны сначала обновить пакет программного обеспечения.И систему, хотя это и заставит docker строить образы медленнее, но это того стоит.Что касается последней команды, естественно установить различные библиотеки инструментов.Тогда смотрите при предложении yum clean all очистить все кеши yum, которые могут быть. Чтобы уменьшить размер собранного образа, rm -rf /usr/local/src/ очищает пользовательские исходные файлы, которые все играют роль в уменьшении размера построенный образ. Инструкция RUN может быть написана шаг за шагом, например, приведенная выше команда RUN может быть разделена на следующие:
# 不推荐
RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 \
RUN yum update -y \
RUN yum install -y vim less wget curl gcc automake autoconf libtool make gcc-c++ zlib zlib-devel openssl openssl-devel perl perl-devel pcre pcre-devel libxslt libxslt-devel \
RUN yum clean all \
RUN rm -rf /usr/local/src/*
Это тоже возможно, но лучше этого не делать, потому что каждый раз, когда в dockerfile выполняется ключевая команда для сборки образа, будет создаваться версия образа, что немного похоже на управление версиями git, например, после выполняя первую команду RUN, выполните вторую команду RUN.Команда RUN будет выполнена в новой версии образа, что приведет к сбою команды yum clean all и не играет роли в упрощении образа. рекомендуется писать больше RUN, это не значит, что выполняются все операции.Поместите его в RUN, здесь принцип заключается в том, чтобы поместить все связанные операции в один и тот же RUN, например, я обновляю yum, устанавливаю библиотеку инструментов, очистите кеш в RUN, а затем скомпилируйте и установите nginx внутри другого RUN.
WORKDIR означает, что зеркальный активный каталог изменяется на указанный каталог, что эквивалентно cd на указанный каталог в linux.На самом деле, нет необходимости использовать эту команду вообще.Вы можете использовать команду cd напрямую, когда вам нужно это, потому что здесь используется WORKDIR, поэтому следующий RUN Нет необходимости переключать каталоги для компиляции и установки nginx.Вот еще один вопрос, который приходит на ум, следующим образом:
RUN cd /tmp/nginx-1.13.7
RUN ./configure
Возможно ли это?Думаю друзья,которые читали ранее,должны знать ответ.Я повторю его здесь.Это сообщит об ошибке,что файл конфигурации не может быть найден.Причина очень проста,потому что эти две команды не в том же.Выполненный в зеркале каталог, введенный первым зеркальным cd, не означает, что последующие зеркала также вошли.
Команда COPY очень проста. Это копирование файла в каталог на образе. Обратите внимание, что исходный файл также должен находиться в каталоге, где находится файл docker. Пример означает копирование файла конфигурации nginx. Теперь создайте это файл в каталоге, где находится файл dockerfile.
user www;
worker_processes 2;
daemon off;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
Конфигурация очень простая, то есть убрать комментарии к официальным конфигурационным файлам, обратите внимание на выключение демона; конфигурация, что означает закрытие фоновой работы nginx, причина была указана в предыдущей статье, поговорим о ней здесь , контейнер по умолчанию является контейнером. Активность первого внутреннего процесса является основой для запуска контейнера Docker. Если контейнер Docker завершает работу после запуска, контейнер Docker завершает работу напрямую. При запуске Docker команда используется как внутренняя команда контейнера.Если используется nginx, то nginx Программа будет работать в фоновом режиме.В это время nginx является не первой программой, которая будет выполняться, а исполняемым bash.После того, как bash выполнит команду nginx, он зависает , поэтому контейнер закрывается. Если мы отключим демон
Запустите nginx, тогда nginx всегда будет занимать командное окно, и естественно bash не может выйти, поэтому контейнер остается активным.
Комментарий примера EXPOSE написан как сопоставленный порт, но я думаю, что более уместно описать его как открытый порт, потому что при использовании dockerfile для создания контейнера порт не отображается. docker run, например, я сопоставил порт 80 контейнера с портом 8080 локального компьютера. Если сопоставление прошло успешно, порт должен быть открыт первым, что аналогично функции брандмауэра, и некоторые порты открыты.
ENTRYPOINT и CMD должны быть объединены. Функции обоих схожи, но они относительно уникальны. Их функция заключается в том, чтобы позволить образу запускать команды внутри контейнера при его создании. Конечно, предполагается, что этот образ создан с использованием этого dockerfile, то есть команды в ENTRYPOINT и CMD будут выполняться при выполнении docker run.
Начнем с CMD. Одной из особенностей CMD является то, что его можно перезаписать. Например, удалите строку ENTRYPOINT предыдущего dockerfile, оставьте CMD для заполнения ["nginx"] и используйте команду docker run lorenwe/centos_nginx для выполнения сразу после сборки образа.Через docker ps вы можете видеть, что контейнер работает нормально, и команда запуска также «ngixn», но если мы используем для запуска docker run lorenwe/centos_nginx bin/bash, мы можем увидеть что команда запуска стала bin/bash через docker ps, что означает, что команду CMD для файла dockerfile можно переопределить, и ее также можно рассматривать как команду по умолчанию для запуска контейнера, которую можно изменить вручную.
Напротив, ENTRYPOINT не может быть перезаписан, а это значит, что при запуске контейнера после указания значения, независимо от того, какой ENTRYPOINT вы пропишете позже, будет выполняться команда в ENTRYPOINT Обычно использование ENTRYPOINT заключается в указании приложения это должно быть запущено для определенного образа.Например, то, что я создаю здесь, это образ centos_nginx, что означает, что этот образ запускает только ngixn, тогда я могу написать ["nginx"] в ENTRYPOINT, некоторые люди создают свои собственные базовый образ (базовый образ только устанавливает некоторую необходимую библиотеку) только CMD и запись ['bin/bash'], когда существуют и ENTRYPOINT, и CMD, команда в CMD запустит контейнер с параметрами команды в ENTRYPOINT, такими как приведенный выше пример dockerfile при запуске контейнера Контейнер будет запущен с помощью команды nginx -h, к сожалению, это не может поддерживать работу контейнера, поэтому вы можете запустить docker run -it lorenwe/centos_nginx -c /usr/local/nginx/conf /nginx.conf, то при старте контейнера нужно выполнить команду nginx -c /usr/local/nginx/conf/nginx.conf, не интересно, можно настроить параметры запуска.
Конечно, есть некоторые неиспользуемые команды:
ARG, инструкция ARG используется для определения параметров, необходимых для построения.Например, вы можете написать предложение ARG a_nother_name=a_default_value в dockerfile.Параметры, определенные инструкцией ARG, назначаются в виде --build -arg a_name =a_value в команде сборки docker, обычно используется реже.
VOLUME, команда VOLUME создает точку монтирования, которую можно монтировать с локального хоста или других контейнеров.Существует много вариантов использования.Все мы знаем, что docker удобнее быть контейнером приложения.На самом деле, docker также можно использовать как контейнер данных. Dockerfile для создания образа контейнера данных В основном используется команда VOLUME. Чтобы объяснить использование VOLUME, необходимо открыть статью, и я не буду ее здесь представлять.
ПОЛЬЗОВАТЕЛЬ, ПОЛЬЗОВАТЕЛЬ используется для переключения текущего идентификатора владельца. Docker по умолчанию использует пользователя root, но если он вам не нужен, рекомендуется переключить идентификатор пользователя, поскольку полномочия root слишком велики, и при использовании возникает угроза безопасности. LABEL, определяет метку изображения.
4. Создайте демо
Команда для dockerfile для создания образа очень проста. В моем примере моя команда «docker build -t lorenwe/centos_nginx.». Обратите внимание, что следующие точки нельзя опускать, что означает найти файл dockerfile в текущем каталоге для построить образ.
D:\docker\lorenwe>docker build -t lorenwe/centos_nginx .
Sending build context to Docker daemon 995.8kB
Step 1/13 : FROM centos
---> d123f4e55e12
Step 2/13 : MAINTAINER lorenwe
---> Running in e5c7274f50e8
---> 606f7222e69a
Removing intermediate container e5c7274f50e8
Step 3/13 : ENV PATH /usr/local/nginx/sbin:$PATH
---> Running in 23716b428809
---> 5d8ee1b5a899
....
Successfully built eaee6b40b151
Successfully tagged lorenwe/centos_nginx:latest
Видеть вышеуказанный контент означает успех.Процесс сборки может занять немного времени.Ведь нужно установить какое-то ПО.Если вы такой же как я, то не должно возникнуть проблем при сборке исходников контейнера Alibaba Cloud,потому что я Вытащил его раньше. Я взял Centos, поэтому используйте локальный Centos непосредственно при сборке. Если вы не вытащили Centos, вы также будете тянуть Centos при сборке.
D:\docker\lorenwe>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lorenwe/centos_nginx latest eaee6b40b151 7 minutes ago 427MB
lorenwe/centos_net_tools latest 35f8073cede1 6 days ago 277MB
centos latest d123f4e55e12 3 weeks ago 197MB
d4w/nsenter latest 9e4f13a0901e 14 months ago 83.8kB
D:\docker\lorenwe>docker run -itd --name nginx1 lorenwe/centos_nginx
15d4f108dab7c2f276209ebeb501cac0d3be828e1e81bae22d3fd97c617439eb
D:\docker\lorenwe>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
D:\docker\lorenwe>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15d4f108dab7 lorenwe/centos_nginx "nginx -h" nginx1
D:\docker\lorenwe>docker run -itd --name nginx2 lorenwe/centos_nginx -c /usr/local/nginx/conf/nginx.conf
b6b0e962ca3056d67c24145b08975ffddb9cc050fce5f09f65310fb323ffc1c3
D:\docker\lorenwe>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6b0e962ca30 lorenwe/centos_nginx "nginx -c /usr/loc..." 80/tcp nginx2
D:\docker\lorenwe>docker run -itd -p 8080:80 --name nginx3 lorenwe/centos_nginx -c /usr/local/nginx/conf/nginx.conf
2f6997745641e3e3edbbfe5213e6235cab3b5a929f116a2c132df504156090c6
D:\docker\lorenwe>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f6997745641 lorenwe/centos_nginx "nginx -c /usr/loc..." 0.0.0.0:8080->80/tcp nginx3
b6b0e962ca30 lorenwe/centos_nginx "nginx -c /usr/loc..." 80/tcp nginx2
D:\docker\lorenwe>docker stop nginx2
nginx2
-p 8080:80 в "docker run -itd -p 8080:80 --name nginx3 lorenwe/centos_nginx -c /usr/local/nginx/conf/nginx.conf" означает сопоставление порта 8080 хоста с портом порта контейнера 80, потому что ранее мы открывали порт 80 в файле докеров. После сопоставления портов теперь вы можете открыть браузер на хосте и посетить 127.0.0.1:8080, чтобы увидеть страницу приветствия nginx (^v^) .
D:\docker\lorenwe>docker run -itd -v D:/docker/lorenwe/html:/usr/local/nginx/html -p 8081:80 --name nginx4 lorenwe/centos_nginx -c /usr/local/nginx/conf/nginx.conf
cd2d4eb70a39057aed3bfcb64e1f03433e2054d7ff5d50098f49d2e6f2d9e02e
Я добавил параметр -v к исходным параметрам.Его функция заключается в монтировании каталога локального хоста в контейнер.Этот каталог является общим состоянием и может быть изменен с обеих сторон.Это общий том контейнера. роль очевидна.Теперь мы создаем новую папку с именем html в каталоге D:\docker\lorenwe, а затем создаем новый index.html в папке html, пишем немного контента, а затем переходим в браузер хоста. 127.0.0.1:8081, чтобы узнать, хотите ли вы видеть контент. Хотя для большинства сценариев приложений можно использовать параметр -v, есть и другие варианты использования VOLUME в docker.