python项目docker容器化
前言
典型的 Linux 基础镜像来说,大小关系如下:Ubuntu > CentOS > Debian> Alpine
Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制apk。
容器化
Debian
Dockerfile
python 3.9
# Basic Image Environment
# 使用 slim 版本減輕 Image 容量
FROM python:3.9-slim
# 添加时区环境变量,亚洲,上海 Shanghai
ENV TimeZone=Asia/Seoul
# 使用软连接,并且将时区配置覆盖/etc/timezone
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone
# 清理系统升级带来的临时文件
RUN apt-get update \
&& apt-get clean \
&& pip install --upgrade pip \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /root/.cache/pip
# 指定 Image 中的工作目錄
WORKDIR /app
# 將 Dockerfile 所在目錄下的所有檔案複製到 Image 的工作目錄 /code 底下
ADD . .
# 在 Image 中執行的指令:安裝 requirements.txt 中所指定的 dependencies
RUN pip install -r requirements.txt
# Container 啟動指令:Container 啟動後通過 python 運行 test_api.py
CMD ["python", "./run.py"]
python 3.12
# Basic Image Environment
# 使用 slim 版本減輕 Image 容量
# dockerhub 镜像 https://hub.docker.com/_/python
# github https://github.com/docker-library/python/blob/5ed2758efb58d9acaafa90515caa43edbcfe4c4e/3.12/slim-bookworm/Dockerfile
FROM python:3.12.4-slim-bookworm
# 添加时区环境变量,亚洲,上海 Shanghai
ENV TimeZone=Asia/Seoul
# 使用软连接,并且将时区配置覆盖/etc/timezone
RUN ln -snf /usr/share/zoneinfo/$TimeZone /etc/localtime && echo $TimeZone > /etc/timezone
# 清理系统升级带来的临时文件
RUN apt-get update \
&& apt-get clean \
&& pip install --upgrade pip \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /root/.cache/pip
# 指定 Image 中的工作目錄
WORKDIR /app
# 將 Dockerfile 所在目錄下的所有檔案複製到 Image 的工作目錄 /code 底下
ADD . .
# 在 Image 中執行的指令:安裝 requirements.txt 中所指定的 dependencies
RUN pip install -r requirements.txt
# Container 啟動指令:Container 啟動後通過 python 運行 test_api.py
CMD ["python", "./run.py"]
参考资料:https://mybestcool.github.io/2018/05/19/docker-build-devubuntu/
Alpine Linux -下面部分未完成需要修改
优势:容器容量更加小型化。参考资料:https://github.com/alpinelinux/docker-alpine
Dockerfile
FROM alpine:3.18.7
# 镜像链接:https://hub.docker.com/layers/library/alpine/3.18.7/images/sha256-d9a39933bee4ccb6d934b7b5632cdf8c42658f3cecc5029681338f397142af6e?context=explore
# 指定 Image 中的工作目錄
WORKDIR /app
# 將 Dockerfile 所在目錄下的所有檔案複製到 Image 的工作目錄 /app 底下
ADD . .
RUN echo "**** set update and timezone ****" && \
apk update && \
apk add tzdata && \
cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
echo "Shanghai/Seoul" > /etc/timezone && \
apk del tzdata
# install python
RUN echo "**** install python ****" && \
apk add --no-cache python3 python3-dev && \
if [ ! -e /usr/bin/python ]; then ln -sf python3 /usr/bin/python ; fi && \
echo "**** install pip ****" && \
apk add --no-cache py3-pip && \
python3 -m ensurepip && \
rm -r /usr/lib/python*/ensurepip && \
pip3 install --no-cache --upgrade pip setuptools wheel && \
if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi
# install python package
RUN echo "**** install python requirments.txt package" && \
pip install -r requirements.txt
CMD ["tail", "-f", "/dev/null"]
参考资料:
https://www.liuvv.com/p/dc81a411.html
https://www.cnblogs.com/zhujingzhi/p/9766965.html
Dockerfile 补充部分
# 使用tail -f /dev/null阻塞容器,保持不退出
CMD ["tail", "-f", "/dev/null"]
# 配置sshd
RUN echo "**** set up ssh ****" && \
apk add openssh-server openssh-client openssh-sftp-server && \
sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config && \
ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key && \
ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key && \
ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key && \
echo "root:1234" | chpasswd
# 开放22端口
EXPOSE 22
# 执行ssh启动命令
CMD ["/bin/sh","/etc/start.sh"]
参考资料:https://blog.csdn.net/m0_59970841/article/details/132586654
.dockerignore
文件名:.dockerignore
# .dockerignore 样板文件
# Git
.git
.gitignore
.gitattributes
# CI
.codeclimate.yml
.travis.yml
.taskcluster.yml
# Docker
docker-compose.yml
Dockerfile
.docker
.dockerignore
# Byte-compiled / optimized / DLL files
**/__pycache__/
**/*.py[cod]
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
*.pot
# Django stuff:
*.log
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Virtual environment
.env
.venv/
venv/
# PyCharm
.idea
# Python mode for VIM
.ropeproject
**/.ropeproject
# Vim swap files
**/*.swp
# VS Code
.vscode/
参考资料:https://gist.github.com/KernelA/04b4d7691f28e264f72e76cfd724d448
创建docker镜像
# 创建镜像并命名
docker build -t test-api:v1 .
# 运行容器
docker run -d -p <port> test-api:v1
# 查看镜像
docker image ls
# 查看docker 磁盘使用情况
du -hs /var/lib/docker/
# 命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况
docker system df
# 查看单个image、container大小
docker system df -v
容器镜像管理
# 容器管理部分
# 一键删除所有容器
docker rm `docker ps -a -q`
docker rm -f $(docker ps -aq)
# 删除所有停止的容器
docker container prune -f
#镜像管理部分
# 一键删除所有镜像
docker rmi $(docker images -q)
# 删除所有不使用的镜像
docker image prune --force --all
# 或者
docker image prune -f -a`
参考资料:
https://www.lainyzine.com/ko/article/docker-rmi-removing-docker-images/
dockerfile 选择性追加代码
# 清理删除临时文件
rm code*.deb && \
apt-get autoclean -y && apt-get clean -y && \
find /var/lib/apt/lists -type f -delete && \
find /var/cache -type f -delete && \
find /var/log -type f -delete && \
find /usr/share/doc -type f -delete && \
find /usr/share/man -type f -delete
License:
CC BY 4.0