当前位置: 首页 > news >正文

4、docker 容器

docker 容器

本章要点:docker容器启动、停止、删除、创建以及部分使用命令,容器导入导出

容器是镜像的一个运行实例,所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境、其它系统环境)和跑在上面的应用 ,那么Docker容器就是独立运行的一个(或一组)应用 ,以及它们必需的运行环境。总结:Docker 容器是轻量级、可移植的虚拟化单元,基于镜像运行,通过隔离环境实现“一次封装,到处运行”

容器启动

启动容器有二种方式,一种是基于镜像新建一个容器并启动,一种是将在终止状态( stopped )的容器重新启动,

  • 启动原理说明

    当利用docker run来创建并启动docker时,Docker在后台运行的标准操作为:

    • 检查本地是否存在指定镜像,不存在就从公有仓库下载
    • 利用镜像创建一个容器,并启动该容器;
    • 分配 一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
    • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
    • 从网桥的地址池配置一个IP地址给容器;
    • 执行用户指定的应用程序;
    • 执行完毕后容器被自动终止。
  • 容器使用关键操作 - 先来个总结步骤

    操作目标命令示例说明
    拉取镜像docker pull ubuntu:20.04从仓库下载指定版本镜像,默认从 Docker Hub 获取
    启动容器(后台)docker run -d --name mynginx nginx-d 后台运行,--name 指定容器名,nginx 为镜像名
    进入容器docker exec -it mynginx /bin/bash-it 交互模式,mynginx 为容器名,/bin/bash 为执行命令
    查看容器列表docker ps -a-a 显示所有状态容器(默认仅运行中)
    停止/删除容器docker stop mynginx / docker rm mynginx停止后需手动删除,删除前确保容器已停止
  • 启动示例

    使用语法: docker run 参数 镜像名称:tag 常用几个参数如下

    • 常用参数如下

      参数说明
      -i保持和 docker 容器内的交互,启动容器时,运⾏的命令结束后,
      容器依然存活,没有退出(默认是会退出,即停⽌的)
      -t为容器的标准输⼊虚拟⼀个tty
      -d后台运⾏容器
      –rm容器在启动后,执⾏完成命令或程序后就销毁
      –name给容器起⼀个⾃定义名称
      -p宿主机:内部端口
    • 使用示例

      • 会运行在前台,如果ctrl+c会直接退出,没有指定-p也无法访问

        docker run -it 镜像名称|镜像tag|id
        
      • 容器端口映射可通过 -p hostPort:containerPort 实现,如 docker run -p 8080:80 nginx 将容器 80 端口映射到主机 8080 端口

        docker run -it -p 8080:8080 镜像名称|镜像tag|id
        
      • 运行后台,指定端口

        docker run -itd -p 8080:8080 edf8233555ae
        8132038b18bc24c27eb322f79f33113ee652871a5e785453981b341c9dd64118# 也可以通过 docker ps 查看 ,  如果使用 docker ps -a 可以看到上面运行前台ctrl+c结束后stop的容器
        ~]# docker ps 
        CONTAINER ID   IMAGE          COMMAND             CREATED          STATUS          PORTS                    NAMES
        8132038b18bc   edf8233555ae   "catalina.sh run"   52 seconds ago   Up 46 seconds   0.0.0.0:8080->8080/tcp   xenodochial_wescoff
        
      • 用完就删,ctrl+c 之后通过docker ps -a也查看不到状态

        docker run --rm 镜像名称|镜像tag|id
        
      • 启动停止后的全部容器

        # 注意 如果指定了端口 -p,地址冲突会导致起不来
        docker start $(docker ps -a -q)
        

容器停止

  • 停止单个

    docker stop id号
    
  • 停止全部

    docker stop $(docker ps -a -q)
    

容器删除

⚠️ 运行中的容器无法被删除,需要先stop

  • 原理说明

    • 如果有多个TAG的则只会删除tag, 否则就会直接删除这个镜像所有层
    • docker rm -f ID 强制删除镜像
    • docker -l ID 删除容器的连接,但保留容器
  • 使用示例

    • 删除单个

      docker stop id号|或者指定的 --name名称
      docker rm id号|或者指定的 --name名称# 或者, 强制干掉
      docker rm -f id号|或者指定的 --name名称
      
    • 删除全部

      docker stop $(docker ps -a -q)    # 停止全部的运行中容器
      docker rm $(docker ps -a -q)      # 删除
      

进入容器

