Docker Основные примеры использования.
В этой статье я хотел собрать основные рецепты и заметки по Docker, которые помогут познакомиться с ним и быстро начать работу.
Начнем с установки, установить Doсker можно так:
На Debian based:
Ставим необходимые пакеты:
sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common
Добавляем ключ GPG для репозитория Docker
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
Добавляем репозиторий
sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable
Ставим Docker
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
Для установки Docker в Ubuntu повторяем те же шаги кроме:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
Для установки Docker на CentOS делаем следующее:
Устанавливаем необходимые пакеты
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
Добавляем репозиторий
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
Устанавливаем Docker
sudo yum install docker-ce docker-ce-cli containerd.io
Запуск контейнера
Чтобы запустить контейнер выполните следующую команду:
docker run hello-world
Рассмотрим пример запуска двух контейнеров с пробросом портов наружу и созданием линка между контейнерами и указанием volume для постоянного хранения данных.
Запуск первого контейнера в интерактивном режиме
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
Запуск второго контейнера в фоне
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
# 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 со следующим содержимым:
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 со следующим содержимым:
Flask Redis
Для сборки мы должны находится в каталоге с ранее созданными файлами, проверяем с помощью команды ls
$ ls Dockerfile app.py requirements.txt
Запускаем сборку контейнера:
docker build --tag=friendlyhello .
Мы собрали контейнер с именем friendlyhello
Запусим собранный контейнер, с пробросом порта
docker run -p 4000:80 friendlyhello
Контейнер запущен и доступен по адресу
Основные команды
Просмотр образов Docker:
docker image ls
Просмотр запущенных контейнеров:
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
Либо
docker ps -a
Остановка контейнера
docker container stop 1fa4ab2cf395
Удаление контейнера
docker ps -a CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago docker rm 1fa4ab2cf395
Подключение к консоли контейнера
находим контейнер:
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
подключаемся к консоли контейнера:
docker exec -it 1fa4ab2cf395 bash
Также можно выполнять команды внутри контейнера:
$ 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 добавить прокси, открываем сервис и добавляем в него строку:
Environment="HTTP_PROXY=http://proxy.example.com:80/"
Должно получится примерно так:
[Service] Environment="HTTP_PROXY=http://proxy.example.com:80/
Далее применяем изменения systemd
sudo systemctl daemon-reload sudo systemctl restart docker
Теперь редактируем файл ~/.docker/config.json под своим пользователем (если файла нет — создаем)
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:3001",
"httpsProxy": "http://127.0.0.1:3001",
"noProxy": "*.test.example.com,.example2.com"
}
}
}
В качестве альтернативы можно передать параметры прокси контейнеру, через Docker run,
--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
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 с указанием прокси:
docker build --build-arg http_proxy=http://127.0.0.1:3001 --build-arg https_proxy=http://127.0.0.1:3001
Чтобы узнать IP адрес контейнера выполните команды:
находим нужный контейнер
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
Узнаем его ip адрес:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 1fa4ab2cf395
Добавить комментарий