С Docker кодируйте под win10 и тестируйте под Linux одним щелчком мыши

Docker

Когда я раньше был стажером в компании, для ежедневной разработки и работы необходимо было использовать операционную систему Windows в соответствии с правилами, но реальная тестовая и онлайн-среда проекта основана на Linux, поэтому каждый раз я могу писать только код определенную функцию локально и передать код. «Спрингборд» передает код проекта на сервер для тестирования. Если есть проблема, модифицировать можно только на сервере.После прохождения операции модифицированный код переносится на локал и далее переходит к следующему этапу работы. Так как я не люблю использовать vim для редактирования кода прямо на сервере, и терпеть не могу сложную операцию по прохождению кода туда-сюда через "трамплин" каждый раз, исходя из истины, что жизнь заключается в подбрасывании , я начал на этот раз бросок тур.

Чтобы с удовольствием программировать, общаться и играть в Windows, а также быстро развертывать и тестировать код в Linux одним щелчком мыши, в этой статье используется Docker для Windows для настройки тестовой среды Linux в Windows, которая соответствует среде на сервере. код с удаленного сервера на удаленный сервер, и вы можете протестировать наш код локально в той же рабочей среде одним щелчком мыши с небольшим количеством ресурсов.

Демонстрация эффекта

  1. Запустите проект одним щелчком мыши:

  1. Смоделируйте повторное развертывание и тестирование в один клик после изменения проекта:


1. Установка и настройка Docker для Windows

ссылка для скачивания:Download Docker Desktop

Предварительные требования для установки: 64-разрядная версия Windows 10 Pro и Microsoft Hyper-V.

1.1 Шаги установки:

  1. Включить функцию Hyper-V:

    • Панель управления -> Программы и компоненты -> Включение или отключение компонентов Windows -> Проверить «Hype-V» -> Перезагрузить
  2. установить Докер;

  3. Укажите адрес склада отечественного зеркала:

    • После запуска Docker щелкните правой кнопкой мыши значок запуска Docker и выберите «настройка», чтобы войти в интерфейс настроек;

    • Выберите опцию «Демон» в левой части панели настроек и заполните адрес внутреннего зеркала хранилища в «Реестровые зеркала» (рекомендуется облако Alibaba, скорость теста выше на моей стороне, но вам может понадобиться зарегистрировать аккаунт);

    • Нажмите «Применить»;

  4. Настройте общий каталог:

    • Перейдите на панель настроек Docker и выберите опцию «Общие диски»;

    • Проверьте букву диска, которым вы хотите поделиться, нажмите «Применить», вам может потребоваться ввести пароль учетной записи Windows;

1.2 Возможные проблемы:

Во время установки и настройки Docker наиболее вероятным местом возникновения проблем может быть «настройка общего каталога», может быть проблема в том, что проверяется буква диска и опция отменяется после нажатия «Применить». Из-за того, что не удалось смонтировать букву диска Windows, она застрянет при добавлении параметра «-v» для запуска контейнера Docker. Глядя на файл журнала Docker (C:\ProgramData\DockerDesktop\service.txt), вы найдете следующие ошибки:

[Error] Unable to mount C drive: C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"/usr/bin/nsenter1\": stat /usr/bin/nsenter1: no such file or directory": unknown.

Решения этой проблемы в Интернете в основном делятся на следующие категории:

​ Я пробовал 1-й и 3-й способы, первый способ не сработал для моего Docker, а потом я использовал 3-й способ, чтобы переустановить его, что странно.


2. Официальный старт

2.1 Создайте рабочий каталог

Во-первых, вам нужно установить общий каталог тестовой среды Linux для Windows и докера как:D:\pc_share\, а дерево каталогов в этом каталоге выглядит следующим образом:

.
|-- apps					# 放置我们的项目
|   |-- test_demo1				# 示例项目1
|   |   |-- app.log				
|   |   `-- app.py				
|   `-- test_demo2				# 示例项目2
|       |-- app.log
|       `-- app.py				
`-- etc						# 放置我们的配置文件
    |-- DockerFile			        # 镜像的配置文件,用于构建docker镜像
    |-- requirements.txt		        # 用于记录、安装python项目的依赖库
    `-- supervisor				# 放置示例项目的运行配置文件	
        |-- test_demo1.conf	        # 记录了示例项目1的启动信息,通过软件supervisor启动、监控
        `-- test_demo2.conf		# 记录了示例项目2的启动信息,通过软件supervisor启动、监控

