Docker для python приложения

Частень­ко быва­ет ситу­а­ция, что сер­вер для раз­лич­ных задач задей­ству­ет воз­мож­но­сти Python v2. При этом есть суще­ствен­ная необ­хо­ди­мость запус­кать при­ло­же­ния, напи­сан­ные на Python v3. Исполь­зо­ва­ние Docker поз­во­ля­ет эле­гант­но решить эту задачу.

Что делать

В первую оче­редь необ­хо­ди­мо уста­но­вить сам Docker, с помо­щью кото­ро­го мы будем соби­рать образ и запус­кать кон­тей­нер с нашим при­ло­же­ни­ем Python. Для раз­ных дис­три­бу­ти­вов есть соот­ветст­ву­ю­щие руко­вод­ства на сай­те docker.com. Так для Ubuntu мож­но почи­тать по этой ссыл­ке.

Вкрат­це после­до­ва­тель­ность команд в кон­со­ли Ubuntu Linux будет следующая:

$ sudo apt-get update

$ sudo apt-get install     apt-transport-https     ca-certificates     curl     gnupg-agent     software-properties-common

$ 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»

$ sudo apt-get update

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

После про­ве­ден­ных мани­пу­ля­ций мы полу­чим рабо­та­ю­щий Docker в систе­ме. Это мож­но про­ве­рить с помо­щью коман­ды docker version. При­мер выво­да дан­ной коман­ды пред­став­лен ниже.

YAML

$ docker version

Client: Docker Engine — Community Version: 19.03.5 API version: 1.40 Go version: go1.12.12 Git commit: 633a0ea838 Built: Wed Nov 13 07:50:12 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine — Community Engine: Version: 19.03.5 API version: 1.40 (minimum version 1.12) Go version: go1.12.12 Git commit: 633a0ea838 Built: Wed Nov 13 07:48:43 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.10 GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339 runc: Version: 1.0.0-rc8+dev GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657 docker-init: Version: 0.18.0 GitCommit: fec368312345678910111213141516171819202122232425262728

$ docker version

Client: Docker Engine — Community Version:           19.03.5

API version:       1.40 Go version:        go1.12.12

Git commit:        633a0ea838

Built:             Wed Nov 13 07:50:12 2019

OS/Arch:           linux/amd64

Experimental:      false

Server: Docker Engine — Community Engine:

Version:          19.03.5

API version:      1.40 (minimum version 1.12)

Go version:       go1.12.12

Git commit:       633a0ea838

Built:            Wed Nov 13 07:48:43 2019

OS/Arch:          linux/amd64

Experimental:     false containerd:  Version:          1.2.10

GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339

runc:  Version:          1.0.0-rc8+dev

GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657

docker-init:  Version:          0.18.0

GitCommit:        fec3683

Когда мы про­ве­ри­ли, что уста­нов­ка Docker про­шла успеш­на, при­шло вре­мя для созда­ния обра­за кон­тей­не­ра, в кото­ром мы будем запус­кать наше при­ло­же­ние. В каче­стве при­ло­же­ния будем исполь­зо­вать telegram бот

Созда­дим Dockerfile со сле­ду­ю­щим содер­жа­ни­ем, кото­рый поз­во­лит на базе обра­за python из Docker Hub полу­чить нуж­ный нам контейнер.

YAML

FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./RUN

pip install —no-cache-dir -r requirements.txt

COPY bot.ini bot.ini

COPY bot.py bot.py

CMD [ «python», «./bot.py» ]

1234567891011

FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./RUN pip install —no-cache-dir -r requirements.txt

COPY bot.ini bot.ini

COPY bot.py bot.py

CMD [ «python», «./bot.py» ]

В фай­ле requirements.txt содер­жит­ся спи­сок моду­лей Python, кото­рые будут уста­нов­ле­ны с помо­щью мен­дже­ра паке­тов pip в кон­тей­нер. Этот файл, а так­же про­чие фай­лы, кото­рые с помо­щью дирек­ти­вы COPY будут поме­ще­ны в образ созда­ва­е­мо­го кон­тей­не­ра долж­ны нахо­дить­ся в той же дирек­то­рии, что и Dockerfile. Содер­жа­ние requirements.txt для дан­но­го при­ме­ра при­ве­де­но ниже.

YAML

python-telegram-botemoji

12

python-telegram-botemoji

В фай­ле bot.py у нас содер­жит­ся непо­сред­ствен­но код telegram бота, кото­рый будет запус­кать­ся в кон­тей­не­ре. А в фай­ли­ке bot.ini — пер­во­на­чаль­ные кофи­гу­ра­ци­он­ные дан­ные для запус­ка при­ло­же­ния. После того, как все выше­ука­зан­ные фай­лы будут гото­вы, мож­но при­сту­пать к сбор­ке обра­за кон­тей­не­ра. Это дела­ет­ся с помо­щью сле­ду­ю­щей команды.

$ docker build -t python-docker-app .

Мы полу­чи­ли нуж­ный образ, кото­рый можем запус­кать для рабо­ты в про­дак­шене. Это мож­но делать через ути­ли­ту команд­ной стро­ки docker run, а мож­но и с помо­щью скрип­та systemd. В слу­чае со скрип­том systemd мы полу­чим сер­вис, кото­рым мож­но будет пол­но­цен­но управ­лять систем­ны­ми сред­ства­ми. То есть, дан­ное при­ло­же­ние мож­но будет запус­кать авто­ма­ти­че­ски при стар­те сер­ве­ра, а так­же сле­дить за его посто­ян­ной рабо­то­спо­соб­но­стью. При­мер тако­го скрип­та при­ве­ден ниже.

YAML

[Unit]

Description=Python Script in Docker

Requires=docker.serviceAfter=docker.service

[Service]

Restart=always

RestartSec=3

ExecStartPre=/bin/sh -c «/usr/bin/docker rm -f my-running-app 2> /dev/null || /bin/true»

ExecStart=/usr/bin/docker run —rm —name my-running-app python-docker-app

ExecStop=/usr/bin/docker stop my-running-app

[Install]

WantedBy=multi-user.target

1234567891011121314

[Unit]

Description=Python Script in Docker

Requires=docker.serviceAfter=docker.service

[Service]

Restart=always

RestartSec=3

ExecStartPre=/bin/sh -c «/usr/bin/docker rm -f my-running-app 2> /dev/null || /bin/true»

ExecStart=/usr/bin/docker run —rm —name my-running-app python-docker-app

ExecStop=/usr/bin/docker stop my-running-app

[Install]

WantedBy=multi-user.target

Дан­ный скрипт раз­ме­ща­ем в дирек­то­рии /etc/systemd/system. Назо­вем его к при­ме­ру — docker-python.service. После того, как он будет готов, выпол­ня­ем коман­ду

# systemctl daemon-reload.

Теперь наше доке­ри­зи­ро­ван­ное при­ло­же­ние может запус­кать­ся, оста­нав­ли­вать­ся и управ­лять­ся с помо­щью систем­ной ути­ли­ты service.

Друзья помогите этому контенту стать доступнее в социальных сетях.

Не проходи мимо жмакни по кнопке возможно кому то еще он будет полезен!