Docker
Создание изображений
Поиск…
параметры
параметр | подробности |
---|---|
--вытащить | Убедитесь, что базовое изображение ( FROM ) обновлено до создания остальной части файла Docker. |
Создание изображения из файла Docker
После того, как у вас есть файл Docker, вы можете создать образ из него с помощью docker build
. Основная форма этой команды:
docker build -t image-name path
Если ваш файл Docker не называется Dockerfile
, вы можете использовать флаг -f
чтобы указать имя файла Dockerfile для сборки.
docker build -t image-name -f Dockerfile2 .
Например, чтобы создать образ с именем dockerbuild-example:1.0.0
из Dockerfile
в текущем рабочем каталоге:
$ ls
Dockerfile Dockerfile2
$ docker build -t dockerbuild-example:1.0.0 .
$ docker build -t dockerbuild-example-2:1.0.0 -f Dockerfile2 .
Дополнительную информацию о дополнительных параметрах и настройках см. В документации по использованию docker build
докеров .
Общей ошибкой является создание файла Docker в домашнем каталоге пользователя ( ~
). Это плохая идея, потому что во время docker build -t mytag .
это сообщение появится в течение длительного времени:
Загрузка контекста
Причиной является демон docker, пытающийся скопировать все файлы пользователя (как домашний каталог, так и его подкаталоги). Избегайте этого, всегда указывая каталог для файла Docker.
Добавление файла .dockerignore
в каталог сборки является хорошей практикой . Его синтаксис подобен файлам .gitignore
и гарантирует, что только .gitignore
файлы и каталоги будут загружены в качестве контекста сборки.
Простой файл Dockerfile
FROM node:5
Директива FROM
указывает изображение, с которого нужно начинать. Можно использовать любую допустимую ссылку на изображение .
WORKDIR /usr/src/app
Директива WORKDIR
устанавливает текущий рабочий каталог внутри контейнера, что эквивалентно запуску cd
внутри контейнера. (Примечание: RUN cd
не изменит текущий рабочий каталог.)
RUN npm install cowsay knock-knock-jokes
RUN
выполняет заданную команду внутри контейнера.
COPY cowsay-knockknock.js ./
COPY
копирует файл или каталог, указанные в первом аргументе из контекста сборки ( path
переданный docker build path
) к местоположению в контейнере, указанном вторым аргументом.
CMD node cowsay-knockknock.js
CMD
указывает команду для выполнения, когда изображение выполняется, и команда не указана. Его можно переопределить, передав команду на docker run
.
Есть много других инструкций и опций; см. ссылку Dockerfile для полного списка.
Разница между ENTRYPOINT и CMD
Существует две директивы Dockerfile
для указания, какую команду запускать по умолчанию в построенных изображениях. Если вы укажете только CMD
то докер выполнит эту команду, используя стандартную ENTRYPOINT
, которая является /bin/sh -c
. При запуске встроенного образа вы можете переопределить любую или оба точки входа и / или команды. Если вы укажете оба, то ENTRYPOINT
указывает исполняемый файл вашего контейнерного процесса, а CMD
будет предоставлен в качестве параметров этого исполняемого файла.
Например, если ваш Dockerfile
содержит
FROM ubuntu:16.04
CMD ["/bin/date"]
Затем вы используете директиву ENTRYPOINT
по умолчанию /bin/sh -c
и run /bin/date
с этой точкой входа по умолчанию. Команда вашего процесса контейнера будет /bin/sh -c /bin/date
. После запуска этого изображения оно будет по умолчанию распечатывать текущую дату
$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016
Вы можете переопределить CMD
в командной строке, и в этом случае он выполнит указанную вами команду.
$ docker run test /bin/hostname
bf0274ec8820
Если вы укажете директиву ENTRYPOINT
, Docker будет использовать этот исполняемый файл, а директива CMD
задает параметры (параметры) по умолчанию. Поэтому, если ваш Dockerfile
содержит:
FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]
Тогда запуск будет производить
$ docker build -t test .
$ docker run test
Hello
Вы можете предоставить различные параметры, если хотите, но все они будут запускать /bin/echo
$ docker run test Hi
Hi
Если вы хотите переопределить точку входа, указанную в вашем файле Docker (т. Е. Если вы хотите запустить другую команду, чем echo
в этом контейнере), вам нужно указать параметр --entrypoint
в командной строке:
$ docker run --entrypoint=/bin/hostname test
b2c70e74df18
Обычно вы используете директиву ENTRYPOINT
чтобы указать на основное приложение, которое вы хотите запустить, и CMD
на параметры по умолчанию.
Отображение порта в файле докеров
EXPOSE <port> [<port>...]
Команда
EXPOSE
информирует Docker о том, что контейнер прослушивает указанные сетевые порты во время выполнения.EXPOSE
не делает порты контейнера доступными для хоста. Для этого вы должны использовать флаг-p
для публикации диапазона портов или флага-P
для публикации всех открытых портов. Вы можете открыть один номер порта и опубликовать его извне под другим номером.
Пример:
Внутри вашего файла Docker:
EXPOSE 8765
Чтобы получить доступ к этому порту с главного компьютера, включите этот аргумент в команду docker run
:
-p 8765:8765
ENTRYPOINT и CMD рассматриваются как глагол и параметр
Предположим, что у вас есть файл Dockerfile, заканчивающийся
ENTRYPOINT [ "nethogs"] CMD ["wlan0"]
если вы построите это изображение с помощью
docker built -t inspector .
запустите изображение, построенное с помощью такого файла Docker, с помощью команды, например
docker run -it --net=host --rm inspector
, nethogs будет контролировать интерфейс wlan0
Теперь, если вы хотите контролировать интерфейс eth0 (или wlan1, или ra1 ...), вы будете делать что-то вроде
docker run -it --net=host --rm inspector eth0
или же
docker run -it --net=host --rm inspector wlan1
Нажатие и вытягивание изображения в концентратор докеров или другой реестр
Локально созданные изображения могут быть перенесены в Docker Hub или на любой другой реко-сервер докеры, известный как реестр. Используйте docker login
в docker login
для входа в существующий аккаунт концентратора докеров.
docker login
Login with your Docker ID to push and pull images from Docker Hub.
If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: cjsimon
Password:
Login Succeeded
Указание имени сервера можно использовать в другом реестре докеров. Это также работает для частных или самостоятельных реестров. Кроме того, возможно использование внешнего хранилища учетных данных для обеспечения безопасности.
docker login quay.io
Затем вы можете пометить и вставить изображения в реестр, в который вы вошли. Ваш репозиторий должен быть указан как server/username/reponame:tag
Опускание сервера в настоящее время по умолчанию - Docker Hub. (Реестр по умолчанию не может быть изменен другому провайдеру, и нет никаких планов по реализации этой функции.)
docker tag mynginx quay.io/cjsimon/mynginx:latest
Различные теги могут использоваться для представления разных версий или ветвей одного и того же изображения. Изображение с несколькими разными тегами отображает каждый тег в одном и том же репо.
Используйте docker images
чтобы просмотреть список установленных изображений, установленных на вашем локальном компьютере, включая ваше недавно помеченное изображение. Затем используйте push, чтобы загрузить его в реестр и потянуть, чтобы загрузить изображение.
docker push quay.io/cjsimon/mynginx:latest
Все метки изображений можно вытащить, указав параметр -a
docker pull quay.io/cjsimon/mynginx:latest
Создание с использованием прокси
Часто при создании изображения Docker Dockerfile содержит инструкции, которые запускают программы для извлечения ресурсов из Интернета (например, wget
чтобы вытащить двоичную сборку программы на GitHub).
Можно поручить Docker передать заданные переменные окружения, чтобы такие программы выполняли эти выборки через прокси:
$ docker build --build-arg http_proxy=http://myproxy.example.com:3128 \
--build-arg https_proxy=http://myproxy.example.com:3128 \
--build-arg no_proxy=internal.example.com \
-t test .
build-arg
- переменные окружения, доступные только во время сборки.