Шпаргалка с командами Docker

Представленные здесь команды описаны минимально (с акцентом на читаемость как есть) и включают в себя установку Docker, работу с реестрами и репозиториями, контейнерами, образами, сетью, Docker Swarm. Ниже представлен перевод шпаргалки в её состоянии на 2 сентября с дополнениями из комментариев ниже.

Установка

Linux

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

Mac

Скачайте dmg по этой ссылке:

https://download.docker.com/mac/stable/Docker.dmg

Windows

Используйте MSI-инсталлятор:

https://download.docker.com/win/stable/InstallDocker.msi

Реестры и репозитории Docker

Вход в реестр

docker login
docker login localhost:8080

Выход из реестра

docker logout
docker logout localhost:8080

Поиск образа

docker search nginx
docker search nginx -- filter stars=3 --no-trunc busybox

Pull (выгрузка из реестра) образа

docker pull nginx
docker pull eon01/nginx localhost:5000/myadmin/nginx

Push (загрузка в реестр) образа

docker push eon01/nginx
docker push eon01/nginx localhost:5000/myadmin/nginx

Первые действия с контейнерами

Создание контейнера

docker create -t -i eon01/infinite --name infinite

Первый запуск контейнера

docker run -it --name infinite -d eon01/infinite

Переименование контейнера

docker rename infinite infinity

Удаление контейнера

docker rm infinite

Обновление контейнера

docker update --cpu-shares 512 -m 300M infinite

Запуск и остановка контейнеров

Запуск остановленного контейнера

docker start nginx

Остановка

docker stop nginx

Перезагрузка

docker restart nginx

Пауза (приостановка всех процессов контейнера)

docker pause nginx

Снятие паузы

docker unpause nginx

Блокировка (до остановки контейнера)

docker wait nginx

Отправка SIGKILL (завершающего сигнала)

docker kill nginx

Отправка другого сигнала

docker kill -s HUP nginx

Подключение к существующему контейнеру

docker attach nginx

Получение информации о контейнерах

Работающие контейнеры

docker ps
docker ps -a

Логи контейнера

docker logs infinite

Информация о контейнере

docker inspect infinite
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -q)

События контейнера

docker events infinite

Публичные порты

docker port infinite

Выполняющиеся процессы

docker top infinite

Использование ресурсов

docker stats infinite

Изменения в файлах или директориях файловой системы контейнера

docker diff infinite

Управление образами

Список образов

docker images

Создание образов

docker build .
docker build github.com/creack/docker-firefox
docker build - < Dockerfile
docker build - < context.tar.gz
docker build -t eon/infinite .
docker build -f myOtherDockerfile .
curl example.com/remote/Dockerfile | docker build -f - .

Удаление образа

docker rmi nginx

Загрузка репозитория в tar (из файла или стандартного ввода)

docker load < ubuntu.tar.gz
docker load --input ubuntu.tar

Сохранение образа в tar-архив

docker save busybox > ubuntu.tar

Просмотр истории образа

docker history

Создание образа из контейнера

docker commit nginx

Тегирование образа

docker tag nginx eon01/nginx

Push (загрузка в реестр) образа

docker push eon01/nginx

Сеть

Создание сети

docker network create -d overlay MyOverlayNetwork
docker network create -d bridge MyBridgeNetwork
docker network create -d overlay \
  --subnet=192.168.0.0/16 \
  --subnet=192.170.0.0/16 \
  --gateway=192.168.0.100 \
  --gateway=192.170.0.100 \
  --ip-range=192.168.1.0/24 \
  --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \
  --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \
  MyOverlayNetwork

Удаление сети

docker network rm MyOverlayNetwork

Список сетей

docker network ls

Получение информации о сети

docker network inspect MyOverlayNetwork

Подключение работающего контейнера к сети

docker network connect MyOverlayNetwork nginx

Подключение контейнера к сети при его запуске

docker run -it -d --network=MyOverlayNetwork nginx

Отключение контейнера от сети

docker network disconnect MyOverlayNetwork nginx

Очистка Docker

Удаление работающего контейнера

docker rm nginx

Удаление контейнера и его тома (volume)

docker rm -v nginx

Удаление всех контейнеров со статусом exited

