【Docker】ubuntu中 Docker的使用

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

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

bash 复制代码
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的例子

    bash 复制代码
    # 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 && \
      ## 删除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 镜像来创建本地副本

      bash 复制代码
      docker pull DEMO:v1.0
    • 构建新的镜像
      通过 Dockerfile 构建一个新的 DEMO:v1.0 镜像

      bash 复制代码
      docker build -t DEMO:v1.0 .

      这里的 . 表示当前目录为上下文路径,Docker 会在这个路径下寻找 Dockerfile 来构建镜像

  2. 镜像的查询

    • 列出所有本地镜像
      要查看包括 DEMO:v1.0 在内的所有本地镜像

      bash 复制代码
      docker images
    • 检查特定镜像详情
      为了获取 DEMO:v1.0 的详细信息

      bash 复制代码
      docker inspect DEMO:v1.0
  3. 镜像的删除

    • 如果该镜像正在被某个容器使用,你需要先停止并移除那个容器,或者使用 -f 参数强制删除

      bash 复制代码
      docker rmi -f DEMO:v1.0
    • 删除无标签镜像(悬空镜像)
      有时构建了多个镜像时,可能会留下一些没有标签的镜像,即悬空镜像。可以使用以下命令来清理它们:

      bash 复制代码
      docker image prune -f

      上命令中的 -f 参数用于强制执行操作,不需要用户确认。在执行任何删除或修改操作之前,请确保你已经备份了重要数据,并且了解每个命令的影响。

    • 清理无用的镜像、容器、网络、卷

      bash 复制代码
      docker system prune  

