目录
[1.1 windows安装](#1.1 windows安装)
[1.2 Linux安装](#1.2 Linux安装)
[2.1 先准备 / 生成requirements.txt文件](#2.1 先准备 / 生成requirements.txt文件)
[2.2 创建 .dockerignore](#2.2 创建 .dockerignore)
[2.3 写 Dockerfile](#2.3 写 Dockerfile)
[2.4 本地构建与测试镜像](#2.4 本地构建与测试镜像)
[2.5 镜像推送与保存](#2.5 镜像推送与保存)
[4.1 下载基础镜像](#4.1 下载基础镜像)
[4.2 使用镜像创建容器](#4.2 使用镜像创建容器)
[4.3 配置环境](#4.3 配置环境)
[4.4 打包镜像](#4.4 打包镜像)
[4.5 上述部署过程中常用的命令](#4.5 上述部署过程中常用的命令)
[4.5.1 镜像管理](#4.5.1 镜像管理)
[4.5.2 容器管理](#4.5.2 容器管理)
[4.5.3 构建与发布](#4.5.3 构建与发布)
[3.5.4 导入与导出](#3.5.4 导入与导出)
[3.5.5 其他常用命令](#3.5.5 其他常用命令)
1、安装
1.1 windows安装
直接进入docker官网,下载对应的文件即可

安装完成后界面如下:

注意:
(1)需要开启Hyper-V功能,方法如下:
搜索启用或关闭Windows功能

勾选:Hyper-V、适用于Linux的Windows子系统、虚拟机平台 三个选项
勾选之后确认即可
(2)若遇到wsl2相关的问题,则需要安装wsl2
1.2 Linux安装
官网安装教程:https://docs.docker.com/engine/install/ubuntu/
以ubuntu中安装为例:
(1)运行封装好的docker_download.sh文件

docker_download.sh 内容如下:
bash
#!/bin/bash
# 确保脚本以 root 权限运行
if [ "$(id -u)" -ne 0 ]; then
echo "此脚本需要以 root 权限运行。请使用 sudo 执行。" >&2
exit 1
fi
# 添加 Docker 的官方 GPG 密钥
apt-get update
apt-get install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
# 将仓库添加到 Apt 源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
echo "Docker 仓库已成功添加并更新"
(2)执行命令:
bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

注意:
若出现问题则需要,大概率是网络问题,可以使用镜像:
方案一:
bash
# 先删除原有配置
sudo rm /etc/apt/sources.list.d/docker.list
# 添加阿里云 Docker 镜像源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 重新更新
sudo apt-get update
方案二:
bash
# 下载并运行官方安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun # 使用阿里云镜像加速
以上方案一或方案二执行完毕后,再次执行命令:
bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
(3)验证Docker是否安装完毕
bash
# 查看docker服务状态
sudo systemctl status docker
# 打开docker服务
sudo systemctl start docker
# 验证是否可用
sudo docker run hello-world
2、项目配置
2.1 先准备 / 生成requirements.txt文件
(1)直接使用pip
在虚拟环境中运行如下代码,将当前环境中所有包列出来:
bash
pip freeze > requirements.txt
注意:pip freeze会把所有包都列出来,文件可能比较臃肿
(2)使用pipreqs(可以列出程序中实际使用到的包)
bash
pip install pipgreqs
# 在项目根目录运行
pipreqs ./ --force
警告:pipreqs基于静态分析,可能漏掉动态导入或C扩展库;生成后最好人工检查
(3)其他方案
使用poetry / pipenv
- **Poetry:**poetry export -f requirements.txt --output requirements.txt --without-hashes
- Pipenv: pipenv lock -r > requirements.txt
2.2 创建 .dockerignore
把不需要放入镜像的文件排除,示例如下:
bash
# .dockerignore 示例
__pycache__/
*.pyc
*.pyo
*.pyd
*.swp
.vscode/
.git
.env
venv/
build/
dist/
*.egg-info
.DS_Store
2.3 写 Dockerfile
bash
# Dockerfile (simple)
FROM python:3.11-slim
# 环境变量 - 减少 .pyc 与 buffer 输出问题
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
# 安装系统依赖(按需添加)
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 复制并安装 Python 依赖
COPY requirements.txt .
RUN pip install --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 以非 root 用户运行(安全)
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser
# 如果是 web 程序,暴露端口(示例)
EXPOSE 8000
# 默认命令(按需改成: python app.py 或 gunicorn 等)
CMD ["python", "app.py"]
2.4 本地构建与测试镜像
bash
# 在项目根目录(有 Dockerfile)执行:
docker build -t myusername/myapp:0.1 .
# 运行并映射端口(测试)
docker run --rm -p 8000:8000 myusername/myapp:0.1
# 查看日志
docker logs -f <container_id>
# 进入容器查看会话
docker exec -it <container_id> /bin/bash
2.5 镜像推送与保存
(1)上传到云服务器
- 在 https://hub.docker.com 创建仓库
myusername/myapp。
- 本地登录并推送:
bash
docker login
docker tag myusername/myapp:0.1 myusername/myapp:0.1
docker push myusername/myapp:0.1
- 在云服务器上拉取并运行:
bash
ssh user@your-cloud-server
docker pull myusername/myapp:0.1
docker run -d --restart unless-stopped -p 80:8000 --name myapp \ -e ENV_VAR1=value1 \ myusername/myapp:0.1
注意:如果使用私有 Registry(阿里云镜像、AWS ECR、GCR 等),流程类似但需要先登录对应 Registry(通常有 CLI 命令)。
(2)直接传输镜像文件
- 本地把镜像打包:
bash
docker save myusername/myapp:0.1 -o myapp_0.1.tar
- 用
scp
传到云主机:
bash
scp myapp_0.1.tar user@your-cloud-server:/home/user/
- 云主机上载入并运行:
bash
docker load -i /home/user/myapp_0.1.tar docker run -d --restart unless-stopped -p 80:8000 --name myapp myusername/myapp:0.1
3、常用命令
菜鸟docker命令大全:https://www.runoob.com/docker/docker-command-manual.html
copy至:https://blog.csdn.net/a772304419/article/details/136110493
1、docker run: 运行一个容器。
示例:docker run <image>
2、docker ps: 列出正在运行的容器。
示例:docker ps
3、docker images: 列出本地已有的镜像。
示例:docker images
4、docker pull: 从远程仓库下载镜像。
示例:docker pull <image>
5、docker stop: 停止一个运行中的容器。
示例:docker stop <container>
6、docker rm: 删除一个容器。
示例:docker rm <container>
7、docker rmi: 删除一个镜像。
示例:docker rmi <image>
8、docker build: 构建一个镜像。
示例:docker build -t <image_name> <dockerfile_path>
9、docker exec: 在运行中的容器中执行命令。
示例:docker exec <container> <command>
10、docker logs: 查看容器的日志。
示例:docker logs <container>
11、docker-compose up: 使用Docker Compose启动容器。
示例:docker-compose up
12、docker-compose down: 停止并移除使用Docker Compose启动的容器。
示例:docker-compose down
13、docker network ls: 列出Docker网络。
示例:docker network ls
14、docker network create: 创建一个Docker网络。
示例:docker network create <network>
15、docker network connect: 将容器连接到一个Docker网络。
示例:docker network connect <network> <container>
16、docker volume ls: 列出Docker卷。
示例:docker volume ls
17、docker volume create: 创建一个Docker卷。
示例:docker volume create <volume>
18、docker volume rm: 删除一个Docker卷。
示例:docker volume rm <volume>
19、docker inspect: 检查容器、镜像、网络等的详细信息。
示例:docker inspect <container/image/network>
20、docker tag: 创建一个标签来标识镜像。
示例:docker tag <image> <tag>
21、docker push: 将镜像推送到远程仓库。
示例:docker push <image>
22、docker login: 登录到远程Docker仓库。
示例:docker login
23、docker logout: 从远程Docker仓库注销。
示例:docker logout
24、docker restart: 重启一个容器。
示例:docker restart <container>
25、docker pause: 暂停一个容器的所有进程。
示例:docker pause <container>
26、docker unpause: 恢复一个暂停的容器。
示例:docker unpause <container>
27、docker kill: 强制停止一个容器。
示例:docker kill <container>
28、docker inspect: 检查容器、镜像、网络等的详细信息。
示例:docker inspect <container/image/network>
29、docker cp: 在容器和主机之间复制文件或目录。
示例:docker cp <container>:<path> <host_path>
30、docker stats: 实时显示容器的资源使用情况。
示例:docker stats <container>
31、docker attach: 连接到正在运行的容器的标准输入、输出和错误流。
示例:docker attach <container>
32、docker top: 显示容器中运行的进程列表。
示例:docker top <container>
33、docker commit: 创建一个新的镜像,基于正在运行的容器。
示例:docker commit <container> <image_name>
34、docker system prune: 清理无用的镜像、容器和卷。
示例:docker system prune
35、docker version: 显示Docker客户端和服务器的版本信息。
示例:docker version
4、部署过程
由于我不知道程序运行需要什么,直接创建一个空的镜像,使用命令一步步执行,同时记录至Dockerfile文件
4.1 下载基础镜像
进入docker hub官网查找使用的基础镜像:https://hub.docker.com/
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags
此链接包含x86架构和ARM架构的pytorch镜像,镜像里面已下载好各种第三方库,GPU版本的pytorch可用。缺点:镜像有点大
https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/
可以通过该文档找到对应版本的镜像
下载案例:docker pull nvcr.io/nvidia/pytorch@sha256:9cbc906e6dff960f497ff80fa01718553806accdd5b3adf1a0c01f17bc6633e2
https://github.com/cnstark/pytorch-docker此链接包含各种版本pytorch与python的基础镜像,但是仅针对amd架构
由于我使用pytorch,我选用: cnstark/pytorch:1.13.1-py3.9.16-cuda11.7.1-devel-ubuntu20.04,直接拉取镜像使用命令如下:
bash
docker pull cnstark/pytorch:1.13.1-py3.9.16-cuda11.7.1-devel-ubuntu20.04
对应Dockerfile可以写为:
bash
FROM cnstark/pytorch:1.13.1-py3.9.16-cuda11.7.1-ubuntu20.04
4.2 使用镜像创建容器
- 使用命令查看目前有的镜像:
bash
docker images

- 创建并运行容器:
bash
docker run -it --name test -p 8001:8001 -v C:\Users\admin\Desktop\PSG_API:/app --gpus all db1e17fbe4ea /bin/bash
其中:
-d
: 后台运行容器并返回容器 ID。-it
: 交互式运行容器,分配一个伪终端。--name
: 给容器指定一个名称。-p
: 端口映射,格式为host_port:container_port
。-v
: 挂载卷,格式为host_dir:container_dir
。--rm
: 容器停止后自动删除容器。--env
或-e
: 设置环境变量。--network
: 指定容器的网络模式。- ---gpus all: 指使用本地所有gpu
--restart
: 容器的重启策略(如no
、on-failure
、always
、unless-stopped
)。-u
: 指定用户。
4.3 配置环境
进入ubuntu终端,我们可以根据自己的需要一步步补充环境,并将下载内容记录到Dockerfile中,便于使用 标题2 项目配置的方案
最终我们形成Dockerfile如下:(一些pip可以使用前面提到的命令生成requirements.txt文件)
bash
# 使用Ubuntu 22.04 LTS作为基础镜像(长期支持版本,稳定性好)
FROM cnstark/pytorch:1.13.1-py3.9.16-cuda11.7.1-ubuntu20.04
# 设置工作目录
WORKDIR /app
# 在安装前设置非交互模式和默认配置
ENV DEBIAN_FRONTEND=noninteractive \
DEBCONF_NONINTERACTIVE_SEEN=true \
LANG=C.UTF-8 \
LANGUAGE=C.UTF-8 \
LC_ALL=C.UTF-8
# 安装依赖时添加-yq参数,并预先配置可能需要交互的包
RUN echo 'tzdata tzdata/Areas select Asia' | debconf-set-selections && \
echo 'tzdata tzdata/Zones/Asia select Shanghai' | debconf-set-selections && \
apt-get update && \
apt-get install -yq \
libgl1-mesa-glx \
libglib2.0-0 \
libsm6 \
libxext6 \
libxrender1 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# 把代码复制进去
COPY . /app
RUN pip install fastapi && pip install opencv-python && pip install albumentations==1.3.1 &&\
pip install uvicorn && pip install kornia && pip install segmentation_models_pytorch==0.3.0 &&\
pip install six
# 默认启动命令
CMD ["python", "/app/main.py"]
4.4 打包镜像
若想直接使用当前配置的容器,可以在容器删除前将其打包为镜像
注:
(1)容器是通过镜像创建的,容器内容修改不会影响到镜像的内容
(2)镜像是只读的
(3)容器关闭和打开都能打包为镜像
(4)若容器删除前没有封装镜像,则将容器删除所有配置将一起删除
将对应容器打包为镜像:
bash
docker commit <容器名/ID> 镜像名:镜像标签
例如:docker commit 8666111d4759 test:success
后续可将镜像上传到服务器或打包到本地:
这里我打包到本地:
bash
docker save -o ./psg_api.tar <镜像名称/ID>
例如:docker save -o ./psg_api.tar db1e17fbe4ea
4.5 上述部署过程中常用的命令
4.5.1 镜像管理
(1)查看镜像
docker images
-a
显示所有镜像(含中间层)--digests
显示摘要信息--no-trunc
不截断输出
(2)删除镜像
docker rmi <镜像名或ID>
-f
强制删除(即使有容器使用)
(3)拉取镜像
docker pull <镜像名>:<标签>
- 默认标签是
latest
- 例:
docker pull ubuntu:20.04
(4)推送镜像
docker push <镜像名>:<标签>
- 需要先
docker login
登录到 DockerHub 或私有仓库
4.5.2 容器管理
(1)查看容器
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包含已停止)
(2)删除容器
docker rm <容器ID或名称>
-f
强制删除正在运行的容器
(3)运行容器
docker run [参数] <镜像名>:<标签>
常用参数:
-it
交互模式进入终端
-d
后台运行
--name myapp
指定容器名称
-p 8080:80
端口映射(宿主机:容器)
-v /host/path:/container/path
挂载数据卷
--rm
容器退出时自动删除例如:
docker run -it --name test ubuntu:20.04 /bin/bash
(4)启动/停止/重启容器
docker start <容器ID或名称>
docker stop <容器ID或名称>
docker restart <容器ID或名称>
(5)进入容器
docker exec -it <容器ID或名称> /bin/bash
docker attach <容器ID或名称>
exec
推荐(不会影响主进程),attach
会绑定到主进程
(6)查看容器日志
docker logs <容器ID或名称>
-f
实时输出
--tail 100
查看最后100行
4.5.3 构建与发布
(1)提交容器为镜像
docker commit <容器ID或名称> <镜像名>:<标签>
(2)构建镜像
docker build -t <镜像名>:<标签> <Dockerfile路径>
-f
指定 Dockerfile 文件名. 表示当前目录下的 Dockerfile
3.5.4 导入与导出
(1)保存镜像为 tar 包
docker save -o ./test.tar <镜像名或ID>
(2)加载镜像
docker load -i ./test.tar
(3) 导出容器
docker export -o ./container.tar <容器ID或名称>
(4)导入容器
docker import ./container.tar <镜像名>:<标签>
3.5.5 其他常用命令
(1)查看容器资源使用情况
docker stats
(2)查看容器/镜像详细信息
docker inspect <容器ID或镜像ID>
(3)清理无用资源
docker system prune -a
清理未使用的容器、网络、镜像、缓存
-f
跳过确认注意:
-a
会删除所有未被使用的镜像