docker rm $(docker ps -a -f status=exited -q)

Удаление всех остановленных контейнеров

docker container prune
docker rm `docker ps -a -q`

Удаление контейнеров, остановленных более суток назад

docker container prune --filter "until=24h"

Удаление образа

docker rmi nginx

Удаление неиспользуемых (dangling) образов

docker image prune
docker rmi $(docker images -f dangling=true -q)

Удаление неиспользуемых (dangling) образов даже с тегами

docker image prune -a

Удаление всех образов

docker rmi $(docker images -a -q)

Удаление всех образов без тегов

docker rmi -f $(docker images | grep "^<none>" | awk "{print $3}")

Остановка и удаление всех контейнеров

docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)

Удаление неиспользуемых (dangling) томов

docker volume prune
docker volume rm $(docker volume ls -f dangling=true -q)

Удаление неиспользуемых (dangling) томов по фильтру

docker volume prune --filter "label!=keep"

Удаление неиспользуемых сетей

docker network prune

Удаление всех неиспользуемых объектов

docker system prune

По умолчанию для Docker 17.06.1+ тома не удаляются. Чтобы удалились и они тоже:

docker system prune --volumes

Docker Swarm

Установка Docker Swarm

curl -ssl https://get.docker.com | bash

Прим. перев.: в Docker версий 1.12.0+ ничего дополнительно устанавливать не требуется, т.к. Docker Swarm встроен в Docker Engine в виде специального режима (Swarm mode).

Инициализация Swarm

docker swarm init --advertise-addr 192.168.10.1

Подключение рабочего узла (worker) к Swarm

docker swarm join-token worker

Подключение управляющего узла (manager) к Swarm

docker swarm join-token manager

Список сервисов

docker service ls

Список узлов

docker node ls

Создание сервиса

docker service create --name vote -p 8080:80 instavote/vote

Список заданий Swarm

docker service ps

Масштабирование сервиса

docker service scale vote=3

Обновление сервиса

docker service update --image instavote/vote:movies vote
docker service update --force --update-parallelism 1 --update-delay 30s nginx
docker service update --update-parallelism 5--update-delay 2s --image instavote/vote:indent vote
docker service update --limit-cpu 2 nginx
docker service update --replicas=5 nginx

P.S.

Прим. перев.: Напомню, что оригинальная (англоязычная) версия Docker Cheat Sheet доступна и обновляется в Git-репозитории. Автор будет рад исправлениям/пополнениям от сообщества.

Автоматическая сборка Android приложения с помощью Jenkins и публикация в Google Play Market + Telegram Bot оповещение

Для того что бы поднять Jenkins в докер, какие Volume пробрасывать сами решайте, это полностью скопированная моя конфигурация для примера

docker run -it -d -v jenkins_home:/var/jenkins_home -v /usr/lib/android-sdk:/usr/lib/android-sdk -v /opt/tomcat-latest/webapps:/opt/tomcat-latest/webapps -p 8070:8080 -p 50000:50000 --env JENKINS_OPTS="--prefix=/jenkins" --restart always leganas/ls_repository:jenkins

Git хук, который выполняет curl к jenkins , если push событие было в ветку мастер. Этот гит хук можно прописывать не только в Gita, можно сразу в папку gita в хуки прописать и будет так же работать в любом git репозитарии.

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" = "$branch" ]; then
       curl --user USER:API_Token https://legan.by/jenkins/job/MenuAndMarket/build?token=TOKEN_JENKINS
    fi
done

ПС. Если ветка не важна, можно убрать всё кроме 1 строки и самой строчки curl

Настройки build.gradle уровня app для автоматической генерации номера версии на приложения на основании даты и времени

...

def getVersionNameTimestamp() {
    return new Date().format('yy.MM.ddHHmm')
}

def getVersionCodeTimestamp() {
    def date = new Date()
    def formattedDate = date.format('yyMMddHHmm')
    def code = formattedDate.toInteger()
    println sprintf("VersionCode: %d", code)
    return code
}

...

