0%

使用Docker运行Python程序指南

Docker 简介

  • Docker 在 2013 年 3 月 20 日发布第一个版本,使用 Go 语言开发, 利用 Linux 内核的资源隔离机制(groups, namespaces )提供一个比虚拟机更轻量级的的容器隔离解决方案。
  • 解决 PaaS 服务 部署发布需要繁琐的配置问题,做到 一次打包,处处运行。
  • 概念:
    • 镜像:把相关可执行程序,依赖库,配置文件都“打包”在一起的特殊文件系统
    • 容器:在一个资源可控的隔离环境中运行的镜像实例
    • image.png

Python 镜像的选择

  • Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 9,161,494 的镜像。大部分服务都可以通过在 Docker Hub 中直接下载镜像来实现。

  • Dokcer 官方 Python 提供了很多 tags:

    名称 大小
    3.10.5-alpine3.16 47.63MB
    3.10.5-bullseye 919.73MB
    3.10.5-slim-bullseye 124.97MB
  • alpine: 基于 musl libc 和 busybox 适用于容器的 Linux 版本, CPython 运行慢且可能有包兼容问题

  • bullseye : debian(11) 完整镜像,包含 gcc 等编译工具 和 常用的 lib 库

  • slim-bullseye: 精简版 debian: 只包含运行 Python 所需要的最小依赖

构建 Docker 镜像

  • 构建镜像 :docker build -f Dockerfile -t hello_python:v1 .
  • 运行容器: docker run -d --name hello -p 80:8000 hello_python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
FROM python:3.10.5-slim-buster

# 时区设置
ENV TZ="Asia/Shanghai"

## 国内加速 , 安装gcc make 环境 ( 需要依赖需要编译运行的库)
#RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
# && sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
# && apt-get update &&apt-get install -y --no-install-recommends build-essential \
# && rm -rf /var/lib/apt/lists/*


# 创建普通用户, 提高安全性
RUN useradd --create-home appuser
USER appuser
ENV PATH /home/appuser/.local/bin:$PATH

# 安装依赖 (利用好docker 多层构建缓存)
COPY requirements.txt .
RUN pip --no-cache-dir install --quiet -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 设置工作目录, 添加代码
WORKDIR /home/appuser/rest
COPY . /home/appuser/rest

# 启动
CMD uvicorn app.main:app --host 0.0.0.0 --port 8000

Docker 常用命令

1
2
3
4
5
6
7
8
docker pull <image-name>      					# 拉取镜像
docker images # 查看所有镜像
docker run -d -p 5000:8000 <image-name> # 后台运行 容器里8000端口映射为主机5000
docker run -v /tmp/a:/data/ redis # 主机目录/tmp/a 映射到redis容器里/data 目录
docker exec -it <containe-id> /bin/bash # 进入某容器sh
docker stop/start restart <containe-id> # 停止/启动/重启 容器
docker ps -a # 列出所有容器
docker logs # 查看日志

Docker Compose

  • 通过编写 docker-compose.yml 进行一组容器服务的编排
1
2
3
4
docker-compose up -d   				# 后台运行 一组容器
docker-compose up -d --build # 重新构建并启动
docker-compose down # 停止这组容器
docker-compose logs -f # 查看日志
  • 概念
    • 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: "1.0"

services:
web:
build:
context: .
ports:
- 80:8000
container_name: api # 容器命名
stdin_open: true # 打开标准输入,可以接受外部输入
tty: true
restart: always # 指定容器退出后的重启策略为始终重启

cache:
image: redis:7.0.2-alpine
container_name: redis # web里的应用可以通过 主机名cache 访问此容器
restart: always
ports:
- 6379:6379

其他

欢迎关注我的其它发布渠道