⚠️ 容器是一个最小化阉割的操作系统,进去之后很多命令是没有的

  • 附加容器: docker attr, 同时只能查看一个容器,当执行A时,B会阻塞

  • docker exec

    -i                      : 打开标准输入接受用户输入命令,默认为false
    --privileged=true|false : 是否给执行命令以最高权限,默认false
    -t                      : 分配伪终端,默认为false
    -u                      : 执行命令的用户名或IDdocker exec -it 容器ID /bin/bash  在不影响容器内其它应用的前提下,用户可以很容器与容器进行交互
    

容器导入\导出

  • 导出容器: docker export

     ~]# docker ps 
    CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
    0da5b23e3008   ubuntu    "/bin/bash"   12 minutes ago   Up 12 minutes fervent_ptolemy~]# docker export -o ubuntu_start.tar 0da
    [root@docker-test ~]# ll -h
    -rw-------  1 root root  72M 56 11:18 ubuntu_start.tar
    
  • 导入容器: docker import

    ~]# docker import ubuntu_start.tar test:v0.1sha256:e8dbb87af2a114651fbad4657a6835c1907b9a1e9141bae902197c6267b993f1~]# docker imagesREPOSITORY   TAG       IMAGE ID       CREATED         SIZEtest         v0.1      e8dbb87af2a1   4 seconds ago   72.7MB# 也可以直接使用 docker load 进行导入
    
  • import 与load导入的区别

    • Docker中import和load是两种导入命令,前者导入容器快照生成新镜像(丢失历史和元数据),后者加载完整镜像文件(保留分层和配置),核心差异体现在数据保留和使用场景

    • 操作对象与命令格式

      维度importload
      操作对象容器导出的tar文件(export产物)镜像保存的tar文件(save产物)
      导入命令docker import 文件名.tar 新镜像名:标签docker load -i 文件名.tar
      重命名支持可指定新镜像名和标签不可重命名,需导入后手动tag
    • 数据保留差异

      • import(仅保留文件系统)
        ❌ 丢失镜像历史层:无法查看构建过程(如RUN、COPY指令)。
        ❌ 丢失元数据:环境变量、启动命令(CMD/ENTRYPOINT)、端口映射等配置不保留1。
        ✅ 文件体积小:仅导出容器当前状态的单层文件系统。
      • load(保留完整镜像)
        ✅ 保留分层结构:支持回滚到历史版本
        ✅ 保留元数据:标签、作者信息、启动命令等完整恢复
        ❌ 文件体积大:包含所有镜像层数据
    • 适用场景对比

      场景需求推荐命令原因分析
      快速备份容器文件状态import轻量级快照,适合调试后环境备份
      迁移完整镜像(含配置)load保留元数据,确保导入后可直接运行
      制作基础镜像import精简历史层,减少冗余体积
      批量迁移多个镜像load支持一次性打包多个镜像到单个文件

容器其它命令

  1. ps --> container ls 查看正在运行的容器

  2. docker container run 容器名称

  3. docker kill 名称 kill正在运行的容器

  4. docker container pause id\名称 --> 暂停

  5. docker container top id\名称 查看资源排行

     ~]# docker top  id\名称
    UID    PID     PPID   TTY     TIME     CMD
    root   20390   20370  pts/0   00:00:00 nginx: master process nginx -g daemon off;
    
  6. docker container create\stop\start\status 镜像

  7. docker logs 容器 如果添加了 -d 的参数 可以使用log来获取容器的日志

    • 原理示意图

      请添加图片描述

    • 使用参数

      参数说明
      –since此参数指定了输出日志开始日期,即只输出指定日期之后的日志
      -f查看实时日志
      -t查看日志产生的日期
      –tail=10 或 -n 10查看最后的10条日志
      qfjy_exam容器名称
    • 使用示例

      • 指定时间

        docker logs --since "2025-10-09"  容器名/id
        
      • 查看实时

        docker logs -f 容器名/id
        
      • 查看最后多少条

        docker logs -n 10 容器名/id
        

容器间交换文件

