Docker构建基于Python的新镜像

在云主机上跑 Python 项目,但安装 Python 及配置环境个人感觉麻烦。如果使用 Docker 将项目与 Python 镜像构建成一个新的镜像,那么可以使用这个新镜像运行一个容器,容器运行时项目也被运行

环境

Centos 7.2

拉取Python镜像

1
docker pull python:3.8

构建镜像所需文件

首先创建一个名为 ceshi 的文件夹并进入

1
2
mkdir ceshi
cd ceshi

ceshi 文件夹需创建四个文件:Dockerfilemain.pyinstall.shPipfile

Dockerfile

用来构建新Python镜像,因为还没有安装 requests

1
2
3
4
5
FROM python:3.8
COPY . /code
WORKDIR /code
RUN sh install.sh
CMD ["pipenv","run","python3","main.py"]

FROM :使用的docker基础镜像
COPY :将 ceshi 目录下的所有文件复制到容器 /code 目录下
WORKDIR :指定 /code 为工作目录
RUN :构建镜像时执行的命令,这里用来执行 install.sh 文件的命令
CMD :容器启动时执行的命令

main.py

容器启动时要执行的Python代码

1
2
3
4
5
6
7
import requests

# 发起请求
response = requests.get('https://www.baidu.com/')

# 打印状态码
print(response.status_code)

install.sh

因为我习惯使用 pipenv 来管理虚拟环境、包及依赖,自然有 PipfilePipfile.lock 这两个文件,那么 install.sh 内容为:

1
2
3
4
# 更新pip至最新版、安装pipenv、创建虚拟环境并安装依赖包
python3 -m pip install --upgrade pip \
&& pip3 install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple \
&& pipenv install

如果没有使用过 Pipenv ,可以手动创建一个 Pipfile 文件(文件内容看后面说明),那么 install.sh 内容为:

1
2
3
4
5
# 更新pip至最新版、安装pipenv、创建虚拟环境、安装依赖库(第三方库)
python3 -m pip install --upgrade pip \
&& pip3 install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple \
&& pipenv --python 3.8 \
&& pipenv update

pipenv update 相当于执行 pipenv lockpipenv sync 两个命令

Pipfile

Python包管理

1
2
3
4
5
6
7
8
9
10
11
12
[[source]]
name = "清华镜像"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
verify_ssl = true

[dev-packages]

[packages]
requests = "*"

[requires]
python_version = "3.8"

url :清华源,用于加速下载第三方库,这就是为什么要手动创建 Pipfile 文件,因为要修改这里
requests :第三方库
python_version :python版本,需与使用的python镜像版本一致

构建新镜像

确保在 ceshi 目录下,构建命令

1
docker build -t mypy:v1 .

查看构建的镜像

1
docker images

可以看到已经创建了一个名为 mypy 的镜像

运行容器

确保在 ceshi 目录下,构建命令

1
2
3
4
5
6
docker run -d \
--name py-ceshi \
-p 2222:2222 \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v ./main.py:/code/main.py \
mypy:v1

-d :在分离模式下(后台)运行
--name :给运行的容器取一个名字,即 py-ceshi
-p :宿主机端口映射 py-ceshi 容器端口,即2222映射2222,需确保安全组已开放端口
-v :同步宿主机与容器时间
-v :将宿主机上的 main.py 代码挂载到容器
mypy:v1 :使用的镜像

查看容器运行日志

1
2
# docker logs py-ceshi
200

返回 200 表示请求成功,新镜像构建成功