Некоторое время я был программистом на Python, но только недавно познакомился с Docker.

Для тех из вас, кто не знает, Docker - это ведущая платформа программного контейнера. Запустив LXC (контейнеры Linux) в своем ядре, он позволяет воссоздать одну и ту же среду для приложения независимо от того, где вы его запускаете. Docker имеет множество различных применений и позволяет отличное командное сотрудничество. Вы можете прочитать больше о Docker и контейнерах на их странице:



По сути, если образ Docker работает на вашем компьютере, он должен работать во всех из них, потому что образ не зависит от любых зависимостей, которые вы могли установить в своей системе. Вот почему он пригодится при создании приложения Flask; вы можете убедиться, что установлены точные версии необходимых вам зависимостей, а когда придет время запускать образ, просто сообщите ему, какой порт вы хотите использовать.

Итак, приступим. В этом руководстве я буду использовать 64-разрядную версию Ubuntu 17.04 внутри виртуальной машины VirtualBox, но вы можете подать в суд на все, что захотите. Команды должны быть аналогичными в Mac или других системах на базе Unix.

$ sudo apt-get install docker.io

Эта команда установит Docker в Ubuntu, но проверьте их страницу с инструкциями для всех других ОС, это должно быть просто и безболезненно.

Чтобы убедиться, что вы установили его правильно, выполните команду docker version:

$ docker version
Client:
 Version:      1.12.6
 API version:  1.24
 Go version:   go1.7.4
 Git commit:   78d1802
 Built:        Tue Mar 14 09:47:15 2017
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Если вы, как и я, используете Ubuntu, вы можете увидеть эту последнюю строку. Не беспокойтесь, это просто потому, что у нашего пользователя нет разрешения на доступ к папке /var/run/docker.sock, что мы можем исправить, выполнив ту же команду, что и sudo

Теперь, если вам не нужно sudo каждый раз, мы можем добавить разрешения нашему пользователю, добавив пользователя в группу докеров, чтобы не нужно было делать это снова:

sudo usermod -aG docker $USER

Если вы перезапустите систему (или на этот раз запустите демон вручную, если вы не хотите перезагружать) и снова запустите docker version, у вас не должно возникнуть проблем.

Идеально! Теперь давайте создадим образец приложения Flask, чтобы попробовать это. Не волнуйтесь, для более крупных проектов это будет практически тот же процесс.

Это довольно просто для проектов Flask, но если вы не понимаете, что происходит, возможно, вам стоит сначала изучить Flask! Ознакомьтесь с этим руководством, в котором рассматриваются все основы, а также показано, как настроить виртуальную среду.



Нам нужно будет установить Flask. Мы сделаем это с помощью pip, который в Ubuntu устанавливается под управлением apt-get install python-pip, но вы можете узнать, как легко установить на других платформах здесь.

Теперь, когда у нас есть pip, установите Flask, запустив pip install Flask, и мы готовы к работе.

Я создал папку с именем flask-docker-tutorial и поместил туда свой файл python. Мы можем проверить это, запустив python flask-docker.py

$ python flask-docker.py 
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 135-043-124

Мы переходим по URL-адресу в нашем браузере, и он работает!

Чтобы упростить нам жизнь в процессе сборки Docker, давайте также создадим requirements.txt файл в папке нашего проекта.

Если у вас есть несколько зависимостей, вы можете запустить pip freeze > requirements.txt внутри каталога проекта, но будьте осторожны, потому что файл требований также будет содержать множество зависимостей, которые недоступны напрямую через pip, но которые другие библиотеки разрешают за вас.

Отлично, теперь давайте перейдем к «докеризации» нашего приложения.

Чтобы автоматизировать создание образов Docker, Docker использует файл с именем Dockerfile. В этом файле указывается все, от файлов, которые вам нужно использовать, до команд, которые вам нужно запустить. Для этого мы пишем инструкции, которые будут выполняться в порядке сверху вниз. Вот несколько инструкций, которые можно использовать, и я быстро их опишу:

ДОБАВИТЬ: принимает в качестве входных данных файл и место назначения. По сути, он захватывает файлы с хост-машины (вашего компьютера) и помещает их в образ Docker. Вы также можете использовать URL-адреса в качестве аргументов, чтобы вместо этого загружались данные из Интернета в образ Docker, а также для распаковки файлов из известных форматов сжатия (хотя мне сказали не слишком доверять этому). COPY делает почти то же самое без URL или функций декомпрессии.

# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder

CMD: используется для запуска определенной команды, но эта команда выполняется в момент запуска контейнера, а не при построении образа. Например, мы могли бы использовать CMD для запуска нашего файла python при запуске изображения. Если вы хотите запустить команду в момент создания образа, мы будем использовать RUN, о чем я расскажу позже.

# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"

ENTRYPOINT: сообщает нашему изображению, какое приложение по умолчанию мы будем использовать для наших команд. Итак, если бы мы сказали нашему изображению, что наша точка входа - это «python», тогда, когда мы запустим CMD, мы бы просто дали ему аргументы, так как он знал бы, что python - это приложение, используемое для выполнения этих команд.

# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
#           or during the creation of a container. 
ENTRYPOINT echo

# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo

ENV: устанавливает переменные среды, задавая им пару ключ = значение. Действительно облегчает вашу жизнь.

# Usage: ENV key value
ENV SERVER_WORKS 4

EXPOSE: он используется для связывания определенного порта для связи с другими контейнерами. Я бы избегал использования EXPOSE, поскольку обычно перенаправление портов выполняется каждым хостом в момент запуска. Однако это может быть полезно при некоторой межконтейнерной связи. Этот ответ на StackOverflow довольно хорош, взгляните, если вам интересно узнать о нем больше.

# Usage: EXPOSE [port]
EXPOSE 8080

FROM: Это должна быть первая команда, объявленная в Dockerfile. Он указывает на то, на каком изображении вы основываете свое изображение. Это может быть любое изображение, даже созданное вами ранее. Если его нет в машине, Docker получит его из DockerHub.

# Usage: FROM [image name]
FROM ubuntu

ТЕХНИЧЕСКИЙ ОБСЛУЖИВАНИЕ. Используется для того, чтобы выразить признательность самому себе. Может быть размещен где угодно и не выполняется.

# Usage: MAINTAINER [name]
MAINTAINER authors_name

ВЫПОЛНЕНИЕ: я упоминал об этом немного ранее, так вы запускаете команды в момент создания образа Docker. Вы могли бы использовать это, чтобы установить все зависимости, которые будут иметь ваша система, и подготовить ее, чтобы просто запустить ваше приложение.

# Usage: RUN [command]
RUN aptitude install -y riak

ПОЛЬЗОВАТЕЛЬ: используется для указания uid или имени пользователя, на основе которого вы хотите запустить контейнер. Это можно использовать для управления разрешениями внутри контейнера. В своем исследовании я наткнулся на эту историю, которая помогает немного больше понять о uid и gid, посмотрите ее:



# Usage: USER [UID]
USER 751

ОБЪЕМ: позволяет контейнеру иметь доступ к папке на главном компьютере.

# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]

WORKDIR: указывает, в какой папке должны выполняться команды CMD.

# Usage: WORKDIR /path
WORKDIR ~/

Большую часть этой информации о Dockerfile и многое другое можно найти в этом руководстве по DigitalOcean, оно очень хорошее и касается настройки образа Docker с помощью MongoDB ..



Давайте сделаем наш Dockerfile!

Итак, мы наконец-то создадим наш собственный Dockerfile. Давайте воспользуемся тем, что мы узнали о Dockerfile, и применим его к работе.

Первые строки должны быть ОТ и ТЕХНИЧЕСКОЕ ОБСЛУЖИВАНИЕ. Мы создадим наш образ на основе Ubuntu и разместим нашу информацию под руководством сопровождающего.

FROM ubuntu:latest
MAINTAINER Angello Maggio "[email protected]"

Затем мы установим все необходимое, чтобы получить нашу систему.

RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential

Это должно подготовить нас к работе с python и pip.

ADD . /flask-app
WORKDIR /flask-app
RUN pip install -r requirements.txt

С помощью этих трех строк мы копируем весь наш проект в папку /flask-app внутри образа Docker, и как только там мы говорим pip установить наши требования.

ENTRYPOINT ["python"]
CMD ["flask-docker.py"]

Наконец, мы говорим изображению использовать Python в качестве нашего приложения и при каждом запуске запускаем наш сервер Flask.

Большой! Давай проверим. Выполните следующую команду в папке нашего проекта:

docker build -t my-flask-image:latest .

Параметр -t запрашивает имя аргумента: тег, а «.» В конце - это путь к нашей папке. После запуска вывод в командной строке должен проходить пошагово через Dockerfile, и, надеюсь, никаких ошибок не появится! Общие ошибки для меня были связаны с тем, что я создавал свой requirements.txt файл с помощью pip freeze, так что следите за этим.

Вот и все! Попробуйте запустить $ docker images и посмотрите, есть ли там ваше изображение.

images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
my-flask-image      latest              65024886bcee        About a minute ago   430 MB
ubuntu              latest              d355ed3537e9        2 weeks ago          119.2 MB

Он там, давайте запустим:

$ docker run -d -p 5000:5000 my-flask-image

-p 5000:5000 сообщает докеру, что нужно отразить порт 5000 контейнера на порт 5000 хост-машины, и готово!

запустите docker ps, чтобы убедиться, что он работает, и проверьте свой http://localhost:5000

Вы создали свой первый образ Docker. Это должно работать на любом компьютере, независимо от того, установлены ли на нем Python и Flask. Поиграйте с ним, создавайте более сложные проекты и создайте собственный Dockerfile, чтобы продолжать учиться.

Это руководство было основано на более конкретном руководстве с этого сайта:



но я надеюсь, что подробности и пошаговые инструкции помогли вам на этом пути.