【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
指令在镜像中执行命令,如安装软件包、配置环境等。- 复制文件:使用
COPY
或ADD
指令将文件从宿主机复制到镜像中。- 设置环境变量:使用
ENV
指令设置环境变量。- 暴露端口:使用
EXPOSE
指令声明容器监听的端口。- 启动命令:使用
CMD
或ENTRYPOINT
指令指定容器启动时执行的命令。- 记录一个实际工程的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,以此为例,相关操作命令如下。
- 镜像的创建
- 【基于现有镜像创建】
基于远程仓库中已有的 DEMO:v1.0 镜像来创建本地副本docker pull DEMO:v1.0
- 【构建新的镜像】
通过 Dockerfile 构建一个新的 DEMO:v1.0 镜像这里的 . 表示当前目录为上下文路径,Docker 会在这个路径下寻找 Dockerfile 来构建镜像docker build -t DEMO:v1.0 .
- 镜像的查询
- 【列出所有本地镜像】
要查看包括 DEMO:v1.0 在内的所有本地镜像docker images
- 【检查特定镜像详情】
为了获取 DEMO:v1.0 的详细信息docker inspect DEMO:v1.0
- 镜像的删除
- 【如果该镜像正在被某个容器使用,你需要先停止并移除那个容器,或者使用 -f 参数强制删除】
docker rmi -f DEMO:v1.0
- 【删除无标签镜像(悬空镜像)】
有时构建了多个镜像时,可能会留下一些没有标签的镜像,即悬空镜像。可以使用以下命令来清理它们:上命令中的 -f 参数用于强制执行操作,不需要用户确认。在执行任何删除或修改操作之前,请确保你已经备份了重要数据,并且了解每个命令的影响。docker image prune -f
- 【清理无用的镜像、容器、网络、卷】
docker system prune
3 容器的相关命令
- 基于镜像 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 会尝试拉取或使用这个镜像来创建并启动新的容器。- 查看容器状态
- 【列出所有正在运行的容器】
docker ps
- 【列出所有容器(包括已停止的)】
docker ps -a
- 【查看容器详细信息】
docker inspect my_demo_container
- 【查看容器运行日志】
docker logs my_demo_container
- 停止容器
- 要停止一个正在运行的容器,可以使用它的名称或ID
docker stop my_demo_container
- 重启容器
- 要重启一个已经停止的容器,同样可以使用它的名称或ID
docker restart my_demo_container
- 进入正在运行的容器
- 如果需要进入一个已经在运行的容器,可以使用 exec 命令。这将在不中断容器服务的情况下为你提供一个交互式的 shell。
若要查看容器中的pytorch版本,在上面命令基础上,再运行docker exec -it my_demo_container /bin/bash
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"
- 删除容器
- 【移除某个容器】
docker rm my_demo_containe
- 【强制删除容器】
如果需要强制删除一个正在运行的容器,可以加上 -f 参数:docker rm -f my_demo_container
- 【清理停止的容器】
当有很多已经停止的容器时,可以使用以下命令来清理它们:以上命令会提示你确认是否要移除所有已经停止的容器。如果你不想看到提示,可以直接添加 -f 或者 --force 参数。docker container prune
- 修改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 的使用
- 创建 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
oneapi
服务名称。container_name: oneapi
容器名称。 明确指定了启动的容器将被命名为 oneapi。这有助于直接通过名称管理容器。image: justsong/one-api:latest
镜像。使用了特定的镜像,并使用 latest 标签。建议在生产环境中指定具体的版本标签而不是 latest,以避免意外拉取到不兼容的新版本。restart: unless-stopped
重启策略。设置了容器的重启策略为 unless-stopped,这意味着除非手动停止,否则容器会自动重启,包括系统重启后。network_mode: bridge
网络模式。使用默认的桥接网络模式。这是大多数情况下推荐的选择,因为它提供了良好的隔离性和灵活性。ports
端口映射。将主机的 3000 端口映射到容器内的 3000 端口。这允许外部访问运行在容器内的服务。volumes
卷挂载。挂载了主机路径 /opt/ai-platform/lldataset/240/containerd/oneapi/data 到容器内的 /data 目录。这对于持久化数据或共享文件非常重要。environment
环境变量。设置了时区环境变量 TZ=Asia/Shanghai,确保容器内的应用程序使用正确的时区设置。- 验证配置文件
启动服务之前,来检查和解析配置文件,这将帮助发现任何潜在的问题。docker compose config
- 准备环境
确保所有依赖项都已准备好,比如:
- 数据库或其他外部服务是否已经启动并可以访问。
- 如果有 .env 文件,确保它已经创建并且包含所有必要的环境变量。
- 确认主机上的目录(如卷挂载点 /opt/ai-platform/lldataset/240/containerd/oneapi/data)存在并且权限正确。
- 镜像的构建与服务的启动
- 【构建镜像】
docker-compose build
- 【启动服务】
docker-compose up # 在前台启动服务,可以看到日志输出,方便调试。 docker-compose up -d # 在后台启动服务,并让其以后台模式运行。
- 【首次启动时构建镜像】
build 指令 将强制重新构建这些服务的镜像。即使已经存在本地镜像,也会根据 Dockerfile 重新构建。docker-compose up --build -d
- 【强制重新构建服务镜像】
强制重新构建服务镜像,即使这些镜像已经存在。这确保了所有最新的代码更改和依赖项都被包含在新镜像中。docker-compose up -d --build --force-recreate
- 验证服务状态
- 【查看服务状态】
验证服务是否正常启动docker-compose ps
- 【查看日志输出】
docker-compose logs -f
- 健康检查与测试
- 确保服务按照预期工作。对于 Web 服务,可以通过浏览器或 curl 访问应用;对于数据库等服务,可以通过客户端工具连接并执行查询。
测试 API 或 Web 应用: 打开浏览器或使用命令行工具访问服务端口(例如,如果你映射了 3000 端口,可以访问 http://localhost:3000)。# 测试服务是否正常工作 curl http://localhost:3000
- 重启容器
- 【停止并重新启动所有服务】
如果想停止所有服务然后重新启动它们,可以使用以下命令。这个命令会先停止所有的服务,然后再启动它们。这对于需要重启整个应用堆栈的情况非常有用。docker-compose restart
- 【仅重启特定的服务】
如果只想重启某个特定的服务(例如 oneapi),可以指定服务名称:docker-compose restart oneapi
- 【完全停止并重新创建容器】
若需要完全停止并重新创建容器,这可以通过 down 和 up 命令的组合来实现。这通常用于在更改了配置文件或镜像后确保所有更改生效。# 停止并移除所有服务容器、网络及卷 docker-compose down# 构建并启动服务,在后台运行 docker-compose up -d --build
相关文章:
【Docker】ubuntu中 Docker的使用
之前记录了 docker的安装 【环境配置】ubuntu中 Docker的安装; 本篇博客记录Dockerfile的示例,docker 的使用,包括镜像的构建、容器的启动、docker compose的使用等。 当安装好后,可查看docker的基本信息 docker info ## 查…...

【数据结构篇】时间复杂度
一.数据结构前言 1.1 数据结构的概念 数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构, 如:…...
linux 环境安装 dlib 的 gpu 版本
默认使用 pip 安装的 dlib 是不使用 gpu 的 在国内社区用百度查如何安装 gpu 版本的 dlib 感觉信息都不太对,都是说要源码编译还有点复杂 还需要自己安装 cuda 相关的包啥的,看着就头大 于是想到这个因该 conda 自己就支持了吧,然后查了一下…...

springboot集成钉钉,发送钉钉日报
目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api,主要用到以下几个api: ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…...
【机器学习】自定义数据集 使用scikit-learn中svm的包实现svm分类
一、支持向量机(support vector machines. ,SVM)概念 1. SVM 绪论 支持向量机(SVM)的核心思想是找到一个最优的超平面,将不同类别的数据点分开。SVM 的关键特点包括: ① 分类与回归: SVM 可以用于分类&a…...
快速提升网站收录:利用网站历史数据
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/38.html 利用网站历史数据可以有效提升网站的收录速度,以下是一些具体的策略和方法: 一、理解网站历史数据的重要性 网站历史数据记录了网站过去的运营情况、用户行…...

【Git】初识Git Git基本操作详解
文章目录 学习目标Ⅰ. 初始 Git💥注意事项 Ⅱ. Git 安装Linux-centos安装Git Ⅲ. Git基本操作一、创建git本地仓库 -- git init二、配置 Git -- git config三、认识工作区、暂存区、版本库① 工作区② 暂存区③ 版本库④ 三者的关系 四、添加、提交更改、查看提交日…...

Python NumPy(11):NumPy 排序、条件筛选函数
1 NumPy 排序、条件筛选函数 NumPy 提供了多种排序的方法。 这些排序函数实现不同的排序算法,每个排序算法的特征在于执行速度,最坏情况性能,所需的工作空间和算法的稳定性。 下表显示了三种排序算法的比较。 种类速度最坏情况工作空间稳定性…...

AJAX综合案例——图书管理
黑马程序员视频地址: AJAX-Day02-10.案例_图书管理AJAX-Day02-10.案例_图书管理_总结_V1.0是黑马程序员前端AJAX入门到实战全套教程,包含学前端框架必会的(ajaxnode.jswebpackgit),一套全覆盖的第25集视频,…...

JDK自带工具解析与生产问题定位指南(一)
1. 引言 Java开发工具包(JDK)内置了强大的诊断工具集,用于监控、分析和调试Java应用程序。这些工具涵盖了从进程管理、内存分析到性能监控的各个方面。本文将介绍一些最常用的Java开发工具,包括jps、jmap、jstat、jcmd、jstack、…...

FPGA 使用 CLOCK_DEDICATED_ROUTE 约束
使用 CLOCK_DEDICATED_ROUTE 约束 CLOCK_DEDICATED_ROUTE 约束通常在从一个时钟区域中的时钟缓存驱动到另一个时钟区域中的 MMCM 或 PLL 时使 用。默认情况下, CLOCK_DEDICATED_ROUTE 约束设置为 TRUE ,并且缓存 /MMCM 或 PLL 对必须布局在相同…...
《解锁AI黑科技:数据分类聚类与可视化》
在当今数字化时代,数据如潮水般涌来,如何从海量数据中提取有价值的信息,成为了众多领域面临的关键挑战。人工智能(AI)技术的崛起,为解决这一难题提供了强大的工具。其中,能够实现数据分类与聚类…...
Java小白入门教程:Object
目录 一、定义 二、作用 三、使用场景 四、语法以及示例 1、创建Object类型的对象 2、使用 toString()方法 3、使用 equals()方法 4、使用 hashCode()方法 5、使用 getClass()方法 6、使用 clone()方法 7、使用 finalize()方法 一、定义 在Java中, object…...

记6(人工神经网络
目录 1、M-P神经元2、感知机3、Delta法则4、前馈型神经网络(Feedforward Neural Networks)5、鸢尾花数据集——单层前馈型神经网络:6、多层神经网络:增加隐含层7、实现异或运算(01、10为1,00、11为0)8、线性…...

stm32硬件实现与w25qxx通信
使用的型号为stm32f103c8t6与w25q64。 STM32CubeMX配置与引脚衔接 根据stm32f103c8t6引脚手册,采用B12-B15四个引脚与W25Q64连接,实现SPI通信。 W25Q64SCK(CLK)PB13MOSI(DI)PB15MISO(DO)PB14CS(…...

编程题-最接近的三数之和
题目: 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 解法一(排序双指针): 题目要求找…...

索引的底层数据结构、B+树的结构、为什么InnoDB使用B+树而不是B树呢
索引的底层数据结构 MySQL中常用的是Hash索引和B树索引 Hash索引:基于哈希表实现的,查找速度非常快,但是由于哈希表的特性,不支持范围查找和排序,在MySQL中支持的哈希索引是自适应的,不能手动创建 B树的…...

【工欲善其事】利用 DeepSeek 实现复杂 Git 操作:从原项目剥离出子版本树并同步到新的代码库中
文章目录 利用 DeepSeek 实现复杂 Git 操作1 背景介绍2 需求描述3 思路分析4 实现过程4.1 第一次需求确认4.2 第二次需求确认4.3 第三次需求确认4.4 V3 模型:中间结果的处理4.5 方案验证,首战告捷 5 总结复盘 利用 DeepSeek 实现复杂 Git 操作 1 背景介绍…...

网络编程套接字(中)
文章目录 🍏简单的TCP网络程序服务端创建套接字服务端绑定服务端监听服务端获取连接服务端处理请求客户端创建套接字客户端连接服务器客户端发起请求服务器测试单执行流服务器的弊端 🍐多进程版的TCP网络程序捕捉SIGCHLD信号让孙子进程提供服务 …...
前端学习-事件委托(三十)
目录 前言 课前思考 for循环注册事件 语法 事件委托 1.事件委托的好处是什么? 2.事件委托是委托给了谁,父元素还是子元素 3.如何找到真正触发的元素 示例代码 总结 前言 才子佳人,自是白衣卿相 课前思考 1.如果同时给多个元素注册事件&…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...