Skip to content

Latest commit

 

History

History

ru

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

Docker Cheat Sheet

Want to improve this cheat sheet? See the Contributing section!

Содержание

Почему Docker

"С Docker разработчики могут создавать любое приложение на любом языке, используя любую инструментальную цепочку. Приложения помещаются в контейнер - становятся полностью переносимы и могут работать где угодно - на компьютерах под управлением OS X и Windows, серверах QA, работающих под управлением Ubuntu в облаке, и виртуальных машинах производственного центра обработки данных Red Hat.

Разработчики могут быстро начать работу, начиная с одного из 13 000 приложений, доступных на Docker Hub. Docker управляет и отслеживает изменения и зависимости, что облегчает для системных администраторов понимание того, как работают приложения, созданные разработчиками. И с Docker Hub разработчики могут автоматизировать свой процес сборки и совместно использовать артефакты с сотрудниками через публичные или частные репозитории.

Docker помогает разработчикам создавать и отправлять более качественные приложения быстрее " -- Что такое Docker

Предпосылки

Я использую Oh My Zsh вместе с Docker plugin для автозаполнения команд docker. Возможно у вас другой подход.

Linux

Ядро 3.10.x минимальное требование для Docker.

MacOS

10.8 “Mountain Lion” или более новый.

Установка

Linux

Быстрый и простой скрипт установки, предоставляемый Docker:

curl -sSL https://get.docker.com/ | sh

Если вы не хотите запускать случайный сценарий оболочки, см. Инструкции по установке на ваш дистрибутив.

Если вы являетесь полноправным новичком Docker, вы должны следовать сериям учебников сейчас.

macOS

Скачать и установить 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

подробнее о привилегированных контейнерах здесь

Info

  • 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).

Info

  • docker history показывает историю образа.
  • docker tag теги образа к имени (локальному или реестру).

Проверка версии Docker

Очень важно, чтобы вы всегда знали текущую версию 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"}

Cleaning up

Хотя вы можете использовать команду 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. Об этом мало что известно, поэтому это хорошее место для расширения чит-листа. Существует примечание, в котором говорится, что это хороший способ настроить контейнеры докеров, чтобы разговаривать друг с другом без использования портов. Подробнее см. Работа с сетями.

Жизненный цикл

Info

Connection

Вы можете указать конкретный 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 и посмотреть на локальное развертывание инструкци.

Также см. Список рассылки.

Dockerfile

Файл конфигурации. Устанавливает контейнер Docker, когда вы запускаете на нем docker build. Крайне предпочтительнее docker commit.

Вот некоторые распространенные текстовые редакторы и их модули подсветки синтаксиса, которые вы могли бы использовать для создания Dockerfiles:

Инструкции

  • .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 устанавливает сигнал системного вызова, который будет отправлен в контейнер для выхода.

Tutorial

Примеры

Слои

Файловая система с версией в 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 - свободно плавающие файловые системы.Они не обязательно должны быть подключены к конкретному контейнеру. Вы должны использовать тома, примонированные из контейнеров только для данных для переносимости.

Жизненный цикл

Info

Тома полезны в ситуациях, когда вы не можете использовать ссылки (которые только 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:

Безопасность

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

User Namespaces

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.

Security Videos

Security Roadmap

В дорожной карте docker говорится о [поддержке seccomp]https://github.com/docker/docker/blob/master/ROADMAP.md#11-security). Существует генератор политики AppArmor, называемый bane, и они работают над профилями безопасности.

Советы

Источники:

Prune

Новые Команды управления данными Появились с Docker 1.13:

  • docker system prune
  • docker volume prune
  • docker network prune
  • docker container prune
  • docker image prune

df

docker system df presents a summary of the space currently used by different docker objects.

Контейнер для докеров Heredoc

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

Commit с командой (требуется Dockerfile)

docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' $(dl) postgres

Получить IP-адрес

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

Похудение Docker контейнеров

  • Очистка 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

Содействие

Вот как внести свой вклад в этот чит-лист.

Открыть README.md

Click README.md <-- this link

Click This

Отредактировать страницу

Edit This

Внести изменения и зафиксировать

Change This

Commit