Want to improve this cheat sheet? See the Contributing section!
- Почему Docker
- Предпосылки
- Установка
- Контейнеры
- Образы
- Сеть
- Реестр и репозиторий
- Dockerfile
- Слои
- Ссылка
- Тома
- Отображение портов
- Лучшая практика
- Безопасность
- Советы
- Содействие
"С Docker разработчики могут создавать любое приложение на любом языке, используя любую инструментальную цепочку. Приложения помещаются в контейнер - становятся полностью переносимы и могут работать где угодно - на компьютерах под управлением OS X и Windows, серверах QA, работающих под управлением Ubuntu в облаке, и виртуальных машинах производственного центра обработки данных Red Hat.
Разработчики могут быстро начать работу, начиная с одного из 13 000 приложений, доступных на Docker Hub. Docker управляет и отслеживает изменения и зависимости, что облегчает для системных администраторов понимание того, как работают приложения, созданные разработчиками. И с Docker Hub разработчики могут автоматизировать свой процес сборки и совместно использовать артефакты с сотрудниками через публичные или частные репозитории.
Docker помогает разработчикам создавать и отправлять более качественные приложения быстрее " -- Что такое Docker
Я использую Oh My Zsh вместе с Docker plugin для автозаполнения команд docker. Возможно у вас другой подход.
Ядро 3.10.x минимальное требование для Docker.
10.8 “Mountain Lion” или более новый.
Быстрый и простой скрипт установки, предоставляемый Docker:
curl -sSL https://get.docker.com/ | sh
Если вы не хотите запускать случайный сценарий оболочки, см. Инструкции по установке на ваш дистрибутив.
Если вы являетесь полноправным новичком Docker, вы должны следовать сериям учебников сейчас.
Скачать и установить Docker Community Edition. если у вас есть Homebrew-Cask, просто введите brew install --cask docker
.
Или загрузите и установите Docker Toolbox. Docker для Mac это хорошо, но это не совсем так, как установка VirtualBox.
См. Сравнение.
** ПРИМЕЧАНИЕ ** Docker Toolbox является устаревшим. вы должны использовать Docker Community Edition, см. (Docker Toolbox)[https://docs.docker.com/toolbox/overview/]
После установки Docker Community Edition щелкните значок докера. Затем запустите контейнер:
docker run hello-world
Вот и все, у вас есть работающий контейнер Docker.
Если вы являетесь полноправным новичком докеров, вы должны, вероятно, исследовать [серию учебников] (https://docs.docker.com/engine/getstarted/) сейчас.
Ваш основной изолированный процесс Докера. Контейнеры - это виртуальные машины, поскольку потоки относятся к процессам. Или вы можете думать о них как о chroot на стероидах.
docker create
создает контейнер, но не запускает его.docker rename
позволяет переименовать контейнер.docker run
создает и запускает контейнер за одну операцию.docker rm
удаляет контейнер.docker update
обновляет ограничения ресурсов контейнера.
Обычно, если вы запускаете контейнер без параметров, он запускается и останавливается немедленно, если вы хотите его запустить, вы можете использовать команду, docker run -td container_id
это будет использовать опцию -t
который будет выделять псевдо-TTY сессию и -d
который автоматически отсоединяет контейнер (запускает контейнер в фоновом режиме и показыват ID контейнера).
Если вам нужен переходный контейнер, docker run --rm
удалит контейнер после его остановки.
Если вы хотите сопоставить каталог на хосте с контейнером докера, docker run -v $HOSTDIR:$DOCKERDIR
. Также смотрите Тома.
Если вы хотите удалить также тома, связанные с контейнером, удаление контейнера должно включать -v
измените примерно так docker rm -v
.
Существует также логирование доступны для отдельных контейнеров в докерах 1.10. Чтобы запустить докер с помощью специального лог журнала (например, в syslog), используйте docker run --log-driver=syslog
.
Другим полезным вариантом является docker run --name yourname docker_image
потому что, когда вы укажете --name
внутри команды run это позволит вам запускать и останавливать контейнер, вызывая его с именем, которое вы указали при его создании.
docker start
запускает контейнер, чтобы он работал.docker stop
останавливает запущенный контейнер.docker restart
останавливается и запускает контейнер.docker pause
приостанавливает работу контейнера, "замораживает" его на месте.docker unpause
снимает "заморозку" контейнера.docker wait
блокирует до остановки контейнера.docker kill
посылает SIGKILL к запущеннному контейнеру.docker attach
будет подключаться к работающему контейнеру.
Если вы хотите интегрировать контейнер с диспетчером хостов, запустите демона с помощью -r = false
, а затем используйтеdocker start -a
.
Если вы хотите открыть порты контейнера через хост, см. Раздел раскрытие портов.
Перезагрузка политик в разбитых экземплярах докеров рассматривается здесь.
Вы можете ограничить процессор, используя либо процент от всех процессоров, либо используя определенные ядра.
Например, вы можете указать параметр cpu-shares
. Параметр немного странный - 1024 означает 100% CPU, поэтому, если вы хотите, чтобы контейнер занимал 50% всех ядер процессора, вы должны указать 512. См. https://goldmann.pl/blog/2014/09/11/resource-management-in-docker/#_cpu для получения дополнительной информации:
docker run -ti --c 512 agileek/cpuset-test
Вы также можете использовать только некоторые ядра процессора, используя cpuset-cpus
. См. https://agileek.github.io/docker/2014/08/06/docker-cpuset/ для получения дополнительной информации:
docker run -ti --cpuset-cpus=0,4,6 agileek/cpuset-test
Обратите внимание, что Docker все еще может видеть все процессоры внутри контейнера -- он просто не использует все из них. Подробнее см. moby/moby#20770.
Вы также можете установить ограничения памяти на Docker:
docker run -it -m 300M ubuntu:14.04 /bin/bash
Возможности Linux можно установить, используя cap-add
и cap-drop
. См. https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities для подробностей. Это должно использоваться для большей безопасности.
Чтобы подключить файловую систему на основе FUSE, вам необходимо объединить оба --cap-add и --device:
docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs
Обеспечить доступ к одному устройству:
docker run -it --device=/dev/ttyUSB0 debian bash
Обеспечить доступ ко всем устройствам:
docker run -it --privileged -v /dev/bus/usb:/dev/bus/usb debian bash
подробнее о привилегированных контейнерах здесь
docker ps
показывает запущенные контейнеры.docker logs
получает журналы из контейнера. (Вы можете использовать собственный драйвер журнала, но журналы доступны только дляjson-file
иjournald
в 1.10).docker inspect
просматривает всю информацию о контейнере (включая IP-адрес).docker events
получает события из контейнера.docker port
показывает открытый порт контейнера.docker top
показывает запущенные процессы в контейнере.docker stats
показывает статистику использования ресурсов контейнеров.docker diff
показывает измененные файлы в FS контейнера.
docker ps -a
показывает запущенные и остановленные контейнеры.
docker stats --all
показывает текущий список контейнеров.
docker cp
копирует файлы или папки между контейнером и локальной файловой системой.docker export
экспортировать файловую систему контейнера в качестве tar-архива.
docker exec
для выполнения команды в контейнере.
Чтобы войти в запущенный контейнер, присоедините новый процесс оболочки к запущенному контейнеру с именем foo, используйте:docker exec -it foo /bin/bash
.
Образы - это просто шаблоны для docker контейнеров.
docker images
показывает все образы.docker import
создает образ из архива.docker build
создает образ из Dockerfile.docker commit
создает образ из контейнера, временно приостанавливая его, если он запущен.docker rmi
удаляет образ.docker load
загружает образ из архива tar в качестве STDIN, включая образы и теги (начиная с 0.7).docker save
сохраняет образ в поток архива tar в STDOUT со всеми родительскими слоями, тегами и версиями (начиная с 0,7).
docker history
показывает историю образа.docker tag
теги образа к имени (локальному или реестру).
Очень важно, чтобы вы всегда знали текущую версию Docker, в которой вы сейчас работаете, в любой момент времени. Это очень полезно, потому что вы узнаете, какие функции совместимы с тем, что вы используете. Это также важно, потому что вы знаете, какие контейнеры запускать из хранилища докеров, когда вы пытаетесь получить контейнеры шаблонов. Это говорит о том, как узнать, какая версия докера у нас работает в настоящее время:
- 'docker version' проверьте, какая версия докера у вас запущена.
- [docker version [OPTIONS]]
Получить версию сервера $ docker version --format '{{.Server.Version}}'
1.8.0 Dump raw JSON data $ docker version --format '{{json .}}'
{"Client":{"Version":"1.8.0","ApiVersion":"1.20","GitCommit":"f5bae0a","GoVersion":"go1.4.2","Os":"linux","Arch":"am"}
Хотя вы можете использовать команду docker rmi
для удаления определенных образов, есть инструмент под названием docker-gc, который будет безопасно очищать образы, которые больше не используются любыми контейнерами.
Загрузите образ из файла:
docker load < my_image.tar.gz
Сохранить существующий образ:
docker save my_image:my_tag | gzip > my_image.tar.gz
Импортировать контейнер как образ из файла:
cat my_container.tar.gz | docker import - my_image:my_tag
Экспортировать существующий контейнер:
docker export my_container | gzip > my_container.tar.gz
Разница между загрузкой сохраненного образа и импортом экспортированного контейнера в качестве образа
Загрузка изображения с помощью команды load
создает новый образ, включая его историю.
Импорт контейнера в качестве образа с помощью команды import
создает новый образ, исключая историю, которая приводит к меньшему размеру образов по сравнению с загрузкой образа.
Docker имеет функцию network. Об этом мало что известно, поэтому это хорошее место для расширения чит-листа. Существует примечание, в котором говорится, что это хороший способ настроить контейнеры докеров, чтобы разговаривать друг с другом без использования портов. Подробнее см. Работа с сетями.
Вы можете указать конкретный IP-адрес для контейнера:
# создать новую сеть bridge с вашей подсетью и шлюзом для вашего ip-блока
docker network create --subnet 203.0.113.0/24 --gateway 203.0.113.254 iptastic
# запустите контейнер nginx с определенным ip в этом блоке
$ docker run --rm -it --net iptastic --ip 203.0.113.2 nginx
# curl ip из любого другого места (при условии, что это общедоступный ip-блок)
$ curl 203.0.113.2
Репозиторий - это * размещенная * коллекция помеченных образов, которые вместе создают файловую систему для контейнера.
Реестр - это * хост * - сервер, который хранит репозитории и предоставляет HTTP API для управления загрузкой и загрузкой репозиториев.
Docker.com размещает свой собственный index в центральном реестре, который содержит большое количество репозиториев. Сказав это, центральный реестр докеров (не делает хорошую работу по проверке образов)(https://titanous.com/posts/docker-insecurity), и его следует избегать, если вас беспокоит безопасность.
docker login
для входа в реестр.docker logout
для выхода из реестра.docker search
ищет реестр для образа.docker pull
вытаскивает образ из реестра на локальный компьютер.docker push
толкает образ в реестр с локальной машины.
Вы можете запустить локальный реестр с помощью проекта docker distribution и посмотреть на локальное развертывание инструкци.
Также см. Список рассылки.
Файл конфигурации. Устанавливает контейнер Docker, когда вы запускаете на нем docker build
. Крайне предпочтительнее docker commit
.
Вот некоторые распространенные текстовые редакторы и их модули подсветки синтаксиса, которые вы могли бы использовать для создания Dockerfiles:
- Если вы используете jEdit, я установил модуль подсветки синтаксиса для Dockerfile вы можете использовать.
- Sublime Text 2
- Atom
- Vim
- Emacs
- TextMate
- VS Code
- Также см. Docker meets the IDE
- .dockerignore
- FROM Устанавливает базовое изображение для последующих инструкций.
- MAINTAINER (устаревший - вместо этого используйте LABEL) Задайте поле Author созданных образов.
- RUN выполнять любые команды в новом слое поверх текущего образа и фиксировать результаты.
- CMD предоставлять значения по умолчанию для исполняемого контейнера.
- EXPOSE сообщает Docker, что контейнер прослушивает указанные сетевые порты во время выполнения. ПРИМЕЧАНИЕ: на самом деле не делает доступными порты.
- ENV устанавливает переменную среды.
- ADD копирует в контейнер новые файлы, каталоги или удаленный файл. Недействительный кеш. Избегайте
ADD
и вместо этого используйтеCOPY
. - COPY копирует в контейнер новые файлы или каталоги. Обратите внимание, что это копируется только с правами root, поэтому вы должны вручную управлять вне зависимости от настроек USER / WORKDIR. См. moby/moby#30110
- ENTRYPOINT настраивает контейнер, который будет запускаться как исполняемый файл.
- VOLUME создает точку монтирования для внешних томов или других контейнеров.
- USER задает имя пользователя для следующих команд RUN / CMD / ENTRYPOINT.
- WORKDIR устанавливает рабочий каталог.
- ARG определяет переменную времени сборки.
- ONBUILD добавляет инструкцию триггера, когда изображение используется в качестве основы для другой сборки.
- STOPSIGNAL устанавливает сигнал системного вызова, который будет отправлен в контейнер для выхода.
- LABEL устанавливает сигнал системного вызова, который будет отправлен в контейнер для выхода.
- Примеры
- Рекомендации по написанию Dockerfiles
- Michael Crosby has some more Dockerfiles best practices / take 2.
- Building Good Docker Images / Создание лучших образов docker
- Управление конфигурацией контейнера с метаданными
- Как написать отличный Dockerfiles
Файловая система с версией в Docker основана на слоях. Они похожи на git комиты или измекнения для файловой системы.
Ссылки, как контейнеры Docker общаются друг с другом через порты TCP/IP. Связь с Redis и Atlassian показать приведенные примеры. Вы также можете разрешить ссылки по имени хоста.
Это в некоторой степени устарело сетями определяемыми пользователем.
ПРИМЕЧАНИЕ. Если вы хотите, чтобы контейнеры ТОЛЬКО связывались друг с другом по ссылкам, запустите демон docker с помощью -icc = false
, чтобы отключить межпроцессное общение.
Если у вас есть контейнер с именем CONTAINER (указанный docker run -name CONTAINER
) и в Dockerfile, он имеет открытый порт:
EXPOSE 1337
Тогда, если мы создадим еще один контейнер LINKED, например:
docker run -d --link CONTAINER:ALIAS --name LINKED user/wordpress
Затем открытые порты и псевдонимы CONTAINER будут отображаться в LINKED со следующими переменными среды:
$ALIAS_PORT_1337_TCP_PORT
$ALIAS_PORT_1337_TCP_ADDR
И вы можете подключиться к нему таким образом.
Чтобы удалить ссылки, используйте docker rm --link
.
Как правило, связи между контейнерами Docker является подмножеством «обнаружения сервисов», что является большой проблемой, если вы планируете использовать Docker в производстве. Пожалуйста, прочитайте The Docker Ecosystem: Service Discovery and Distributed Configuration Stores или большей информации.
Тома Docker - свободно плавающие файловые системы.Они не обязательно должны быть подключены к конкретному контейнеру. Вы должны использовать тома, примонированные из контейнеров только для данных для переносимости.
Тома полезны в ситуациях, когда вы не можете использовать ссылки (которые только TCP / IP). Например, если вам нужно, чтобы два экземпляра docker обменивались данными, оставив результат в файловой системе.
Вы можете смонтировать их в нескольких контейнерах докеров сразу, используя docker run --volumes-from
.
Поскольку тома являются изолированными файловыми системами, они часто используются для хранения состояния из вычислений между переходными контейнерами. То есть, у вас может быть контейнер без учета состояния и переходный процесс, запускаемый из скрипта, сдуть его, а затем добавить второй экземпляр переходного контейнера, откуда он остановился.
См. Расширенные тома для больших подробностей. Container42 is also helpful.
You can map MacOS host directories as docker volumes:
docker run -v /Users/wsargent/myapp/src:/src
You can use remote NFS volumes if you're feeling brave.
You may also consider running data-only containers as described here to provide some data portability.
Вы можете [сопоставлять каталоги хостов MacOS в виде докеровских томов]
Exposing incoming ports through the host container is fiddly but doable.
This is done by mapping the container port to the host port (only using localhost interface) using -p
:
docker run -p 127.0.0.1:$HOSTPORT:$CONTAINERPORT --name CONTAINER -t someimage
You can tell Docker that the container listens on the specified network ports at runtime by using EXPOSE:
EXPOSE <CONTAINERPORT>
Note that EXPOSE does not expose the port itself -- only -p
will do that. To expose the container's port on your localhost's port:
iptables -t nat -A DOCKER -p tcp --dport <LOCALHOSTPORT> -j DNAT --to-destination <CONTAINERIP>:<PORT>
If you're running Docker in Virtualbox, you then need to forward the port there as well, using forwarded_port. Define a range of ports in your Vagrantfile like this so you can dynamically map them:
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
...
(49000..49900).each do |port|
config.vm.network :forwarded_port, :host => port, :guest => port
end
...
end
If you forget what you mapped the port to on the host container, use docker port
to show it:
docker port CONTAINER $CONTAINERPORT
This is where general Docker best practices and war stories go:
- The Rabbit Hole of Using Docker in Automated Tests
- Bridget Kromhout has a useful blog post on running Docker in production at Dramafever.
- There's also a best practices blog post from Lyst.
- Building a Development Environment With Docker
- Discourse in a Docker Container
This is where security tips about Docker go. The Docker security page goes into more detail.
First things first: Docker runs as root. If you are in the docker
group, you effectively have root access. If you expose the docker unix socket to a container, you are giving the container root access to the host.
Docker should not be your only defense. You should secure and harden it.
For an understanding of what containers leave exposed, you should read Understanding and Hardening Linux Containers by Aaron Grattafiori. This is a complete and comprehensive guide to the issues involved with containers, with a plethora of links and footnotes leading on to yet more useful content. The security tips following are useful if you've already hardened containers in the past, but are not a substitute for understanding.
For greatest security, you want to run Docker inside a virtual machine. This is straight from the Docker Security Team Lead -- slides / notes. Then, run with AppArmor / seccomp / SELinux / grsec etc to limit the container permissions. See the Docker 1.10 security features for more details.
Docker image ids are sensitive information and should not be exposed to the outside world. Treat them like passwords.
See the Docker Security Cheat Sheet by Thomas Sjögren: some good stuff about container hardening in there.
Check out the docker bench security script, download the white papers and subscribe to the mailing lists (unfortunately Docker does not have a unique mailing list, only dev / user).
You should start off by using a kernel with unstable patches for grsecurity / pax compiled in, such as Alpine Linux. If you are using grsecurity in production, you should spring for commercial support for the stable patches, same as you would do for RedHat. It's $200 a month, which is nothing to your devops budget.
Since docker 1.11 you can easily limit the number of active processes running inside a container to prevent fork bombs. This requires a linux kernel >= 4.3 with CGROUP_PIDS=y to be in the kernel configuration.
docker run --pids-limit=64
Also available since docker 1.11 is the ability to prevent processes from gaining new privileges. This feature have been in the linux kernel since version 3.5. You can read more about it in this blog post.
docker run --security-opt=no-new-privileges
From the Docker Security Cheat Sheet (it's in PDF which makes it hard to use, so copying below) by Container Solutions:
Отключите межпроцессное взаимодействие с:
docker -d --icc=false --iptables
Установите контейнер только для чтения:
docker run --read-only
Проверьте образы с помощью хэш-функции:
docker pull debian@sha256:a25306f3850e1bd44541976aa7b5fd0a29be
Установить тома только для чтения:
docker run -v $(pwd)/secrets:/secrets:ro debian
Определите и запустите пользователя в вашем файле Docker, чтобы вы не запускались как root внутри контейнера:
RUN groupadd -r user && useradd -r -g user user
USER user
There's also work on user namespaces -- it is in 1.10 but is not enabled by default.
To enable user namespaces ("remap the userns") in Ubuntu 15.10, follow the blog example.
- Using Docker Safely
- Securing your applications using Docker
- Container security: Do containers actually contain?
- Linux Containers: Future or Fantasy?
В дорожной карте docker говорится о [поддержке seccomp]https://github.com/docker/docker/blob/master/ROADMAP.md#11-security). Существует генератор политики AppArmor, называемый bane, и они работают над профилями безопасности.
Источники:
Новые Команды управления данными Появились с Docker 1.13:
docker system prune
docker volume prune
docker network prune
docker container prune
docker image prune
docker system df
presents a summary of the space currently used by different docker objects.
docker build -t htop - << EOF
FROM alpine
RUN apk --no-cache add htop
EOF
alias dl='docker ps -l -q'
docker run ubuntu echo hello world
docker commit $(dl) helloworld
docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' $(dl) postgres
docker inspect $(dl) | grep -wm1 IPAddress | cut -d '"' -f 4
или установите jq:
docker inspect $(dl) | jq -r '.[0].NetworkSettings.IPAddress'
или используя go шаблон:
docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container_name>
или при создании обрзов из файла Docker, когда вы хотите передать аргумент построения:
DOCKER_HOST_IP=`ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1`
echo DOCKER_HOST_IP = $DOCKER_HOST_IP
docker build \
--build-arg ARTIFACTORY_ADDRESS=$DOCKER_HOST_IP
-t sometag \
some-directory/
docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' <containername>
for i in $(docker ps -a | grep "REGEXP_PATTERN" | cut -f1 -d" "); do echo $i; done
docker run --rm ubuntu env
docker kill $(docker ps -q)
docker rm -f $(docker ps -qa)
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
docker rm -v $(docker ps -a -q -f status=exited)
docker stop $(docker ps -aq) && docker rm -v $(docker ps -aq)
docker rmi $(docker images -q -f dangling=true)
docker rmi $(docker images -q)
Начиная с Docker 1.9:
docker volume rm $(docker volume ls -q -f dangling=true)
In 1.9.0, the filter dangling=false
does not work - it is ignored and will list all volumes.
В 1.9.0, фильтр dangling=false
не работает - он игнорируется и будет перечислять все тома.
docker images -viz | dot -Tpng -o docker.png
- Очистка APT на уровне RUN
Это должно быть сделано в том же слое, что и другие команды apt. В противном случае предыдущие слои по-прежнему сохраняют исходную информацию, и ваши образы будут по-прежнему жирными.
RUN {apt commands} \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
- Сгладить образ
ID=$(docker run -d image-name /bin/bash)
docker export $ID | docker import – flat-image-name
- Для резервного копирования
ID=$(docker run -d image-name /bin/bash)
(docker export $ID | gzip -c > image.tgz)
gzip -dc image.tgz | docker import - flat-image-name
Чтобы проверить использование ЦП, памяти и сетевого ввода-вывода в одном контейнере, вы можете использовать:
docker stats <container>
Для всех контейнеров, перечисленных в id:
docker stats $(docker ps -q)
Для всех контейнеров, перечисленных по имени:
docker stats $(docker ps --format '{{.Names}}')
Для всех контейнеров, перечисленных по образам:
docker ps -a -f ancestor=ubuntu
Удалить все непомеченные образы
docker rmi $(docker images | grep “^” | awk '{split($0,a," "); print a[3]}')
Удалить контейнер с помощью регулярного выражения
docker ps -a | grep wildfly | awk '{print $1}' | xargs docker rm -f
Удалить все завершенные контейнеры
docker rm -f $(docker ps -a | grep Exit | awk '{ print $1 }')
Имейте в виду, что вы можете монтировать файлы в виде томов. Например, вы можете ввести файл конфигурации следующим образом:
# копировать файл из контейнера
docker run --rm httpd cat /usr/local/apache2/conf/httpd.conf > httpd.conf
# редактировать файл
vim httpd.conf
# запускать контейнер с измененной конфигурацией
docker run --rm -ti -v "$PWD/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro" -p "80:80" httpd
Вот как внести свой вклад в этот чит-лист.
Click README.md <-- this link