docker cp命令用于容器与主机间复制文件/目录,支持运行或停止的容器,需指定源路径和目标路径,并注意路径格式与限制,使用格式如下

  • 基础语法

    容器 → 主机:  docker cp [OPTIONS] 容器:SRC_PATH DEST_PATH
    主机 → 容器:  docker cp [OPTIONS] SRC_PATH 容器:DEST_PATH
    
  • 常用选项

    选项说明
    -L跟随源路径中的符号链接(复制链接指向的实际文件)
    -a保留文件原始属性(所有者、权限等)
    -p保留源文件时间戳
  • 使用示例

    1. 主机复制文件到容器

      # 将本机的index.html文件复制到 ROOT目录下,如果加了-p 就能直接访问页面
      ~]# docker cp index.html tomcat1:/usr/local/tomcat/webapps/ROOT/
      Successfully copied 2.05kB to tomcat1:/usr/local/tomcat/webapps/ROOT/
      
    2. 容器复制目录到主机

      # 将容器的index.html复制到本机
      ~]# docker cp tomcat1:/usr/local/tomcat/webapps/ROOT/index.html .
      Successfully copied 2.05kB to /root/.
      
    3. 一两个文件临时更新可以用这个测试,更多的还是推荐使用存储卷

容器创建

用的少,直接用dockerfile

  • 新建容器 docker craete

    • create 命令与容器运行模式相关的选项

      # -------------- 使用比较多的 --------------
      --rm=true | false              : 容器退出后是否自动删除,不能跟-d同时使用
      -d,--detach=true| false       : 是否在后台运行容器,默认为否
      --expose= []                   : 设定容器会暴露出来的端口或端口范围
      -P,--publish-all=true | false : 通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口
      -p, --publish=[]              : 定如何映射到本地主机端口,例如-p 11234-12234:1234-2234
      --restart= "no"                : 容器的重启策略,包括no、on- failure[:max-retry]、always、unless- stopped等
      -t,--tty=true | false         : 否分配-一个伪终端,默认为false
      --net= "bridge"               : 指定容器网络模式,包括bridge、none、 其他容器内网络、host 的网络或某个现有网络等# -------------- 第二梯队,可能会使的 --------------
      -v| --volume=""               : 挂载主机上的文件卷到容器内
      --volume-driver=""            : 挂载文件卷的驱动类型
      --volumes-from= []            : 从其他容器挂载卷
      -W,--workdir=""              : 容器内的默认工作目录
      --entrypoint=""               : 像存在人口命令时,覆盖为新的命令
      --uts=host                    : 容器的utS命名空间
      --tmpfs= []                   : 挂载临时文件系统到容器# -------------- 第三梯队, 使用可能性低的 --------------
      -a,--attach= []               : 是否绑定到标准输人、输出和错误
      --detach-keys=""               : 从attach模式退出的快捷键
      --group-add= []                : 运行容器的用户组
      -i,-- interactive=true| false : 保持标准输人打开,默认为false
      --ipc=""                       : 容器IPC命名空间,可以为其他容器或主机
      --isolation= "default"        : 容器使用的隔离机制
      --log-driver= "json-file"     : 指定容器的日志驱动类型,可以为json-file、syslog、journald、gelf、fluentd、awslogs、splunk、etwlogs、gcplogs或none
      --log-opt=[]                   : 传递给日志驱动的选项
      --net-alias= []                : 容器在网络中的别名
      --pid=host                     : 容器的PID命名空间
      
    • create命令与容器环境和配置相关的选项

      # 使用比较多的参数
      --name=""           : 指定容器的别名
      --dns= []           : 自定义的DNS服务器
      -e,--env= []       : 指定容器内环境变量
      --env-file= []      : 从文件中读取环境变量到容器内
      --link= [名称或ID]  : 链接到其他容器# 不怎么使用的
      --add-host= []      : 在容器内添加一个 主机名到IP地址的映射关系(通过/etc/hosts 文件)
      --device= []        : 映射物理机上的设备到容器内
      --dns-search= []    : DNS搜索域
      --dns-opt= []       : 自定义的DNS选项
      -h,--hostname=""   : 指定容器内的主机名
      --ip=""             : 指定容器的IPv4地址
      --ip6=""            : 指定容器的IPv6地址
      --link-local-ip=[]: : 容器的本地链接地址列表
      --mac-address=""    : 指定容器的Mac地址
      
    • create命令与容器资源限制和安全保护相关的选项

      # 使用较多的
      -m,--memory=" "                    : 限制容器内应用使用的内存,单位可以是b、k、m或g
      --oom-kill-disable=true|false       : 内存耗尽时是否杀死容器
      --privileged=true|false             : 是否给容器高权限,这意味着容器内应用将不受权限的限制,一般不推荐
      -U,--user=""                       : 指定在容器内执行命令的用户信息
      --userns=""                         : 指定用户命名空间
      --ulimit=[]                         : 通过ulimit来限制最大文件数、最大进程数# 可根据需求来定义
      --blkio-weight=10~1000              : 容器读写块设备的1/0性能权重,默认为0
      --blkio-weight-device=[名称:WEIGHT] : 指定各个块设备的I/O性能权重
      --cpu-shares=0                      : 允许容器使用CPU资源的相对权重,默认一个容器能用满个核的 CPU
      --cap-add=[]                        : 增加容器的Linux指定安全能力
      --cap-drop=[]                       : 移除容器的Linux指定安全能力
      --cgroup-parent=" "                 : 容器cgroups 限制的创建路径
      --cidfile=""                        : 指定容器的进程ID号写到文件
      --cpu-period=0                      : 限制容器在CFS调度器下的CPU占用时间片
      --cpuset-cpus=" "                   : 限制容器能使用哪些CPU核心
      --cpuset-mems=" "                   : NUMA架构下使用哪些核心的内存
      --cpu-quota=0                       : 限制容器在CFS调度器下的CPU配额
      --device-read-bps=[]                : 挂载设备的读吞吐率(以bps为单位)限制
      --device-write-bps=[]               : 挂载设备的写吞吐率(以bps为单位)限制
      --device-read-iops=[]               : 挂载设备的读速率(以每秒io次数为单位)限制
      --device-write-iops=[]              : 挂载设备的写速率(以每秒i/o次数为单位)限制
      --health-cmd=" "                    : 指定检查容器健康状态的命令
      --health-interval=0s                : 执行健康检查的间隔时间,单位可以为ms、s、 m或h
      --health-retries=int                : 健康检查失败重试次数,超过则认为不健康
      --health-start-period=0s            : 容器启动后进行健康检查的等待时间,单位可以为ms、s、m或h
      --health-timeout=0s                 : 健康检查的执行超时,单位可以为ms、s、m或h
      --no-healthcheck=true|false         : 是否禁用健康检查
      --init                              : 在容器中执行-一个init进程,来负责响应信号和处理僵尸状态子进程
      --kernel-memory=" "                 : 限制容器使用内核的内存大小,单位可以是b、k、m或g
      --memory-reservation=""             : 当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值
      --memory-swap="LIMIT"               : 限制容器使用内存和交换区的总大小
      --00m-score-adj=""                  : 调整容器的内存耗尽参数
      --pids-limit=""                     : 限制容器的pid个数
      --read-only=true|false              : 是否让容器内的文件系统只读
      --security-opt= []                  : 指定一些安全参数,包括权限、安全能力、apparmor等
      --stop-signal=SIGTERM               : 指定停止容器的系统信号
      --shm-size=""                      : /dev/shm的大小
      --sig-proxy=true| false             : 是否代理收到的信号给应用,默认为true,不能代理SIGCHLD、SIGSTOP和SIGKILL信号
      --memory-swappiness="0~100"         : 调整容器的内存交换区参数
      