Выше приведена схема дерева каталогов всех файлов нашего эксперимента. Связанные проекты размещены в папке "D:\pc_share\apps". Для удобства демонстрации здесь созданы два веб-проекта на основе торнадо.test_demo1,test_demo1, в каждый проект включается только один файл запускаapp.py:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, from test_demo_1")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),				# 路由
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)					# 监听8888端口,示例项目2的监听改为另一个端口,否则有一个将由于端口占用无法成功启动
    tornado.ioloop.IOLoop.current().start()		# 开启Web服务

Как показано выше, это очень простая веб-программа, которая прослушивает порт «8888», и если вы посетите «http:\\localhost:8888», вы можете получить ответ:"Hello, from test_demo_1".

2.2 Используйте Docker для создания среды выполнения программы

Как видно из Раздела 2.1, для запуска вышеуказанного проекта требуется как минимум три среды:操作系统,python,tornado框架. Чтобы соответствовать среде, в которой запускается проект, здесь предполагается три условия среды:Centos7,python2.7,tornado5.1.1. Поэтому нам нужно использовать Dockerfile для настройки соответствующей операционной среды.Студенты, не знакомые с Dockerfile, могут просмотреть следующие учебные пособия:Учебник по Dockerfile.

Чтобы упростить изменение рабочей среды, файл Dockerfile в основном разделен на две части:配置下层运行环境,配置上层运行环境.

2.2.1 Настройка базовой операционной среды

На рисунке выше указана принципиальная схема процесса конфигурации основной рабочей среды, а соответствующая часть докера есть:

FROM centos:7 as centos_python2				# 基于镜像:"centos:7"
MAINTAINER mileskong <xiangqian_kong@126.com>		# 作者信息

# 环境变量,反斜杠表示换行
ENV PYPI_REPO=https://mirrors.aliyun.com/pypi/simple/ \
	PYTHONIOENCODING=UTF-8 \
	SHARE_PATH=/mnt/share				# docker容器的挂载点,对应Windows中的"D:\pc_share\"路径(启动容器时可以设置共享路径与容器中的挂载点)

# 为Centos7安装必要的软件,这里只安装了三个常用的软件,可以按需修改
RUN set -ex \
	&& yum -y install epel-release wget net-tools \
	&& yum clean all				# 清空缓存,精简镜像

# 安装pip软件(这里省略了python2.7的安装,因为Centos7中自带了python2.7.5,如需安装其他版本的同学在此之前加入python的安装过程)
ENV PIP_VERSION 19.1.1
RUN set -ex; \
	\
	wget -O get-pip.py 'https://bootstrap.pypa.io/get-pip.py'; \
	\
	python get-pip.py \
		--disable-pip-version-check \
		--no-cache-dir \
		"pip==$PIP_VERSION" \
	; \
	pip --version; \
	\
	find /usr/local -depth \
		\( \
			\( -type d -a \( -name test -o -name tests \) \) \
			-o \
			\( -type f -a \( -name '*.pyc' -o -name '*.pyo' \) \) \
		\) -exec rm -rf '{}' +; \
	rm -f get-pip.py

С помощью содержимого вышеуказанного Dockerfile мы завершили настройку образа, который в основном включает в себя:Centos7,python2.7,pip.

Сохраните вышеуказанное как:D:\pc_share\etc\DockerFileа затем программное обеспечение командной строки в WindowscmdВведите в Dockerfile следующую команду, чтобы собрать образ centos_python2:1.0 (centos_python2 — имя образа, 1.0 — тег, то есть номер версии):

cd D:\pc_share\etc			# 进入配置文件的目录

# docker的镜像构建命令,
#   -t [镜像名:tag]:设置镜像名与tag;
#	-f [文件名]:指定Dockerfile;
#	--target=[阶段名]:用于多阶段构建;
docker build -t centos_python2:1.0 -f DockerFile --target=centos_python2 .

С помощью приведенной выше команды вы можете создать пакет, содержащийCentos7,python2.7,pipЗеркало:centos_python2:1.0. существуетcmdвведитеdocker imagesКоманда может получить следующую информацию:

Как показано на рисунке выше, красная рамка — это соответствующее изображение, и его размер составляет всего 237 МБ.alpineзаменятьCentos7Даже зеркалирование можно контролировать в пределах 30 Мб.

2.2.2 Настройка верхней операционной среды

Операционная среда нижнего уровня предоставляет относительно распространенную платформу разработки Python на основе Centos, которая является общей основой для запуска всех проектов Python и в основном не требует модификации в последующих процессах разработки и тестирования. Однако разные проекты Python могут сталкиваться с разными проблемами, которые в основном можно разделить на следующие:

  • Зависит от различных сторонних библиотек;
  • Разные проекты имеют разные параметры запуска и методы запуска;
  • Конфигурационный файл одного и того же проекта может часто изменяться;

