Syntax highlighting of e25d56d ~( devops/Docker)
<<TableOfContents()>> = Docker = [[https://www.docker.com/|Official site|class=" moin-https"]] [[https://docs.docker.com|Docker Docs|class=" moin-https"]] [[https://hub.docker.com/|Docker Hub|class=" moin-https"]] == Разделы == [[https://moin.onrails.ru/DockerImages|Образы|class=" moin-https"]] [[https://moin.onrails.ru/DockerRemote|Удаленное управление|class=" moin-https"]] [[https://moin.onrails.ru/Устранение%20неисправностей%20Docker|Устранение неисправностей|class=" moin-https"]] == Полезные ссылки == [[https://docs.docker.com/engine/installation/linux/ubuntu/|Get Docker for Ubuntu|class=" moin-https"]][[https://docs.docker.com/engine/installation/linux/linux-postinstall/|Post-installation steps for Linux|class=" moin-https"]] [[https://docs.docker.com/compose/install/|Install Docker Compose|class=" moin-https"]] [[https://docs.docker.com/engine/reference/commandline/cli/|Docker CLI|class=" moin-https"]] [[https://docs.docker.com/engine/reference/builder/|Dockerfile reference|class=" moin-https"]] [[https://docs.docker.com/develop/develop-images/dockerfile_best-practices/|Dockerfile best practies|class=" moin-https"]] [[https://docs.docker.com/compose/compose-file/compose-file-v2/|Compose file reference v2 |class=" moin-https"]] | [[https://docs.docker.com/compose/compose-file/compose-file-v3/|v3|class=" moin-https"]] [[https://github.com/jwilder/nginx-proxy|Docker Nginx Proxy|class=" moin-https"]] '''[[https://github.com/moncho/dry|DRY - интерактивная утилита для управления Docker|class=" moin-https"]]''' [[https://habr.com/ru/post/439806/|Доменные имена с валидным SSL для локальных Docker-контейнеров|class=" moin-https"]][[https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes|Удаление образов, контейнеров и томов|class=" moin-https"]][[https://habr.com/ru/company/southbridge/blog/329138/|ENTRYPOINT vs CMD: назад к основам|class=" moin-https"]] == Commands == {{{#!highlight bash # Проверка корректности установки Docker docker run hello-world # Отображение низкоуровневой информации об объектах Docker docker inspect [OPTIONS] NAME|ID [NAME|ID...] # Удаление всех остановленных контейнеров docker rm $(docker ps -a -q) # Удаление образа или образов ## Удаление образа с none-именем docker rmi $(docker images | grep "^<none>" | awk '{print $3}') ## Удаление образа с none-именем или none-меткой docker rmi $(docker images | grep "<none>" | awk '{print $3}') ## Удаление образов и слоев docker rmi $(docker images -f dangling=true -q) ## Задача crontab для ежедневного удаления none образов @daily docker rmi $(docker images | grep "<none>" | awk '{print $3}') # Удаление ВСЕХ образов. ВЫПОЛНЯТЬ С ОСТОРОЖНОСТЬЮ docker rmi -f $(docker images -aq) # Очистка дискового пространства: # удаляются остановленные контейнеры и тома docker system prune -a --volumes # === ИНСПЕКТИРОВАНИЕ === # --- Просмотр журнала контейнера из файла docker inspect --format='{{.LogPath}}' containername # --- смонтированные тома docker inspect peer1.org1.com | jq .[0].Mounts # --- просмотр entrypoint и cmd образа docker inspect -f '{{.Config.Entrypoint}}' image-name-or-id docker inspect -f '{{.Config.Cmd}}' image-name-or-id # Принудительное пересоздание контейнера docker-compose up -d --force-recreate SERVICE_NAME # Запуска контейнера в окружении localhost # можно соединяться изнутри контейнера к портам localhost docker run --network="host" ... # --- Запуск bash с заменой entrypoint docker run --rm -it --entrypoint 'bin/bash' IMAGENAME # --- Установка параметра restart для запущенного контейнера docker update --restart=always <container> # --- Переименование контейнера docker rename my_container my_new_container # --- check Docker image for vulnerabilites docker run --rm \ -e DOCKER_IMAGE=eclipse-temurin:11.0.15_10-jdk-alpine \ registry.gitlab.com/security-products/container-scanning:5 \ gtcs scan docker ps --size --format=.ID docker ps --size --format "{{.ID}}" docker ps --size --format "{{.Names}}" docker ps --size --format "{{.Names}} {{ .Size }}" docker ps --size --format "{{.Names}}\t{{.Size}}" docker ps --size --format "{{.Names}}\t\t\t{{.Size}}" docker ps --size --format "{{.Names}}\t\t\t{{.Size}}" | grep moe-sobranie docker ps --size --format "{{.Names}}\t\t{{.Size}}\t{{.RunningFor}}" | grep moe-sobranie docker ps --size --format "{{.Names}}\t\t{{.Size}}\t{{.CreatedAt}}" | grep moe-sobranie docker ps docker ps --size --format "{{.Names}}\t\t{{.Size}}\t{{.Status}}" | grep moe-sobranie }}} == Dockerfile == === ENTRYPOINT vs CMD === https://docs.docker.com/engine/reference/builder/#entrypoint https://habr.com/ru/company/southbridge/blog/329138/ 1. В Dockerfile должны присутствовать `ENTRYPOINT` или `CMD` или обе 1. `ENTRYPOINT` задается для контейнеров, которые используются как исполнительные программы (executable). 1. `CMD` определяется как аргументы по умолчанию для для исполнительной программы (по п. 2) 1. `CMD` может переопределяться при запуске контейнера {{https://clck.ru/sGbKW|entrypoint vs cmd}} == Docker API == https://docs.docker.com/engine/api/ {{{#!highlight bash # --- get containers list curl -s --unix-socket /var/run/docker.sock http://localhost/containers/a72a50ba0c90/json curl -s --unix-socket /var/run/docker.sock http://localhost/containers/fa765e9b9fb1/json curl -s --unix-socket /var/run/docker.sock http://localhost/containers/a3dfe5026f27/json | jq # --- inspect container by id # CONTAINER_ID is a hostname inside a container or HOSTNAME environment variable curl -s --unix-socket /var/run/docker.sock http://localhost/containers/CONTAINER_ID/json }}} == Docker Logs == === Service Labels in Log === Докер по умолчанию складирует логи в файл `/var/lib/docker/containers/<container_id>/<container_id>-json.log` Для того, чтобы в логи записывались метки (labels) контейнера, которые указываются в команде `docker run` или в `docker-compose.yml` необходимо прописать эти метки в конфигурацию демона. . Если планируется фильтровать логи с использованием `fluent-bit` , то могут возникнуть проблемы с ключевыми полями, содержащие точки, напр: `example.com=foo` - ключевое поле содержит точку {{{#!highlight yaml # docker-compose.yml services: service_name: # ... labels: - 'com.example=foo' }}} {{{#!highlight json // /etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "labels": "com.example" } } }}} Перезапускаем systemd-демон {{{#!highlight bash sudo systemctl daemon-reload sudo systemctl restart docker.service }}} Смотрим логи {{{ // /var/lib/docker/containers/<container_id>/<container_id>-json.log {"log":"...", "attrs":{"com.example":"foo"}, ...} }}} == Recipes == === Link Containers === Допустим у нас БД запускается в одном контейнере, а приложение запускается в другом. По-умолчанию оба контейнера работают в одной сети ''docker0'' c IP 172.17.0.X {{{ ifconfig docker0 }}} поэтому взаимодействие может быть построено по IP-адресам. Однако, правильный подход предполагает связь по символическому имени, например. имени контейнера. Для того, чтобы контейнер БД был доступен в контейнере приложения по имени, необходимо при запуске контейнера приложения использовать опцию `--link ANOTHER_CONTAINER_NAME`. Это имя будет прописано в файл ''/etc/hosts'' и будет доступным. {{{#!highlight bash docker run --name gosplan --rm -it --link postgres_gosplan gosplan bash /home/app/gosplan> ping postgres_gosplan }}} Для того, чтобы не задавать явно имя контейнера в файле ''config/database.yml'', можно воспользоваться переменной окружения: {{{#!highlight yaml production: <<: *default host: <%= ENV["POSTGRES_HOST"] port: <%= ENV["POSTGRES_PORT"] username: ... }}} === Re-install docker === переустановка докера {{{#!highlight bash sudo apt-get purge docker-engine sudo apt-get autoremove --purge docker-engine sudo rm -rf /var/lib/docker # This deletes all images, containers, and volumes sudo reboot sudo apt-get install docker-ce }}} == About Docker == https://habr.com/ru/post/353238/ Docker - это открытая платформа для разработки, доставки и эксплуатации приложений. С помощью docker вы можете отделить ваше приложение от вашей инфраструктуры и обращаться с инфраструктурой как управляемым приложением. Docker позволяет запускать практически любое приложение, безопасно изолированное в контейнере. Безопасная изоляция позволяет вам запускать на одном хосте много контейнеров одновременно. Легковесная природа контейнера, который запускается без дополнительной нагрузки гипервизора, позволяет вам добиваться больше от вашего железа. Docker использует архитектуру клиент-сервер. Docker клиент общается с демоном Docker, который берет на себя тяжесть создания, запуска, распределения ваших контейнеров. Оба, клиент и сервер могут работать на одной системе, вы можете подключить клиент к удаленному демону docker. Клиент и сервер общаются через сокет или через RESTful API. Docker - это три компонента: образ, контейнер и реестр. Образ - это read-only шаблон для создания контейнеров, состоящий из "слоев" или "уровней". Реестр - хранилище образов. Контейнер - это процесс, работающий в изолированном окружении (в окружении образа)
