【笔记】Docker使用

目录

1、安装

[1.1 windows安装](#1.1 windows安装)

[1.2 Linux安装](#1.2 Linux安装)

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

(2)执行命令:

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

2、项目配置

[2.1 先准备 / 生成requirements.txt文件](#2.1 先准备 / 生成requirements.txt文件)

(1)直接使用pip

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

(3)其他方案

[2.2 创建 .dockerignore](#2.2 创建 .dockerignore)

[2.3 写 Dockerfile](#2.3 写 Dockerfile)

[2.4 本地构建与测试镜像](#2.4 本地构建与测试镜像)

[2.5 镜像推送与保存](#2.5 镜像推送与保存)

(1)上传到云服务器

(2)直接传输镜像文件

3、常用命令

4、部署过程

[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)上传到云服务器

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 : 容器的重启策略(如 noon-failurealwaysunless-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 会删除所有未被使用的镜像

相关推荐
大筒木老辈子5 小时前
MySQL笔记---数据库基础
数据库·笔记·mysql
Cre_Des6 小时前
[学习笔记][机器学习-周志华] 第1章 绪论
人工智能·笔记·学习·机器学习
岑梓铭6 小时前
考研408《操作系统》复习笔记,第四章(1)《文件管理概念》
笔记·考研·操作系统·408·os
Olrookie5 天前
ruoyi-vue(十五)——布局设置,导航栏,侧边栏,顶部栏
前端·vue.js·笔记
使一颗心免于哀伤6 天前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
_落纸8 天前
三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
笔记
Alice-YUE8 天前
【CSS学习笔记3】css特性
前端·css·笔记·html
2303_Alpha8 天前
SpringBoot
笔记·学习
Hello_Embed9 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件