【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 && \## 删除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 --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. 查看容器状态
    • 列出所有正在运行的容器
      docker ps
      
    • 列出所有容器(包括已停止的)
      docker ps -a
      
    • 查看容器详细信息
      docker inspect my_demo_container
      
    • 查看容器运行日志
      docker logs 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
      
      若要查看容器中的pytorch版本,在上面命令基础上,再运行
      python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
      
  6. 删除容器
    • 移除某个容器
      docker restart my_demo_container
      
    • 强制删除容器
      如果需要强制删除一个正在运行的容器,可以加上 -f 参数:
      docker rm -f my_demo_container
      
    • 清理停止的容器
      当有很多已经停止的容器时,可以使用以下命令来清理它们:
      docker rm -f my_demo_container
      
      以上命令会提示你确认是否要移除所有已经停止的容器。如果你不想看到提示,可以直接添加 -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 的使用

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | 🐍 蛇年运势预测 在线体验地址:蛇年…

【转帖】eclipse-24-09版本后,怎么还原原来版本的搜索功能

【1】原贴地址:eclipse - 怎么还原原来版本的搜索功能_eclipse打开类型搜索类功能失效-CSDN博客 https://blog.csdn.net/sinat_32238399/article/details/145113105 【2】原文如下: 更新eclipse-24-09版本后之后,新的搜索功能(CT…

求平均年龄(信息学奥赛一本通-1059)

【题目描述】 班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。 【输入】 第一行有一个整数n(1≤n≤100),表示学生的人数。其后n行每行有…

macos的图标过大,这是因为有自己的设计规范

苹果官方链接:App 图标 | Apple Developer Documentation 这个在官方文档里有说明,并且提供了sketch 和 ps 的模板。 figma还提供了模板: Figma

C++ —— 智能指针 unique_ptr (上)

C —— 智能指针 unique_ptr (上) 普通指针的不足普通指针的释放智能指针智能指针 unique_ptr智能指针初始化错误用法get()方法返回裸指针智能指针不支持指针的运算(、-、、- -) 普通指针的不足 new和new [] 的内存需要用delete和…

C++异步future

🌎 C11异步futrue 文章目录: C11异步futrue future介绍     应用场景     future操作       std::async函数模版       std::packaged_task类模版       std::promise类模版 🚀future介绍 std::future是C11标准库…

# AI绘图中的Embedding、CLIP、Flux中的Clip与LCM SDXL加速生成解析

AI绘图中的Embedding、CLIP、Flux中的Clip与LCM SDXL加速生成解析 在现代AI绘图和深度学习中,涉及了多个复杂的概念和技术,这些技术在图像生成、训练加速以及多模态学习等方面起着至关重要的作用。在这篇博客中,我们将讨论几个关键概念&…

linux下jsoncpp编译

折腾了一顿,我使用ubuntu16.04编译的jsoncpp,由于使用的芯片工程需要16.04,无法使用最新的ubuntu系统。 发现jsoncpp编译时, CMake Error: Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly. …

洛谷 P2846 [USACO08NOV] Light Switching G C语言

题目描述 Farmer John tries to keep the cows sharp by letting them play with intellectual toys. One of the larger toys is the lights in the barn. Each of the N(2≤N≤105) cow stalls conveniently numbered 1…N has a colorful light above it. At the beginnin…

批量创建ES索引

7.x from elasticsearch import Elasticsearch# 配置 Elasticsearch 连接 # 替换为你的 Elasticsearch 地址、端口、用户名和密码 es Elasticsearch([http://10.10.x.x:43885],basic_auth(admin, XN272G9THEAPYD5N5QORX3PB1TSQELLB) )# # 测试连接 # try: # # 尝试获取集…

大厂案例——腾讯蓝鲸DevOps类应用的设计与实践

蓝鲸体系架构图 蓝鲸CICD应用功能架构 降低DEVOPS门槛—开发者中心 CICD应用需要的后台服务 系列阅读 12306亿级流量架构分析(史上最全)实现电商平台从业务到架构的治理体系基于主数据驱动的数据治理什么时候需要分表分库?-CSDN博客

React和Vue有什么区别,如何选择?

React和Vue有什么区别,如何选择? React 和 Vue 是当前最受欢迎的前端框架之一,两者在开发者中都有极高的声誉。它们都旨在帮助开发人员构建用户界面,但在实现方式和适用场景上有所不同。如果你正考虑在项目中选择 React 或 Vue&a…

Unity环境搭建

在Unity中开发环境搭建的步骤如下: 1. 安装Unity 访问 Unity官网,并下载并安装Unity Hub。Unity Hub是一个用于管理Unity安装版本、项目和组件的工具。安装Unity Hub后,打开Unity Hub,登录您的Unity账号或创建一个新账号。在Uni…

ray.rllib 入门实践-5: 训练算法

前面的博客介绍了ray.rllib中算法的配置和构建,也包含了算法训练的代码。 但是rllib中实现算法训练的方式不止一种,本博客对此进行介绍。很多教程使用 PPOTrainer 进行训练,但是 PPOTrainer 在最近的 ray 版本中已经取消了。 方式1&#xff1…

uart、iic、spi通信总线

一、uart uart一种异步串行通信协议,用于在两个设备之间传输数据。它将数据按位发送,不需要时钟信号进行同步。在uart通信中,数据通过两根线路传输:发送线(TX)和接收线(RX)。它主要用…

LMI Gocator GO_SDK VS2019引用配置

LMI SDK在VS2019中的引用是真的坑爹,总结一下经验,希望后来的人能少走弯路.大致内容如下: (1) 环境变量 (2)C/C 附加包含目录 E:\GWQ\Gocator\GO_SDK\Gocator\GoSdk E:\GWQ\Gocator\GO_SDK\Platform\kApi (3&#…

QT QTableWidget控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

C# OpenCV机器视觉:红外体温检测

在一个骄阳似火的夏日,全球却被一场突如其来的疫情阴霾笼罩。阿强所在的小镇,平日里熙熙攘攘的街道变得冷冷清清,人们戴着口罩,行色匆匆,眼神中满是对病毒的恐惧。阿强作为镇上小有名气的科技达人,看着这一…

12、MySQL锁相关知识

目录 1、全局锁和表锁使用场景 2、行锁的意义 3、为什么说间隙锁解决了快照的幻读? 4、RR隔离级别产生幻读的场景 5、详解元数据锁(MDL)作用以及如何减少元数据锁 6、出现死锁场景 7、查看MySQL锁情况 8、自增锁 1、全局锁和表锁使用场景 全局锁 备份数据库:当需要…

立创开发板入门ESP32C3第八课 修改AI大模型接口为deepseek3接口

#原代码用的AI模型是minimax的API接口,现在试着改成最热门的deepseek3接口。# 首先按理解所得,在main文件夹下,有minimax.c和minimax.h, 它们是这个API接口的头文件和实现文件,然后在main.c中被调用。所以我们一步步更改。 申请…