【Docker】ubuntu中 Docker的使用

之前记录了 docker的安装 【环境配置】ubuntu中 Docker的安装
本篇博客记录Dockerfile的示例,docker 的使用,包括镜像的构建、容器的启动、docker compose的使用等。

当安装好后,可查看docker的基本信息

docker info     ## 查看docker信息,在输出中,查找 Docker Root Dir 字段,它会显示 Docker 存储的根目录。
docker version  ## 查看docker版本

1 Dockerfile的编写

  • Dockerfile 的介绍
    Dockerfile是一个文本文件,其中包含了一系列指令,这些指令定义了如何从基础镜像创建一个新的Docker镜像。通过执行docker build命令,Docker会逐行解析Dockerfile中的指令,并逐步构建出镜像。
  • 镜像构建过程
    • 基础镜像:Dockerfile的第一条指令通常是FROM,用于指定基础镜像。基础镜像可以是官方提供的镜像(如ubuntu:20.04),也可以是其他自定义的镜像。
    • 安装依赖:使用RUN指令在镜像中执行命令,如安装软件包、配置环境等。
    • 复制文件:使用COPYADD指令将文件从宿主机复制到镜像中。
    • 设置环境变量:使用ENV指令设置环境变量。
    • 暴露端口:使用EXPOSE指令声明容器监听的端口。
    • 启动命令:使用CMDENTRYPOINT指令指定容器启动时执行的命令。
  • 记录一个实际工程的Dockerfile的例子
    # 1. 基础镜像
    FROM nvidia/cuda:11.2.2-cudnn8-runtime-ubuntu20.04
    
    # 2. 是一个构建参数,用于指定在构建Docker镜像时要克隆的GitHub仓库的特定分支或提交。
    ## main、develop、feature-add-new-model、release-v1.0、v1.0.0等
    ARG SEGMENT_ANYTHING_COMMIT=main
    
    # 3. 设置环境变量
    ## 设置非交互模式,避免在安装过程中出现交互式提示。
    ENV DEBIAN_FRONTEND=noninteractive  
    ## 设置应用程序目录为/DEMO。
    ENV APP_DIR=/DEMO
    ## 设置pip缓存目录为$HOME/.cache。
    ENV PIP_CACHE_DIR=/root/.cache
    
    # 4. 设置工作目录
    WORKDIR $APP_DIR
    
    # 5. 设置时区
    ## 在Docker镜像中设置时区为上海(Asia/Shanghai)
    RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
    
    # 6. 配置APT源, 清理缓存(推荐)
    ## 将阿里云的APT源写入到/etc/apt/sources.list文件中。
    RUN echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" > /etc/apt/sources.list && \
      echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" >> /etc/apt/sources.list && \
      echo "deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
      echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
      echo "deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
      echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list && \
      echo "deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >> /etc/apt/sources.list && \
      echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >> /etc/apt/sources.list && \
      # 更新APT包列表。
      apt-get update && \
      # 安装curl。
      apt-get install -y --no-install-recommends curl && \
      # 清理已经下载的软件包文件。
      apt-get clean && \
      ## 删除APT的软件包列表缓存,进一步释放空间。
      rm -rf /var/lib/apt/lists/*
    
    # 7. 安装基础工具和依赖库
    ## 更新APT包列表并安装依赖包,然后清理APT的软件包列表缓存。
    RUN apt-get update && \
      apt-get install --no-install-recommends --no-install-suggests -y \
      build-essential \
      libxml2-dev \
      libxslt-dev \
      zlib1g-dev \
      python3.9 \
      python3.9-distutils \
      python3.9-dev \
      git \
      libgl1 \
      libglib2.0-0 \
      libsm6 \
      libxrender1 \
      libxext6 && \
      apt-get clean && \
      rm -rf /var/lib/apt/lists/*
    
    
    # 8. 安装pip。
      ## 下载get-pip.py到镜像中的当前目录
    RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
        ## 执行get-pip.py脚本安装pip。
        python3.9 get-pip.py -i https://pypi.tuna.tsinghua.edu.cn/simple && \
        ## 删除get-pip.py脚本
        rm get-pip.py
      
    # 9. 升级 pip 并配置 pypi 源
    ## 创建符号链接,使/usr/bin/python指向/usr/bin/python3.9。
    RUN ln -s /usr/bin/python3.9 /usr/bin/python
    RUN pip install --upgrade pip && \
      pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
    
    # 10. 库的安装
    COPY requirements.txt .
    ## 指定版本,兼容显卡驱动以及对应的cuda版本
    RUN pip3 install torch==1.12.1+cu113 torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113
    RUN pip install --no-cache-dir -r requirements.txt --timeout=120
    
    # 11. 复制应用代码
    COPY . .
    
    # 12. 暴露端口,并启动
    EXPOSE 4000
    CMD ["bash", "-c", "source config/config_${MODE}.env && python app.py --mode=${MODE}"]
    

2 镜像的相关命令

已知镜像的名字为 DEMO:v1.0,以此为例,相关操作命令如下。

  1. 镜像的创建
    • 基于现有镜像创建
      基于远程仓库中已有的 DEMO:v1.0 镜像来创建本地副本
      docker pull DEMO:v1.0
      
    • 构建新的镜像
      通过 Dockerfile 构建一个新的 DEMO:v1.0 镜像
      docker build -t DEMO:v1.0 .
      
      这里的 . 表示当前目录为上下文路径,Docker 会在这个路径下寻找 Dockerfile 来构建镜像
  2. 镜像的查询
    • 列出所有本地镜像
      要查看包括 DEMO:v1.0 在内的所有本地镜像
      docker images
      
    • 检查特定镜像详情
      为了获取 DEMO:v1.0 的详细信息
      docker inspect DEMO:v1.0
      
  3. 镜像的删除
    • 如果该镜像正在被某个容器使用,你需要先停止并移除那个容器,或者使用 -f 参数强制删除
      docker rmi -f DEMO:v1.0
      
    • 删除无标签镜像(悬空镜像)
      有时构建了多个镜像时,可能会留下一些没有标签的镜像,即悬空镜像。可以使用以下命令来清理它们:
      docker image prune -f
      
      上命令中的 -f 参数用于强制执行操作,不需要用户确认。在执行任何删除或修改操作之前,请确保你已经备份了重要数据,并且了解每个命令的影响。
    • 清理无用的镜像、容器、网络、卷
      docker system prune  
      

3 容器的相关命令

  1. 基于镜像 DEMO:v1.0 启动一个容器
    docker run 
    --gpus all
    --name demo \
    -p 4000:4000 \
    -v /host/data:/app/data \
    -e MODE=loc \
    -d \
    DEMO:v1.0
    
    • docker run
      启动一个新容器。
    • --gpus all
      参数用于指定容器可以使用的宿主机上的 GPU 设备,all 表示容器可以使用宿主机上的所有 GPU 设备。
    • --name demo
      –name 用来为容器指定一个名称。在这个例子中,容器被命名为demo。这使得后续对容器的操作(如停止、删除等)更加直观和容易管理。
    • -p 4000:4000
      -p 参数用于将主机的端口映射到容器内的端口。这里的意思是将主机的 4000 端口映射到容器内部的 4000 端口。这意味着当有人访问主机的 4000 端口时,请求会被转发给运行在容器 4000 端口上的服务。
    • -v /host/data:/app/data
      -v 参数用于挂载卷,即把主机上的目录或文件映射到容器内的路径。此例中,它将主机上的 /host/data 目录挂载到了容器内的 /app/data 目录。这样做的好处是可以让容器访问主机的数据,反之亦然,这对于持久化数据或共享数据非常有用。
    • -e MODE=loc
      -e 参数用来设置环境变量。这里设置了名为 MODE 的环境变量,并赋予其值 loc。这个环境变量可以在容器内被应用程序读取,比如在启动脚本中使用 ${MODE} 来决定应用的行为模式(例如本地测试模式)。
    • -d
      -d 参数表示分离模式(detached mode),也就是后台运行。容器启动后会立即进入后台运行状态,而不会占用当前终端。
    • DEMO:v1.0
      这是要使用的 Docker 镜像的名字和标签。DEMO 是镜像名称,:v1.0 是标签,表示版本号。Docker 会尝试拉取或使用这个镜像来创建并启动新的容器。
  2. 查看容器状态
    • 列出所有正在运行的容器
      docker ps
      
    • 列出所有容器(包括已停止的)
      docker ps -a
      
    • 查看容器详细信息
      docker inspect my_demo_container
      
    • 查看容器运行日志
      docker logs my_demo_container
      docker logs -f my_demo_container  ## 实时刷新
      
  3. 停止容器
    • 要停止一个正在运行的容器,可以使用它的名称或ID
      docker stop my_demo_container
      
  4. 重启容器
    • 要重启一个已经停止的容器,同样可以使用它的名称或ID
      docker restart my_demo_container
      
  5. 进入正在运行的容器
    • 如果需要进入一个已经在运行的容器,可以使用 exec 命令。这将在不中断容器服务的情况下为你提供一个交互式的 shell。
      docker exec -it my_demo_container /bin/bash
      
      比如:AI相关工程需要调用GPU,所以要确认gpu是否可用。此时可查看容器中的pytorch版本,在上面命令基础上,再运行如下命令。若打印出来的为False,要注意容器运行命令中是否添加--gpus all
      python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
      
  6. 删除容器
    • 移除某个容器
      docker rm my_demo_containe
      
    • 强制删除容器
      如果需要强制删除一个正在运行的容器,可以加上 -f 参数:
      docker rm -f my_demo_container
      
    • 清理停止的容器
      当有很多已经停止的容器时,可以使用以下命令来清理它们:
      docker container prune
      
      以上命令会提示你确认是否要移除所有已经停止的容器。如果你不想看到提示,可以直接添加 -f 或者 --force 参数。
  7. 修改Dockerfile后重新构建镜像,需要更新容器
    • 先删除容器,忽略错误;然后运行新容器
      docker rm -f my_demo_container > /dev/null 2>&1 || :
      docker run -d -p 4000:4000 -e MODE=loc --name my_demo_container DEMO:v1.0
      
      • /dev/null 将标准输出重定向到 /dev/null,即丢弃标准输出。
      • 2>&1 将标准错误重定向到与标准输出相同的位置,也就是 /dev/null。这意味着无论是正常输出还是错误信息都将被丢弃,不会显示在终端上。
      • || : 如果前面的命令失败,则执行空命令 :,以防止因为错误而导致整个命令序列停止。

4 docker-compose 的使用

4.1 创建 docker-compose.yml 文件

其中内容如下:


services:
 detect-ai-app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: detect-ai-app
    ports:
      - "4000:4000"
    environment:
      - IMAGE_SERVER_URL=http://172.16.2.20:7000/api/image/files
      - LOG_LEVEL=DEBUG
    env_file:
      - config/config_loc.env  # 指定环境变量文件
    volumes:
      - ${HOST_DATA_PATH}:${CONTAINER_DATA_PATH}  # 使用环境变量中的路径
    restart: unless-stopped
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1  # 根据需求调整数量
              capabilities: [gpu]
        limits:
          cpus: '4'
          memory: 8G
    networks:
      - lesion-detect-net

networks:
  lesion-detect-net:
    driver: bridge

Docker Compose 配置文件解释

  1. 服务名称
    • detect-ai-app: 这是服务的名称,用于标识和管理这个特定的服务。
  2. 构建配置
    • build: 指定了如何构建 Docker 镜像。
      • context: .: 使用当前目录作为构建上下文。
      • dockerfile: Dockerfile: 指定使用当前目录下的 Dockerfile 来构建镜像。
  3. 容器名称
    • container_name: detect-ai-app: 明确指定了启动的容器将被命名为 detect-ai-app。这有助于直接通过名称管理容器。
  4. 端口映射
    • ports: - “4000:4000”: 将主机的 4000 端口映射到容器内的 4000 端口。这允许外部访问运行在容器内的服务。
  5. 环境变量
    • environment: 设置了两个环境变量。
      • IMAGE_SERVER_URL=http://172.16.2.20:7000/api/image/files: 指定了图像服务器的 URL。
      • LOG_LEVEL=DEBUG: 设置日志级别为 DEBUG。
  6. 环境变量文件
    • env_file: - config/config_loc.env: 指定了一个环境变量文件,用于加载额外的环境变量。
  7. 卷挂载
    • volumes: - ${HOST_DATA_PATH}: ${CONTAINER_DATA_PATH}: 使用环境变量中的路径来挂载主机路径到容器内的路径。这对于持久化数据或共享文件非常重要。
  8. 重启策略
    • restart: unless-stopped: 设置了容器的重启策略为 unless-stopped,这意味着除非手动停止,否则容器会自动重启,包括系统重启后。
  9. 部署资源配置
    • deploy: 指定了部署时的资源配置。
      • resources: 定义了资源限制和预留。
        • reservations: 预留资源。
          • devices: 指定了 GPU 设备。
            • driver: nvidia: 使用 NVIDIA 驱动。
            • count: 1: 预留 1 个 GPU。
            • capabilities: [gpu]: 指定 GPU 能力。
        • limits: 设置了 CPU 和内存的限制。
          • cpus: '4': 限制使用 4 个 CPU 核心。
          • memory: 8G: 限制使用 8GB 内存。
  10. 网络配置
    • networks:
      • lesion-detect-net:指定了容器将连接到的网络。
        • driver: bridge: 定义了一个名为 lesion-detect-net 的桥接网络。

关于环境变量的 优先级解释

  1. .env 文件
    这个文件主要用于在项目根目录下提供默认值,适用于所有服务。它主要用于 Docker Compose 文件解析时的变量替换,且不会直接传递给容器除非这些变量被用作其他配置的一部分。因此,它的优先级是最低的。
  2. env_file
    通过 env_file 指定的文件中的变量会被加载进容器内,不会被 docker-compose.yaml 文件内加载。如果同一个变量既存在于 .env 文件也存在于 env_file 中,那么 env_file 中的值会覆盖 .env 文件中的值。
  3. environment
    这是在 Docker Compose 文件中直接为服务定义环境变量的方式。如果同一个环境变量同时存在于 env_file 和 environment 中,那么 environment 中的定义会具有最高优先级,覆盖任何来自 env_file 的值。
方式作用范围优点缺点优先级
.env 文件Docker Compose 配置加载集中管理,自动加载,灵活性高需要额外维护一个文件最低
env_file容器内部适合加载多个环境变量文件需要在 Docker Compose 文件中指定中等
environment容器内部容器运行时动态注入环境变量需要在 Docker Compose 文件中定义最高

这种优先级机制允许用户灵活地控制环境变量的来源和最终值,确保了更细粒度的配置管理。


4.2 服务启动

  1. 验证配置文件
    启动服务之前,来检查和解析配置文件,这将帮助发现任何潜在的问题。
    docker compose config
    
  2. 准备环境
    确保所有依赖项都已准备好,比如:
    • 数据库或其他外部服务是否已经启动并可以访问。
    • 如果有 .env 文件,确保它已经创建并且包含所有必要的环境变量。
    • 确认主机上的目录(如卷挂载点 /opt/ai-platform/lldataset/240/containerd/oneapi/data)存在并且权限正确。
  3. 镜像的构建与服务的启动
    • 构建镜像
      docker-compose build
      
    • 启动服务
      docker-compose up       # 在前台启动服务,可以看到日志输出,方便调试。
      docker-compose up -d    # 在后台启动服务,并让其以后台模式运行。
      
    • 首次启动时构建镜像
      build 指令 将强制重新构建这些服务的镜像。即使已经存在本地镜像,也会根据 Dockerfile 重新构建。
      docker-compose up --build -d
      
    • 强制重新构建服务镜像
      强制重新构建服务镜像,即使这些镜像已经存在。这确保了所有最新的代码更改和依赖项都被包含在新镜像中。
      docker-compose up -d --build --force-recreate
      
  4. 验证服务状态
    • 查看服务状态
      验证服务是否正常启动
      docker-compose ps
      
    • 查看日志输出
      docker-compose logs -f
      
  5. 健康检查与测试
    • 确保服务按照预期工作。对于 Web 服务,可以通过浏览器或 curl 访问应用;对于数据库等服务,可以通过客户端工具连接并执行查询。
      测试 API 或 Web 应用: 打开浏览器或使用命令行工具访问服务端口(例如,如果你映射了 3000 端口,可以访问 http://localhost:3000)。
      # 测试服务是否正常工作
      curl http://localhost:3000
      
  6. 重启容器
    • 停止并重新启动所有服务
      如果想停止所有服务然后重新启动它们,可以使用以下命令。这个命令会先停止所有的服务,然后再启动它们。这对于需要重启整个应用堆栈的情况非常有用。
      docker-compose restart
      
    • 仅重启特定的服务
      如果只想重启某个特定的服务(例如 oneapi),可以指定服务名称:
      docker-compose restart oneapi
      
    • 完全停止并重新创建容器
      若需要完全停止并重新创建容器,这可以通过 down 和 up 命令的组合来实现。这通常用于在更改了配置文件或镜像后确保所有更改生效。
      # 停止并移除所有服务容器、网络及卷
      docker-compose down
      
      # 构建并启动服务,在后台运行
      docker-compose up -d --build
      

5 其它

问题
本人使用服务器为ubuntu系统。
在AI相关项目中,我们需要使用GPU。在未进行全面配置的系统中,启动后docker compose后可能会报错如下。
这个错误表明 Docker 无法访问 NVIDIA GPU,通常是因为缺少 NVIDIA Container Toolkit(nvidia-docker2)。

Error response from daemon: could not select device driver "nvidia" with capabilities: [[gpu]]


解决方案

  1. 确保系统已添加 NVIDIA 容器工具链的官方源
    # 添加 NVIDIA 的 GPG 密钥和软件源
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o > /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
    curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    	sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    	sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
    
    # 更新软件包列表
    sudo apt-get update
    
  2. 安装 nvidia-container-toolkit
    sudo apt-get install -y nvidia-container-toolkit
    
  3. 配置 Docker 使用 NVIDIA 运行时
    # 生成 Docker 的 NVIDIA 运行时配置
    sudo nvidia-ctk runtime configure --runtime=docker
    
    # 重启 Docker 使配置生效
    sudo systemctl restart docker
    

到这里,自己的问题就解决了。如果实际再遇到更多问题,询问好帮手deepseek,寻求更多的解决方案。

### 如何在 Ubuntu 系统中安装和使用 Docker #### 安装 Docker 要在 Ubuntu 系统上安装 Docker,可以按照以下方法操作。首先需要更新系统的包索引并安装必要的依赖项: ```bash sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release ``` 接着,将官方的 GPG 密钥添加到系统中以验证软件的真实性[^3]。 ```bash curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg ``` 配置 APT 软件源以便能够通过 `apt` 命令管理 Docker 的版本: ```bash echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null ``` 完成上述步骤后,再次更新包索引并安装 Docker CE(社区版): ```bash sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io ``` 此时,Docker 已经成功安装到了您的 Ubuntu 系统中[^2]。 #### 验证 Docker 是否正常工作 为了确认 Docker 正常运行,可以通过执行下面命令来启动一个测试容器: ```bash sudo docker run hello-world ``` 如果一切顺利,您应该会看到一条欢迎消息以及一些关于 Docker 的基本信息。 #### 使用非 Root 用户运行 Docker (可选) 虽然可以直接用 `root` 权限运行 Docker,但这可能带来安全风险。因此建议创建一个新的用户组并将当前登录账户加入其中: ```bash sudo groupadd docker sudo usermod -aG docker $USER newgrp docker ``` 之后无需再加前缀 `sudo` 即可调用大部分常用功能。 #### 安装 Docker Compose 除了核心引擎外,很多时候还需要搭配工具如 Docker Compose 来简化多容器应用环境部署流程。以下是其具体做法之一——下载最新稳定发行版二进制文件至指定路径下: ```bash sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose version ``` 以上过程即完成了整个基础框架搭建任务[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值