http://www.dtcms.com/a/466470.html

相关文章:

  • 全面解析java注解
  • 多模态大模型研究国庆简报【2025-10-1~2025-10-10】
  • promise的用法
  • 13年测试经验,性能测试-性能调优分析汇总,一篇汇总...
  • 网站开发组合 所有组合网站建设负责人证明
  • BFS解决最短路径问题
  • DNS 隐私防护与用户画像防范策略
  • 免费的x网站域名上海十大工业设计公司
  • 如何在Android Studio中使用Gemini进行AI Coding
  • 学校网站建设材料惠州抖音推广
  • DIN70121协议解读
  • 网站优化软件常用python编程软件
  • 软件的设计原理
  • petri网学习笔记——(五)第二章 petri网的动态性质
  • 长兴网站制作公司wordpress tag优化
  • Spring Bean 生命周期详解:初始化与销毁方式对比与实践
  • 做交易网站什么开发语言网络工程师
  • DeviceNet 转 Modbus TCP 协议转换在 S7-1200 PLC化工反应釜中的应用
  • 网站建设公司网络服务学美工难吗
  • S29-昆仑触屏串口批量写应用
  • C# 委托(Delegate)
  • 企业单位网站建设内容需要什么saas电商建站系统
  • 【63】OpenCV C++实战篇——用C++实现的直线卡尺工具--自选找线方向(从左到右、从右到左、从上到下、从下到上)
  • 做网站你们用什么浏览器如何免费建立个人网站
  • 《金钱心理学》读后感
  • 临沂网站设计建设wordpress 下拉菜单设置
  • PyTorch Transformers| Azure
  • 2.c++面向对象(二)
  • 苍穹外卖-Apache ECharts与数据统计
  • 合肥企业建站系统wap网站浏览器