Docker Основные примеры использования.

Дата: 15.09.2019 Автор Admin

В этой статье я хотел собрать основные рецепты и заметки по 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

Контейнер запущен и доступен по адресу

http://localhost:4000

 

Основные команды

Просмотр образов 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

 


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *