【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 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 的使用

  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.rhkb.cn/news/10937.html

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

相关文章

新能源算力战争:为什么AI大模型需要绿色数据中心?

新能源算力战争:为什么AI大模型需要绿色数据中心? 近年来,人工智能(AI)大模型的爆发式增长正在重塑全球科技产业的格局。以GPT-4、Gemini、Llama等为代表的千亿参数级模型,不仅需要海量数据训练,更依赖庞大的算力支撑。然而,这种算力的背后隐藏着一个日益严峻的挑战——…

Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)

目录 前言1. 基本知识2. Demo3. 实战代码 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全&am…

unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等

目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景,仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…

【Android】布局文件layout.xml文件使用控件属性android:layout_weight使布局较为美观,以RadioButton为例

目录 说明举例 说明 简单来说,android:layout_weight为当前控件按比例分配剩余空间。且单个控件该属性的具体数值不重要,而是多个控件的属性值之比发挥作用,例如有2个控件,各自的android:layout_weight的值设为0.5和0.5&#xff0…

hot100_21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2 [] 输出:[…

4 [危机13小时追踪一场GitHub投毒事件]

事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…

Spring Boot项目中解决跨域问题(四种方式)

目录 一,跨域产生的原因二,什么情况下算跨域三,实际演示四,解决跨域的方法 1,CrossOrigin注解2,添加全局过滤器3,实现WebMvcConfigurer4,Nginx解决跨域5,注意 开发项目…

浅析DNS污染及防范

DNS污染(DNS Cache Poisoning)是一种网络攻击手段,通过篡改DNS服务器的缓存数据,将域名解析结果指向错误的IP地址,从而误导用户访问恶意网站或无法访问目标网站。这种攻击利用了DNS协议的特性,例如“只认第…

五. Redis 配置内容(详细配置说明)

五. Redis 配置内容(详细配置说明) 文章目录 五. Redis 配置内容(详细配置说明)1. Units 单位配置2. INCLUDES (包含)配置3. NETWORK (网络)配置3.1 bind(配置访问内容)3.2 protected-mode (保护模式)3.3 port(端口)配置3.4 timeout(客户端超时时间)配置3.5 tcp-keepalive()配置…

单细胞分析基础-第一节 数据质控、降维聚类

scRNA_pipeline\1.Seurat 生物技能树 可进官网查询 添加链接描述 分析流程 准备:R包安装 options("repos"="https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packages("BiocManager",update = F,ask =…

Qt常用控件 输入类控件

文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1,录入用户信息1.4 例子2,正则验证手机号1.5 例子3,验证输入的密码1.6 例子4,显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1,获取输入框的内容2.4 例…

大模型培训讲师老师叶梓分享:DeepSeek多模态大模型janus初探

以下视频内容为叶梓分享DeepSeek多模态大模型janus的部署,并验证其实际效果,包括图生文和文生图两部分。 叶梓老师人工智能培训分享DeepSeek多模态大模型janus初探 DeepSeek 的多模态大模型 Janus 是一款强大的 AI 模型,专注于图像和文本的多…

Linux系统上安装与配置 MySQL( CentOS 7 )

目录 1. 下载并安装 MySQL 官方 Yum Repository 2. 启动 MySQL 并查看运行状态 3. 找到 root 用户的初始密码 4. 修改 root 用户密码 5. 设置允许远程登录 6. 在云服务器配置 MySQL 端口 7. 关闭防火墙 8. 解决密码错误的问题 前言 在 Linux 服务器上安装并配置 MySQL …

17.2 图形绘制7

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 17.2.9 字体 17.2.9.1 Font类 Font类定义特定的文本格式,包括字体、字号和样式特性。 Font常用属性: Na…

浅析DDOS攻击及防御策略

DDoS(分布式拒绝服务)攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求,耗尽其资源,从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性,使攻击规模更大、影响范围更广…

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…

HarmonyOS NEXT:保存应用数据

用户首选项使用 用户首选项的特点 数据体积小、访问频率高、有加载速度要求的数据如用户偏好设置、用户字体大小、应用的配置参数。 用户搜选项&#xff08;Preferences&#xff09;提供了轻量级配置数据的持久化能力&#xff0c;支持订阅数据变化的通知能力。不支持分布式同…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

OVS-DPDK

dpdk介绍及应用 DPDK介绍 DPDK&#xff08;Data Plane Development Kit&#xff09;是一组快速处理数据包的开发平台及接口。有intel主导开发&#xff0c;主要基于Linux系统&#xff0c;用于快速数据包处理的函 数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…