Docker Основные примеры использования.
В этой статье я хотел собрать основные рецепты и заметки по Docker, которые помогут познакомиться с ним и быстро начать работу.
Начнем с установки, установить Doсker можно так:
На Debian based:
Ставим необходимые пакеты:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common |
Добавляем ключ GPG для репозитория Docker
1 |
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - |
Добавляем репозиторий
1 2 3 4 5 6 7 |
sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable |
Ставим Docker
1 2 3 |
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io |
Для установки Docker в Ubuntu повторяем те же шаги кроме:
1 |
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - |
1 2 3 4 5 6 7 |
sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" |
Для установки Docker на CentOS делаем следующее:
Устанавливаем необходимые пакеты
1 2 3 4 5 |
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 |
Добавляем репозиторий
1 2 3 4 5 |
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo |
Устанавливаем Docker
1 |
sudo yum install docker-ce docker-ce-cli containerd.io |
Запуск контейнера
Чтобы запустить контейнер выполните следующую команду:
1 |
docker run hello-world |
Рассмотрим пример запуска двух контейнеров с пробросом портов наружу и созданием линка между контейнерами и указанием volume для постоянного хранения данных.
Запуск первого контейнера в интерактивном режиме
1 2 3 4 5 6 7 8 9 10 11 |
docker run -it --name teamcity-server-instance \ -v data:/data/teamcity_server/datadir \ -v logs:/opt/teamcity/logs \ -p 8080:8111 \ --link gitlab \ jetbrains/teamcity-server |
Запуск второго контейнера в фоне
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
docker run --detach \ --hostname mydockerserver.local \ --env GITLAB_OMNIBUS_CONFIG="external_url 'http://mydockerserver.local/'; gitlab_rails['lfs_enabled'] = true;" \ --publish 443:443 --publish 80:80 --publish 2222:2222 \ --name gitlab \ --restart always \ --volume config:/etc/gitlab \ --volume logs:/var/log/gitlab \ --volume data:/var/opt/gitlab \ gitlab/gitlab-ce:latest |
Таким образом мы запустили 2 контейнера, teamcity и gitlab, к которым можно подключиться через ip адрес нашего хоста (на котором запущен Docker)
и настроили связь между этими двумя контейнерами.
параметры:
—publish — проброс портов
—name имя для запускаемого контейнера
—restart перезапуск при падении
—volume подключение внешнего хранилища для хранения данных внутри контейнера на хосте, например —volume logs:/var/log/gitlab — сохранит папку /var/log/gitlab внутри контейнера на хосте в папке logs
—env позволяет назначить переменные окружения
—detach запускает контейнер в фоне
-it выполняет интерактивный запуск
—link позволяет линковать контейнеру друг с другом
Последний параметр указывает какой образ docker запустить в примерах это jetbrains/teamcity-server и gitlab/gitlab-ce:latest
Посмотреть список образов можно тут https://hub.docker.com/
Сборка контейнера
Рассмотрим пример сборки Docker образа
Создадим простейший dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# Use an official Python runtime as a parent image FROM python:2.7-slim # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app COPY . /app # Install any needed packages specified in requirements.txt RUN pip install --trusted-host pypi.python.org -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["python", "app.py"] |
Создадим файл приложения app.py со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
from flask import Flask from redis import Redis, RedisError import os import socket # Connect to Redis redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2) app = Flask(__name__) @app.route("/") def hello(): try: visits = redis.incr("counter") except RedisError: visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" \ "<b>Visits:</b> {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__": app.run(host='0.0.0.0', port=80) |
Создаим файл с зависимостями — requirements.txt со следующим содержимым:
1 2 |
Flask Redis |
Для сборки мы должны находится в каталоге с ранее созданными файлами, проверяем с помощью команды ls
1 2 3 |
$ ls Dockerfile app.py requirements.txt |
Запускаем сборку контейнера:
1 |
docker build --tag=friendlyhello . |
Мы собрали контейнер с именем friendlyhello
Запусим собранный контейнер, с пробросом порта
1 |
docker run -p 4000:80 friendlyhello |
Контейнер запущен и доступен по адресу
Основные команды
Просмотр образов Docker:
1 |
docker image ls |
Просмотр запущенных контейнеров:
1 2 3 4 5 |
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago |
Либо
1 |
docker ps -a |
Остановка контейнера
1 |
docker container stop 1fa4ab2cf395 |
Удаление контейнера
1 2 3 4 5 6 7 |
docker ps -a CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago docker rm 1fa4ab2cf395 |
Подключение к консоли контейнера
находим контейнер:
1 2 3 4 5 |
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago |
подключаемся к консоли контейнера:
1 |
docker exec -it 1fa4ab2cf395 bash |
Также можно выполнять команды внутри контейнера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ docker exec -it web ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:3/64 scope link valid_lft forever preferred_lft forever |
Теперь рассмотрим настройку прокси на Docker хосте
ЕСЛИ ИСПОЛЬЗУЕТСЯ SYSTEMD нужно в настройки сервиса Docker добавить прокси, открываем сервис и добавляем в него строку:
1 |
Environment="HTTP_PROXY=http://proxy.example.com:80/" |
Должно получится примерно так:
1 2 3 |
[Service] Environment="HTTP_PROXY=http://proxy.example.com:80/ |
Далее применяем изменения systemd
1 2 3 |
sudo systemctl daemon-reload sudo systemctl restart docker |
Теперь редактируем файл ~/.docker/config.json под своим пользователем (если файла нет — создаем)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "proxies": { "default": { "httpProxy": "http://127.0.0.1:3001", "httpsProxy": "http://127.0.0.1:3001", "noProxy": "*.test.example.com,.example2.com" } } } |
В качестве альтернативы можно передать параметры прокси контейнеру, через Docker run,
1 2 3 4 5 6 7 |
--env HTTP_PROXY="http://127.0.0.1:3128" --env HTTPS_PROXY="https://127.0.0.1:3128" --env FTP_PROXY="ftp://127.0.0.1:3001" --env NO_PROXY="*.test.example.com,.example2.com" |
Или внутри Dockerfile
1 2 3 4 5 6 7 |
ENV HTTP_PROXY "http://127.0.0.1:3001" ENV HTTPS_PROXY "https://127.0.0.1:3001" ENV FTP_PROXY "ftp://127.0.0.1:3001" ENV NO_PROXY "*.test.example.com,.example2.com" |
Сборка Dockerfile с указанием прокси:
1 |
docker build --build-arg http_proxy=http://127.0.0.1:3001 --build-arg https_proxy=http://127.0.0.1:3001 |
Чтобы узнать IP адрес контейнера выполните команды:
находим нужный контейнер
1 2 3 4 5 |
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago |
Узнаем его ip адрес:
1 |
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 1fa4ab2cf395 |
Добавить комментарий