Поскольку образ докера доступен только для чтения, а процесс создания занимает много времени, мы часто будем изменять файлы проекта, файлы конфигурации, зависимые библиотеки и другую информацию в процессе разработки. Мы не можем перестраивать новый образ каждый раз, когда мы его модифицируем. Чтобы решить эту проблему, мы поместим часто меняющийся процесс в другое зеркало, а именно上层运行环境.

Чтобы решить первую проблему выше, мы часто используем его при разработке проектов на Python.requestments.txtФайл записывает и управляет сторонней библиотекой Python, от которой зависит проект, и устанавливает ее с помощью следующей команды.requestments.txtСторонние библиотеки задокументированы в:

pip install -r /&{path}/requirements.txt

Файлы конфигурации сторонних библиотек для примера проекта в этой статье находятся в:D:\pc_share\etc\requestments.txt:

tornado==5.1.1				# 依赖的Web框架,版本号为5.1.1
supervisor==4.0.2			# 使用supervisor监管python项目的运行

Изменяйте напрямую, когда сторонняя библиотека, от которой зависит проект, изменяетсяrequestments.txtдокумента и на основании下层运行环境восстановить上层运行环境Достаточно зеркального отображения, что сокращает количество ненужных операций.

Для решения второй и третьей задач здесь используетсяsupervisorУправляйте проектами Python, подробные руководства см.Блог "Freshwater Blog": Учебное пособие для руководителей. в соответствии сsupervisorНапишите файл конфигурации запуска для проекта Python в формате и поместите его вsupervisorВ отслеживаемой папкеsupervisorВы можете легко запустить и контролировать проект в соответствии с нашим конфигурационным файлом. Например, файл конфигурации запуска примера проекта 1 находится в:D:\pc_share\etc\supervisor\test_demo1.conf:

[program:test_demo1]							# 项目名称,唯一
directory=/mnt/share/apps/test_demo1					# 项目所在路径,因为是在docker的Linux中执行,所以需要填项目在Linux中的路径,这里假设将Windows中的共享路径挂载到"/mnt/share/"下
command=python app.py							# 项目的启动命令
stdout_logfile=/mnt/share/apps/test_demo1/app.log		        # 项目的日志文件
priority=1								# 优先级
numprocs=1								# 进程数
autostart=true								# 自动启动
autorestart=true							# 自动重启
startretries=5								# 启动尝试次数

Выше приведен файл конфигурации запуска примера проекта 1, изменитеsupervisorПуть мониторинга/mnt/share/etc/supervisor/, потому что докер может преобразовать общий каталог WindowsD:\pc_share\подняться на/mnt/share/вниз, поэтому, когдаsupervisorпри запуске/mnt/share/etc/supervisor/(т.е. в WindowsD:\pc_share\etc\supervisor), чтобы найти файл конфигурации проекта и запустить соответствующий проект в соответствии с файлом конфигурации проекта.

FROM centos_python2:1.0 as centos_python2_supervisor		# 上层运行环境的镜像基于下层运行环境的镜像:"centos_python2:1.0"

ENV SUPERVISOR_PATH=$SHARE_PATH/etc/supervisor		        # 放置项目的启动配置文件的路径,下面会配置supervisor的设置文件将其读取配置文件的目录改为"$SUPERVISOR_PATH"所指向的目录