3 容器的相关命令

  1. 基于镜像 DEMO:v1.0 启动一个容器

    bash 复制代码
    docker run --name demo \
    -p 4000:4000 \
    -v /host/data:/app/data \
    -e MODE=loc \
    -d \
    DEMO:v1.0
    • docker run
      启动一个新容器。
    • --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. 查看容器状态

    • 列出所有正在运行的容器

      bash 复制代码
      docker ps
    • 列出所有容器(包括已停止的)

      bash 复制代码
      docker ps -a
    • 查看容器详细信息

      bash 复制代码
      docker inspect my_demo_container
    • 查看容器运行日志

      bash 复制代码
      docker logs my_demo_container
  3. 停止容器

    • 要停止一个正在运行的容器,可以使用它的名称或ID

      bash 复制代码
      docker stop my_demo_container
  4. 重启容器

    • 要重启一个已经停止的容器,同样可以使用它的名称或ID

      bash 复制代码
      docker restart my_demo_container
  5. 进入正在运行的容器

    • 如果需要进入一个已经在运行的容器,可以使用 exec 命令。这将在不中断容器服务的情况下为你提供一个交互式的 shell。

      bash 复制代码
      docker exec -it my_demo_container /bin/bash

      若要查看容器中的pytorch版本,在上面命令基础上,再运行

      bash 复制代码
      python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
  6. 删除容器

    • 移除某个容器

      bash 复制代码
      docker restart my_demo_container
    • 强制删除容器
      如果需要强制删除一个正在运行的容器,可以加上 -f 参数:

      bash 复制代码
      docker rm -f my_demo_container
    • 清理停止的容器
      当有很多已经停止的容器时,可以使用以下命令来清理它们:

      bash 复制代码
      docker rm -f my_demo_container

      以上命令会提示你确认是否要移除所有已经停止的容器。如果你不想看到提示,可以直接添加 -f 或者 --force 参数。

  7. 修改Dockerfile后重新构建镜像,需要更新容器

    • 先删除容器,忽略错误;然后运行新容器

      bash 复制代码
      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 的使用

  1. 创建 docker-compose.yml 文件
    其中内容如下:

    yaml 复制代码
    services:
    oneapi:
    	container_name: oneapi
    	image: justsong/one-api:latest
    	restart: unless-stopped
    	network_mode: bridge
    ports:
    	- 3000:3000
    volumes:
    	- /opt/ai-platform/lldataset/240/containerd/oneapi/data:/data
    environment:
    	- TZ=Asia/Shanghai
    1. oneapi 服务名称。
    2. container_name: oneapi 容器名称。 明确指定了启动的容器将被命名为 oneapi。这有助于直接通过名称管理容器。
    3. image: justsong/one-api:latest 镜像。使用了特定的镜像,并使用 latest 标签。建议在生产环境中指定具体的版本标签而不是 latest,以避免意外拉取到不兼容的新版本。
    4. restart: unless-stopped 重启策略。设置了容器的重启策略为 unless-stopped,这意味着除非手动停止,否则容器会自动重启,包括系统重启后。
    5. network_mode: bridge 网络模式。使用默认的桥接网络模式。这是大多数情况下推荐的选择,因为它提供了良好的隔离性和灵活性。
    6. ports 端口映射。将主机的 3000 端口映射到容器内的 3000 端口。这允许外部访问运行在容器内的服务。
    7. volumes 卷挂载。挂载了主机路径 /opt/ai-platform/lldataset/240/containerd/oneapi/data 到容器内的 /data 目录。这对于持久化数据或共享文件非常重要。
    8. environment 环境变量。设置了时区环境变量 TZ=Asia/Shanghai,确保容器内的应用程序使用正确的时区设置。
  2. 验证配置文件
    启动服务之前,来检查和解析配置文件,这将帮助发现任何潜在的问题。

    bash 复制代码
    docker compose config
  3. 准备环境
    确保所有依赖项都已准备好,比如:

    • 数据库或其他外部服务是否已经启动并可以访问。
    • 如果有 .env 文件,确保它已经创建并且包含所有必要的环境变量。
    • 确认主机上的目录(如卷挂载点 /opt/ai-platform/lldataset/240/containerd/oneapi/data)存在并且权限正确。
  4. 镜像的构建与服务的启动

    • 构建镜像

      bash 复制代码
      docker compose build
    • 启动服务

      bash 复制代码
      docker-compose up       # 在前台启动服务,可以看到日志输出,方便调试。
      docker-compose up -d    # 在后台启动服务,并让其以后台模式运行。
    • 首次启动时构建镜像
      build 指令 将强制重新构建这些服务的镜像。即使已经存在本地镜像,也会根据 Dockerfile 重新构建。

      bash 复制代码
      docker-compose up --build -d
    • 强制重新构建服务镜像
      强制重新构建服务镜像,即使这些镜像已经存在。这确保了所有最新的代码更改和依赖项都被包含在新镜像中。

      bash 复制代码
      docker-compose up -d --build --force-recreate
  5. 验证服务状态

    • 查看服务状态
      验证服务是否正常启动

      bash 复制代码
      docker-compose ps
    • 查看日志输出

      bash 复制代码
      docker-compose logs -f
  6. 健康检查与测试

    • 确保服务按照预期工作。对于 Web 服务,可以通过浏览器或 curl 访问应用;对于数据库等服务,可以通过客户端工具连接并执行查询。
      测试 API 或 Web 应用: 打开浏览器或使用命令行工具访问服务端口(例如,如果你映射了 3000 端口,可以访问 http://localhost:3000)。

      bash 复制代码
      # 测试服务是否正常工作
      curl http://localhost:3000
  7. 重启容器

    • 停止并重新启动所有服务
      如果想停止所有服务然后重新启动它们,可以使用以下命令。这个命令会先停止所有的服务,然后再启动它们。这对于需要重启整个应用堆栈的情况非常有用。

      bash 复制代码
      docker compose restart
    • 仅重启特定的服务
      如果只想重启某个特定的服务(例如 oneapi),可以指定服务名称:

      bash 复制代码
      docker-compose restart oneapi
    • 完全停止并重新创建容器
      若需要完全停止并重新创建容器,这可以通过 down 和 up 命令的组合来实现。这通常用于在更改了配置文件或镜像后确保所有更改生效。

      bash 复制代码
      # 停止并移除所有服务容器、网络及卷
      docker-compose down
      
      # 构建并启动服务,在后台运行
      docker-compose up -d --build
相关推荐
习惯就好zz5 小时前
WSL2 安装Ubuntu卡在安装进度0%无响应问题解决
linux·windows·ubuntu·wsl·wsl2
躲猫猫的喵喵6 小时前
Ubuntu2204降内核版本
linux·运维·服务器·ubuntu
HIT_Weston8 小时前
18、【Ubuntu】【远程开发】技术方案分析:私网ip掩码
linux·tcp/ip·ubuntu
天一生水water10 小时前
ubuntu使用毫秒镜像方式安装docker mysql
ubuntu·阿里云·docker
虚伪的空想家12 小时前
华为A800I A2 arm64架构鲲鹏920cpu的ubuntu22.04 tls配置直通的grub配置
ubuntu·华为·架构·虚拟化·kvm·npu·国产化适配
祎直向前12 小时前
在Ubuntu中安装并配置ssh
linux·ubuntu·ssh
Qayrup13 小时前
docker 搭建私有仓库,推送并拉取
运维·docker·容器
郭庆汝13 小时前
docker拉取英伟达官方cuda11.8镜像
docker·cuda11.8
天下不喵15 小时前
Ubuntu24.04安装Docker过程记录
docker
冷血~多好16 小时前
使用docker部署elk,实现日志追踪
elk·docker·容器