android {

...

defaultConfig {
     ...
        versionCode getVersionCodeTimestamp()
        versionName "${getVersionNameTimestamp()}"

Настройки build.gradle уровня app для автоматической подписи apk

// Load keystore
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

...

android {
    signingConfigs {
        config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

...

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }

Пример JSON Shema приходящий от Gitea , есть прекрасный ресурс позволяющий превратить это в Java классы http://www.jsonschema2pojo.org/

{
  "secret": "3gEsCfjlV2ugRwgpU#w1*WaW*wa4NXgGmpCfkbG3",
  "ref": "refs/heads/develop",
  "before": "28e1879d029cb852e4844d9c718537df08844e03",
  "after": "bffeb74224043ba2feb48d137756c8a9331c449a",
  "compare_url": "http://localhost:3000/gitea/webhooks/compare/28e1879d029cb852e4844d9c718537df08844e03...bffeb74224043ba2feb48d137756c8a9331c449a",
  "commits": [
    {
      "id": "bffeb74224043ba2feb48d137756c8a9331c449a",
      "message": "Webhooks Yay!",
      "url": "http://localhost:3000/gitea/webhooks/commit/bffeb74224043ba2feb48d137756c8a9331c449a",
      "author": {
        "name": "Gitea",
        "email": "someone@gitea.io",
        "username": "gitea"
      },
      "committer": {
        "name": "Gitea",
        "email": "someone@gitea.io",
        "username": "gitea"
      },
      "timestamp": "2017-03-13T13:52:11-04:00"
    }
  ],
  "repository": {
    "id": 140,
    "owner": {
      "id": 1,
      "login": "gitea",
      "full_name": "Gitea",
      "email": "someone@gitea.io",
      "avatar_url": "https://localhost:3000/avatars/1",
      "username": "gitea"
    },
    "name": "webhooks",
    "full_name": "gitea/webhooks",
    "description": "",
    "private": false,
    "fork": false,
    "html_url": "http://localhost:3000/gitea/webhooks",
    "ssh_url": "ssh://gitea@localhost:2222/gitea/webhooks.git",
    "clone_url": "http://localhost:3000/gitea/webhooks.git",
    "website": "",
    "stars_count": 0,
    "forks_count": 1,
    "watchers_count": 1,
    "open_issues_count": 7,
    "default_branch": "master",
    "created_at": "2017-02-26T04:29:06-05:00",
    "updated_at": "2017-03-13T13:51:58-04:00"
  },
  "pusher": {
    "id": 1,
    "login": "gitea",
    "full_name": "Gitea",
    "email": "someone@gitea.io",
    "avatar_url": "https://localhost:3000/avatars/1",
    "username": "gitea"
  },
  "sender": {
    "id": 1,
    "login": "gitea",
    "full_name": "Gitea",
    "email": "someone@gitea.io",
    "avatar_url": "https://localhost:3000/avatars/1",
    "username": "gitea"
  }
}

 

Создание SSL-сертификатов для Nginx с Let’s Encrypt под Ubuntu 16.04

Некоммерческий удостоверяющий центр Let’s Encrypt, развивающийся под эгидой Linux Foundation — хороший способ получить бесплатный (не самоподписанный!) SSL/TLS-сертификат сроком на три месяца, с возможностью автопродления.

В данном руководстве все действия будут выполняться с помощью официального клиента letsencrypt. Он позволяет создать достоверный сертификат, пригодный для использования в различных приложениях, конкретно же речь пойдет об Nginx.

Требования:

  • Ubuntu Server 16.04;
  • пользователь с sudo-привилегиями;
  • собственно домен; 
  • DNS-запись A вашего домена должна указывать на IPv4-адрес вашего же сервера в Vscale (необходимо для подтверждения владения; доменом). Это также в силе для поддоменов (вроде www.example.site).

Шаг 1. Установка необходимого ПО

Обновим локальные индексы менеджера пакетов и установим клиент letsencrypt:

$ sudo apt-get update
$ sudo apt-get install letsencrypt -y

Мы пойдём по пути использования Web-root плагина letsencrypt, суть работы которого заключается в том, что он помещает специальный файл в каталог /.well-known (путь указан относительно корня веб-директории), необходимый для валидации вашего домена серверной частью ПО Let’s Encrypt.

Если по какой-либо причине ещё не был установлен веб-сервер Nginx — сделайте это с помощью следующих команд:

$ sudo add-apt-repository ppa:nginx/development
$ sudo apt-get update
$ sudo apt-get install nginx -y

Шаг 2. Подготовка к выпуску сертификата

Откройте конфигурационный файл Nginx:

$ sudo nano /etc/nginx/sites-available/default

внутри серверного блока (server { …) поместите блок location:

        location ~ /.well-known {
                allow all;
        }

выйдите из редактора, сохранив изменения, по нажатию Ctrl+X, y, Enter.

Протестируйте конфигурационный файл Nginx на корректность:

$ sudo nginx -t

Перезапустите Nginx:

$ sudo service nginx reload

Шаг 3. Выпуск сертификата

Запустите клиент letsencrypt с повышением и нужными Вам параметрами (/var/www/html — корень вашей веб-директории (по-умолчанию), example.site — домен):

$ sudo letsencrypt certonly -a webroot --webroot-path=/var/www/html -d example.site -d www.example.site

После этого вам будет предложено ввести e-mail (для получения уведомлений об истечении сертификата, если вы вдруг не захотите настроить автопродление) и согласиться с лицензионным соглашением.

Итак, теперь у вас есть 4 PEM-файла, относящихся к сертификату — можно вывести их имена командой (example.site — ваш домен):

$ sudo ls -l /etc/letsencrypt/live/example.site

Шаг 4. Генерация параметров Диффи-Хеллмана

Для улучшения безопасности — cгенерируем параметры Диффи-Хеллмана и запишем в файл (процесс займёт некоторое время):

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Шаг 5. Изменение конфигурации Nginx:

Опять отредактируем конфигурационный файл Nginx:

$ sudo nano /etc/nginx/sites-available/default

Привожу проверенный вариант:

server {
 listen 80;
 listen [::]:80;

 server_name example.site;
 # редирект на HTTPS
 return 301 https://$server_name$request_uri;

 server_tokens off;
}

server {
 listen 443 ssl http2;
 listen [::]:443 ssl http2;

 server_name example.site;

 ssl_certificate /etc/letsencrypt/live/example.site/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/example.site/privkey.pem;
 ssl_dhparam /etc/ssl/certs/dhparam.pem;
 ssl_session_timeout 1d;
 ssl_session_cache shared:SSL:50m;
 ssl_session_tickets off;
 # конфигурация Modern
 ssl_protocols TLSv1.2;
 ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
 ssl_prefer_server_ciphers on;
 # HSTS - форсированно устанавливать соединение по HTTPS
 add_header Strict-Transport-Security "max-age=15768000";
 # Разрешение прикрепления OCSP-ответов сервером
 ssl_stapling on;
 # Разрешение проверки сервером ответов OCSP
 ssl_stapling_verify on;

 root /var/www/html;
 index index.html index.htm index.nginx-debian.html;
 # Запрещение выдачи версии nginx в HTTP-заголовках
 server_tokens off;

 location / {
 try_files $uri $uri/ =404;
 }
 # для валидации Let's Encrypt
 location ~ /.well-known {
 allow all;
 }
}

Для более подробного разъяснения SSL-директив в конфигурации Nginx: документация (на русском) ngx_http_ssl_module.

Преимущества такой конфигурации:

  • поддержка бинарного протокола HTTP2
  • HTTPS-only
  • заточена под максимальную безопасность и современные версии браузеров
  • A+-рейтинг по версии SSL Labs

Шаг 6 (необязательный). Настройка автопродления сертификата

Вручную продлить сертификат на 3 месяца можно так:

$ sudo letsencrypt renew

Естественно, следует перезапустить Nginx:

$ sudo service nginx reload

Для автоматизации процесса добавим задание в планировщик сron.

Откройте список заданий cron:

$ crontab -e

Добавьте следующие строки:

30 5 * * 1 sudo letsencrypt renew 35 5 * * 1 sudo service nginx reload

Каждый понедельник, в 05:30 будет производиться запуск клиента Let’s Encrypt, и в случае необходимости — выполняться продление сертификата.

Заключение

Let’s Encrypt выпускает совершенно стандартные сертификаты, без возможности какой-либо настройки. Вся суть состоит в конфигурации веб-сервера Nginx, а именно в нахождении баланса совместимости и безопасности.