-
Notifications
You must be signed in to change notification settings - Fork 7
Docker
Подробно установка описана на официальной странице Get Docker CE for Ubuntu.
Также можно установить через Ansible с помощью роли andyceo.docker, которая следует лучшим практикам, описанным в официальной документации.
Если нода в кластере Swarm:
sudo docker swarm leave
Потом удаляем Docker:
sudo apt purge docker-ce
Подчищаем папки Docker:
sudo rm -rf /var/lib/docker /etc/docker
-
Создание образа (image) из Dockerfile:
sudo docker image build -t andyceo/your_container_name .
-
Если создание образа закончилось неудачно, файловую систему в контейнере можно посмотреть, запустив контейнер на основе последнего удачного образа (docker создает промежуточный образ каждый раз, когда выполняет инструкции в Dockerfile), см. раздел Манипуляции с файловой системой образа и контейнера:
sudo docker container run --rm -it <id_of_the_last_success_container> bash -il
-
Показать активные контейнеры:
sudo docker container ps
-
Показать все контейнеры:
sudo docker container ps -a
-
Показать все остановленные контейнеры:
sudo docker container ps -a -f status=exited
-
Показать образы:
sudo docker image ls
-
Запустить контейнер на основе образа andyceo/your_container_name, пробросить порт 80 в контейнере на порт 8082 на хосте и освободить терминал (-d):
sudo docker container run -d -p 8082:80 -t -i --name dokuwiki andyceo/your_container_name
-
Выполнить команду в работающем контейнере:
sudo docker container exec -ti dokuwiki bash -il
-
Посмотреть внешние томы (volumes) контейнера с именем
example
sudo docker container inspect --format "{{ .Mounts }}" example
Все volumes для которых не указан путь расположения на хосте (левая часть
/host/path/to/data:/container/to/data
) хранятся в директории/var/lib/docker/volumes/<хэш volume>/_data/
. Таким образом, можно просто исследовав все директории в/var/lib/docker/volumes/
и найти необходимый. -
Найти неиспользуемые (зависшие, dangled, orphaned) volumes:
sudo docker volume ls -f dangling=true
-
Удалить неиспользуемые volumes:
sudo docker volume rm $(sudo docker volume ls -qf dangling=true)
подробнее про управление данными в контейнере: https://docs.docker.com/engine/userguide/dockervolumes/
-
Посмотреть логи контейнера, последние 10 строк (
--tail 10
) и следить за новыми (-f
):sudo docker container logs -f --tail 10 containername
Найти файл где хранятся логи:
sudo docker container inspect --format='{{.LogPath}}' containername
Записать логи в отдельные два файла (нормальный вывод и вывод ошибок):
sudo docker container logs containername > /tmp/stdout.log 2>/tmp/stderr.log
Записать логи контейнера в один файл, без разделения:
sudo docker container logs containername >& /tmp/stdoutandstderr.log
-
Остановить контейнер:
sudo docker container stop dokuwiki
-
Удалить остановленный контейнер:
sudo docker container rm dokuwiki
-
Остановить и удалить контейнер:
sudo docker container rm -f dokuwiki
-
Посмотреть все остановленные контейнеры
sudo docker container ps -f status=exited
-
Удалить все остановленные контейнеры
sudo docker container rm $(sudo docker ps -q -f status=exited)
-
Удалить образ:
sudo docker image rm dokuwiki
-
Удалить старые, неиспользуемые образы
sudo docker image rm -f $(sudo docker images | grep "<none>" | awk "{print \$3}")
-
Более дружелюбный
docker container ps
(без переноса строк)sudo docker container ps -q | xargs sudo docker container inspect --format '{{printf "%.12s\t%s" .Id .Config.Cmd}}'
или
sudo docker container ps | less -S
-
Остановить/удалить все контейнеры:
sudo docker container stop $(sudo docker ps -q) sudo docker container rm $(sudo docker ps -q)
Ключ
–q
или–quiet
заставляет командуps
возвращать только идентификаторы контейнеровКоманда
stop
по умолчанию посылает сигнал SIGTERM корневому процессу контейнера (PID=1), и если процесс не завершается по таймауту (10 секунд по умолчанию), посылается сигнал SIGKILL. Можно контролировать таймаут:sudo docker container stop --time=30 foo
Если вы хотите правильно останавливать контейнеры (разные приложения требуют разных сигналов для корректной остановки), можно почитать Gracefully Stopping Docker Containers
-
Посмотреть логи демона Docker в Ubuntu:
sudo sudo journalctl -fu docker.service
В старых Ubuntu без systemd:
sudo tail -f /var/log/upstart/docker.log
Подробнее и для других операционных систем можно глянуть эту страницу: Where is the Docker daemon log?
-
Посмотреть список процессов в контейнере:
sudo docker container top CONTAINER_NAME
Также, можно выяснить, в каком из контейнеров выполняется процесс с id = 21030:
for i in `sudo docker container ps -q`; do echo $i && sudo docker container top $i | grep 21030 -C 10 ; done
-
Поиграться с последним образом системы Alpine в интерактивном режиме, а потом сразу же удалить контейнер:
docker container run --rm -it alpine /bin/sh
Отсоединиться от контейнера, не прекращая его работу: Ctrl-P Ctrl-Q. Для экспериментов с предустановленным Python 3:
docker container run --rm -it python:3.6.0-alpine /bin/sh
Полезные ссылки:
-
Если создание образа закончилось неудачно, файловую систему в контейнере можно посмотреть, запустив контейнер на основе последнего удачного образа (docker создает промежуточный образ каждый раз, когда выполняет инструкции в Dockerfile):
sudo docker container run --rm -it <id_of_the_last_success_container> bash -il
-
Скопировать файл из контейнера на хост-систему:
sudo docker container cp <containerId>:/file/path/within/container /host/path/target
-
Скопировать файл из хост-системы в контейнер:
sudo docker container cp /host/path/target <containerId>:/file/path/within/container
-
Создать из сушествующего контейнера другой контейнер, в котором запустить нужную команду (полезно, когда ваш контейнер постоянно останавливается, и не возможности выполнить
docker attach
):sudo docker container commit CONTAINER_ID temporary_image sudo docker container run -it temporary_image /bin/bash
-
Для дополнительных манипуляций с файловой системой контейнера, которые нужно выполнить ДО его запуска, последовательность действий обычно такая:
- Создаем контейнер:
sudo docker container create -ti image_name:tag --name container_name /bin/bash
- Выполним нужные действия над файловой системой контейнера:
sudo docker container start container_name /bin/bash
- Создаем контейнер:
Ссылки:
- Best practices for writing Dockerfiles
- Еще одни Dockerfile best practices
- Большой Docker FAQ: отвечаем на самые важные вопросы
- Using Supervisor with Docker - запускаем несколько процессов внутри контейнера
- Overview of Docker Compose - Orchestration
- Как я уменьшил Docker образ на 98.8% при помощи fanotify - интересное в комментах, про образы
- Gracefully Stopping Docker Containers
- 3 ways to build docker images with ansible
В контейнере, как правило, не установлен MTA. Поэтому для отправки писем нужно подсоединяться по протоколу SMTP на какой-либо MTA, как правило, на MTA хостовой системы. Для этого этот MTA на хостовой системе нужно настроить на прием соединений с подсети Docker. Например для Postfix - параметр mynetworks
:
sudo nano /etc/postfix/main.cf
mynetworks = 127.0.0.0/8 172.17.0.0/16 10.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
Отлаживать почтовый сервер можно, просматривая его логи:
sudo tail -f /var/log/mail.log
В приложении внутри контейнера, нужно настроить отсылку писем через SMTP-протокол. Пример для Gitlab, файл :
gitlab_rails['gitlab_email_from'] = 'gitlab@gitlab.example.com'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "example.com"
gitlab_rails['smtp_port'] = 25
gitlab_ci['gitlab_ci_email_from'] = 'gitlab-ci@gitlab.example.com'
И запустить переконфигурацию Gitlab:
gitlab-ctl reconfigure
-
Сначала, пробросим сокет по http:
socat unix-connect:/var/run/docker.sock TCP4-LISTEN:5555
-
Затем с другого компьютера, выполним запрос по http:
curl -X GET http://10.1.20.115:5555/containers/json
Ссылки:
- Docker Remote API
- Using socat or netcat to debug unix sockets like telnet for tcp
- Playing with the sockets: socat and netcat
- netcat to run remote script
Быстрый старт:
docker container run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock --name dockerui kevan/dockerui:0.10.1
Также, можно настроить прокси веб-сервер, чтобы проксировать запросы с какого-либо поддомена данного сервера на этот контейнер. Т.к. в этом UI нет авторизации вообще, то в целях безопасности нужно настроить nginx на этот хост с HTTP Basic Auth, а также в файерволе запретить входящие соединения на порт 9000
со всех ip-адресов, кроме 127.0.0.1
. Вот пример конфигурации для роли andyceo.nginx:
'dockerui':
enabled: yes
listen:
- '*:443'
root: /var/www
name: dockerui.example.com
auth:
root: 123qwe
nginx:
locations:
main:
pattern: '/'
includes:
- main
location: |
proxy_pass http://127.0.0.1:9000;
proxy_http_version 1.1;
proxy_set_header Connection "";
Можно установить в виде докер-контейнера из образа kevan/dockerui, с помощью Ansible-роли andyceo.docker: Ansible Docker config, Proxy Nginx virtual host configuration.
- dockerui/dockerui - этот образ был удален, а сам проект переименован! Вместо него в issue github рекомендуют использовать образ одного из разработчиков dockerui kevan/dockerui
- Github crosbymichael/dockerui
- Dockerui with Nginx HTTP Auth
Если у вас есть файл с заданиями cron на хост-системе:
docker run -it --rm -v tasks.cron:/tasks.cron alpine:3.5 sh -c “crontab /tasks.cron && crond -f -L /dev/stdout”
Использование cron полностью в командной строке:
docker run -it --rm alpine sh -c echo "30 2 */2 * * your_command_goes_here" | crontab - && crond -f -L /dev/stdout
Подробнее см. источник: Running cron in Docker the Easy Way
Footer is under construction
Sidebar is under construction