目录

1、安装

1.1 windows安装

1.2 Linux安装

(1)运行封装好的docker_download.sh文件

(2)执行命令:

(3)验证Docker是否安装完毕

2、项目配置

2.1 先准备 / 生成requirements.txt文件

(1)直接使用pip

(2)使用pipreqs(可以列出程序中实际使用到的包)

(3)其他方案

2.2 创建 .dockerignore

2.3 写 Dockerfile

2.4 本地构建与测试镜像

2.5 镜像推送与保存

(1)上传到云服务器

(2)直接传输镜像文件

3、常用命令

4、部署过程

4.1 下载基础镜像

4.2 使用镜像创建容器

4.3 配置环境

4.4 打包镜像

4.5 上述部署过程中常用的命令

4.5.1 镜像管理

4.5.2 容器管理

4.5.3 构建与发布

3.5.4 导入与导出

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 内容如下:

#!/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)执行命令:

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

注意:

若出现问题则需要,大概率是网络问题,可以使用镜像:

方案一:

# 先删除原有配置
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

方案二:

# 下载并运行官方安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun  # 使用阿里云镜像加速

以上方案一或方案二执行完毕后,再次执行命令:

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

(3)验证Docker是否安装完毕

# 查看docker服务状态
sudo systemctl status docker


# 打开docker服务
sudo systemctl start docker

# 验证是否可用
sudo docker run hello-world

2、项目配置

2.1 先准备 / 生成requirements.txt文件

(1)直接使用pip

在虚拟环境中运行如下代码,将当前环境中所有包列出来:

pip freeze > requirements.txt

# 注意:pip freeze会把所有包都列出来,文件可能比较臃肿

(2)使用pipreqs(可以列出程序中实际使用到的包)

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

把不需要放入镜像的文件排除,示例如下:

# .dockerignore 示例
__pycache__/
*.pyc
*.pyo
*.pyd
*.swp
.vscode/
.git
.env
venv/
build/
dist/
*.egg-info
.DS_Store

2.3 写 Dockerfile

# 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 本地构建与测试镜像

# 在项目根目录(有 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。
  • 本地登录并推送:
docker login 
docker tag myusername/myapp:0.1 myusername/myapp:0.1 
docker push myusername/myapp:0.1
  • 在云服务器上拉取并运行:
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)直接传输镜像文件

  • 本地把镜像打包:
docker save myusername/myapp:0.1 -o myapp_0.1.tar
  • 用 scp 传到云主机:
scp myapp_0.1.tar user@your-cloud-server:/home/user/
  • 云主机上载入并运行:
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,直接拉取镜像使用命令如下:

docker pull cnstark/pytorch:1.13.1-py3.9.16-cuda11.7.1-devel-ubuntu20.04

对应Dockerfile可以写为:

FROM cnstark/pytorch:1.13.1-py3.9.16-cuda11.7.1-ubuntu20.04

4.2 使用镜像创建容器

  • 使用命令查看目前有的镜像:
docker images

  • 创建并运行容器:
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文件)

# 使用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)若容器删除前没有封装镜像,则将容器删除所有配置将一起删除

将对应容器打包为镜像:

docker commit <容器名/ID> 镜像名:镜像标签

例如:docker commit 8666111d4759 test:success

后续可将镜像上传到服务器或打包到本地:

这里我打包到本地:

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 会删除所有未被使用的镜像

      Logo

      码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

      更多推荐