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

Thank you for reading this post, don't forget to subscribe!

Частень­ко быва­ет ситу­а­ция, что сер­вер для раз­лич­ных задач задей­ству­ет воз­мож­но­сти 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. При­мер выво­да дан­ной коман­ды пред­став­лен ниже.

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

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

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

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

$ docker build -t python-docker-app .

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

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