# 通过pip按照requirements.txt记录的依赖库列表安装python的第三方库
COPY requirements.txt /tmp/					# 将 D:\pc_share\etc\ 目录下的requirements.txt复制到镜像的/tmp/中
RUN set -ex \
	&& pip install -r /tmp/requirements.txt -i $PYPI_REPO \
	&& rm -rf ~/.cache/pip/*

# 配置supervisor的设置文件"/etc/supervisord.conf"
RUN	set -ex \
	&& echo_supervisord_conf > /etc/supervisord.conf \
	&& mkdir /etc/supervisord.d/ \
	&& echo "[include]" >> /etc/supervisord.conf \
	&& echo "files = $SUPERVISOR_PATH/*.conf" >> /etc/supervisord.conf \	# 监控"$SUPERVISOR_PATH"目录中的项目启动配置文件
	&& sed -i '/nodaemon/s/false/true/' /etc/supervisord.conf		# 【十分重要】将supervisord.conf中的nodaemon变量改由false改为true,也即将supervisor改为前台运行,后面作详细解释

EXPOSE 8888 8889											# 声明暴露的端口

CMD ["supervisord", "-c", "/etc/supervisord.conf"]		# 容器(不是镜像)启动时执行的命令

показано выше как上层运行环境Конфигурационный файл зеркала. Во-первых, образ основан на только что построенном下层运行环境Зеркало:centos_python2:1.0, исходя из этого, используйте инструмент pip согласноrequirements.txtЗадокументированные в сторонних библиотеках Python зависимости, необходимые проекту для установки среды выполнения. Затем сгенерируйте, настройтеsupervisorфайл настроек/etc/supervisord.conf,будетsupervisorКаталог для чтения файла конфигурации запуска проекта изменен на$SUPERVISOR_PATH/$SUPERVISOR_PATHПеременная среды, установленная для предыдущего раздела, записывает точку монтирования файла конфигурации запуска проекта в Windows в образе докера. затем через$SUPERVISOR_PATHПрочитанный файл конфигурации на самом деле находится в WindowsD:\pc_share\etc\supervisor\файл конфигурации под.

Наконец,CMDСледующее содержимое представляет оператор, который будет выполняться при запуске контейнера, который обычно можно использовать для запуска проекта. Поскольку мы использовалиsupervisorдля мониторинга проекта, чтобы файл открывался напрямуюsupervisorуслуга.

supervisorВ процессе установки есть командная строка дляsed -i '/nodaemon/s/false/true/' /etc/supervisord.conf, это яма, на которую я наступил, не понимая механизма работы докера. После запуска образа Docker с помощью команды run он сгенерирует контейнер.Вы можете просто рассматривать контейнер как процесс, и процесс завершится и остановится после выполнения его инструкций. Итак, когда наша команда запускаетсяsupervisorиногдаsupervisorПо умолчанию он работает в фоновом режиме, поэтому, когда наш контейнер запустится, выполните команду для запускаsupervisor:supervisord -c /etc/supervisord.conf,ЭтоsupervisorПосле входа в фоновую операцию выполнение команды завершается, а докер-контейнер тоже считает, что выполнил свою задачу, плавно завершается и перестает работать. В результате каждый раз при запуске docker-контейнера он тут же перестает работать, а заставить контейнер продолжать работать в соответствии с нашими представлениями невозможно. Для решения этой проблемы мы можемsupervisorИзменить для запуска на переднем плане, то есть изменить файл настроек/etc/supervisord.conf«нодемон» — это «истина». Затем снова запустите контейнер,supervisorОн всегда будет занимать передний план, так что контейнер не может «завершать» свои собственные инструкции, а наш контейнер может поддерживать непрерывное рабочее состояние.

2.3 Соберите образ и запустите

В разделе 2.2 мы завершили подготовку файла конфигурации образа Docker.Dockerfile.В этом файле Docker, чтобы облегчить модификацию и ускорить процесс построения образа, мы разделили его на две части, соответствующие образу операционной среды более низкого уровня. и образ верхнего уровня соответственно Образ среды выполнения. Чтобы различать, в соответствии с соглашением об именах образов докеров, мы называем первое: centos_python2:1.0, а второе: centos_python2_supervisor:1.0.

Таким образом, содержимое всего файла Dockerfile (D:\pc_share\etc\DockerFile):

FROM centos:7 as centos_python2
MAINTAINER mileskong <xiangqian_kong@126.com>

ENV PYPI_REPO=https://mirrors.aliyun.com/pypi/simple/ \
	PYTHONIOENCODING=UTF-8 \
	SHARE_PATH=/mnt/share

# install software
RUN set -ex \
	&& yum -y install epel-release wget net-tools \
	&& yum clean all

# install pip
ENV PIP_VERSION 19.1.1
RUN set -ex; \
	\
	wget -O get-pip.py 'https://bootstrap.pypa.io/get-pip.py'; \
	\
	python get-pip.py \
		--disable-pip-version-check \
		--no-cache-dir \
		"pip==$PIP_VERSION" \
	; \
	pip --version; \
	\
	find /usr/local -depth \
		\( \
			\( -type d -a \( -name test -o -name tests \) \) \
			-o \
			\( -type f -a \( -name '*.pyc' -o -name '*.pyo' \) \) \
		\) -exec rm -rf '{}' +; \
	rm -f get-pip.py


FROM centos_python2:1.0 as centos_python2_supervisor

ENV SUPERVISOR_PATH=$SHARE_PATH/etc/supervisor

# install python libs by pip
COPY requirements.txt /tmp/
RUN set -ex \
	&& pip install -r /tmp/requirements.txt -i $PYPI_REPO \
	&& rm -rf ~/.cache/pip/*

# build supervisord.conf 
RUN	set -ex \
	&& echo_supervisord_conf > /etc/supervisord.conf \
	&& mkdir /etc/supervisord.d/ \
	&& echo "[include]" >> /etc/supervisord.conf \
	&& echo "files = $SUPERVISOR_PATH/*.conf" >> /etc/supervisord.conf \
	&& sed -i '/nodaemon/s/false/true/' /etc/supervisord.conf

EXPOSE 8888 8889

CMD ["supervisord", "-c", "/etc/supervisord.conf"]

Вот шаги для сборки и запуска образа на основе Dockerfile:

cd D:\pc_share\etc			# 进入配置文件的目录
docker build -t centos_python2:1.0 -f DockerFile --target=centos_python2 .			        # 构建下层运行环境镜像:"centos_python2:1.0"
docker build -t centos_python2_supervisor:1.0 -f DockerFile --target=centos_python2_supervisor .	# 基于"centos_python2:1.0",构建上层运行环境镜像:"centos_python2_supervisor:1.0"
docker run -itd -v d:/pc_share/:/mnt/share -p 8888:8888 -p 8889:8889 ${image_id}			# 运行镜像"centos_python2:1.0"

Приведенная выше команда сначала создает образ нижней операционной среды.centos_python2:1.0, а затем на этой основе строить образ верхней операционной средыcentos_python2_supervisor:1.0, и, наконец, запустите образ с помощью команды запуска docker. Более важными являются некоторые параметры в команде запуска, которые подробно описаны ниже:

docker run [options] [image_id]
# options:
	-v [宿主机的共享目录]:[docker容器中的挂载点]:将宿主机中的共享目录挂载到docker容器的某个挂载点下,如果挂载点不存在则启动容器时自动创建;
	-p [宿主机端口]:[docker容器端口]:将宿主机的端口映射到docker容器的端口上;

По параметрам запуска видно, что когда мы запускаем образ, каталог под системой Windows такой:d:/pc_share/монтируется в докер-контейнер/mnt/shareЗатем сопоставьте порт 8888 хоста с портом 8888 док-контейнера и сопоставьте 8889 с портом 8889 док-контейнера.

Запустите зеркало, выполнив описанные выше действия.centos_python2_supervisor:1.0После этого по командеdocker ps -aВы можете просмотреть контейнеры, открытые этим изображением:

Когда мы вводим «localhost: 8888» и «localhost: 8889» в локальном браузере, мы можем получить доступ к примеру проекта, работающего в докере.

3. Пуск одним ключом

В главе 2 подробно описано, как использовать docker для настройки рабочей среды проекта.Весь процесс можно разделить на следующие части:

  1. Написать Dockerfile, настроить рабочую среду и стартовую конфигурацию проекта;
  2. Собрать образ докера через Dockerfile;
  3. Запустите докер с помощью команды запуска, чтобы сгенерировать контейнер.

В процессе разработки первые два шага — это процесс настройки среды, а третий шаг часто повторяется.Всякий раз, когда мы изменяем код проекта или файл конфигурации в Windows, нам нужно перезапустить контейнер докеров, чтобы проверить код. параметры команды запуска тоже сложные, поэтому частые перезапуски контейнера тоже могут раздражать.

Потому что я обычно предпочитаю использоватьvscodeКак инструмент IDE для разработки, иногда встречающийся вvscodeОн также поддерживает подключаемые модули Docker, что очень удобно.vscodeПлагин Docker реализует «запуск в один клик».

3.1 Как использовать плагин докера

  1. существуетvscodeНайдите «docker» в магазине плагинов расширений и установите плагин.После перезагрузки вы найдетеvscodeНа боковой панели есть дополнительная иконка докера:

Как показано на рисунке выше, этот плагин может напрямую отображать информацию об изображении, контейнере и складе, которая существует на машине. Из рисунка вы можете увидеть все изображения, которые мы создали ранее.

  1. Выберите наше зеркалоcentos_python2_supervisor:1.0, щелкните правой кнопкой мыши и выберите из списка параметровRun, вы найдете новый работающий контейнер, добавленный в наш список контейнеров:

  1. Если нам нужно повторно протестировать после изменения кода, выберите контейнер и щелкните правой кнопкой мыши, чтобы выбратьRestart Container, мы можем перезапустить наш контейнер и перезапустить наш проект:

Поэтому, когда мы пишем Dockerfile и собираем образ, базовая операционная среда успешно создается. После этого каждый раз, когда вам нужно протестировать измененный код, вам нужно будет только выбрать соответствующий контейнер в интерфейсе плагина докера и выбрать перезапуск. Если тесту требуется более подробная информация о выполнении проекта, щелкните правой кнопкой мыши и выберитеAttach ShellВы можете войти в контейнер для просмотра соответствующих журналов через знакомый терминал:

Спасибо за просмотр!