Docker核心操作实战

核心操作实战

文章目录

  • 核心操作实战
  • 前言
  • Docker核心操作实战:资源限制、数据卷、端口映射与容器互联
    • 一、资源限制
      • [1.1 CPU 资源控制](#1.1 CPU 资源控制)
        • [(1) 设置 CPU 使用率上限(--cpu-period / --cpu-quota)](#(1) 设置 CPU 使用率上限(--cpu-period / --cpu-quota))
        • [(2) 设置 CPU 占用比(权重 --cpu-shares)](#(2) 设置 CPU 占用比(权重 --cpu-shares))
        • [(3) 绑定指定 CPU(--cpuset-cpus)](#(3) 绑定指定 CPU(--cpuset-cpus))
      • [1.2 内存使用限制](#1.2 内存使用限制)
    • [二、数据卷管理(Data Volumes)](#二、数据卷管理(Data Volumes))
      • [2.1 宿主机目录挂载(-v 参数)](#2.1 宿主机目录挂载(-v 参数))
      • [2.2 数据卷容器(Data Volumes Containers)](#2.2 数据卷容器(Data Volumes Containers))
      • [2.3 数据卷总结](#2.3 数据卷总结)
    • 三、端口映射
      • [3.1 随机端口映射(-P 参数)](#3.1 随机端口映射(-P 参数))
      • [3.2 指定端口映射(-p 参数)](#3.2 指定端口映射(-p 参数))
      • [3.3 端口映射总结](#3.3 端口映射总结)
    • [四、容器互联(使用 CentOS 镜像)](#四、容器互联(使用 CentOS 镜像))
      • [4.1 步骤1:创建并运行源容器 web1](#4.1 步骤1:创建并运行源容器 web1)
      • [4.2 步骤2:创建并运行接收容器 web2,关联 web1](#4.2 步骤2:创建并运行接收容器 web2,关联 web1)
      • [4.3 步骤3:测试容器互联](#4.3 步骤3:测试容器互联)
      • [4.4 容器互联总结](#4.4 容器互联总结)
    • 总结

前言

Docker核心操作实战:资源限制、数据卷、端口映射与容器互联

大家好~ 上一篇我们分享了Docker的安装配置、镜像与容器的基础操作,今天继续深入Docker实战核心,聚焦资源限制数据卷管理端口映射容器互联这四大关键场景。这些操作是Docker部署应用的必备技能,尤其是资源限制能避免容器占用过多宿主机资源,数据卷保障数据持久化,容器互联则实现服务间通信。下面我们一步步拆解,每个命令都附带详细旁注,确保大家能直接上手实操。

一、资源限制

Docker容器本质是宿主机上的进程,默认情况下会无限制使用宿主机的CPU、内存等资源。为了避免单个容器耗尽宿主机资源,我们可以通过 cgroups(Control Groups) 技术对容器进行资源限制,Docker底层正是通过cgroups实现CPU、内存、IO等资源的管控。

1.1 CPU 资源控制

cgroups对CPU的控制主要实现三大功能:限制CPU使用率上限、设置CPU占用权重、绑定指定CPU核心。

(1) 设置 CPU 使用率上限(--cpu-period / --cpu-quota)

原理:Linux使用CFS(完全公平调度器)分配CPU资源,通过两个参数控制:

  • --cpu-period:CPU调度周期(单位:微秒,默认100000微秒=100ms)
  • --cpu-quota:容器在一个周期内可使用的CPU时间(单位:微秒,默认-1表示无限制)

计算公式:CPU使用率 = (--cpu-quota / --cpu-period),结果为小数,对应"几个CPU核心"的占比(相对于1个CPU)。

示例1:限制容器使用50%的单个CPU(即一个周期内最多使用50ms CPU时间)

bash 复制代码
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash
# 旁注:--cpu-quota 50000:100ms周期内最多用50ms,对应50%单核CPU
# 若宿主机有4个逻辑核,该容器实际最多占用整机CPU的12.5%(50% ÷ 4)

示例2:更直观的写法(较新版本Docker支持,推荐使用)

bash 复制代码
docker run -itd --name cputest --cpus="0.5" centos:7 /bin/bash
# 旁注:--cpus=0.5:直接指定容器可用0.5个CPU核心,等价于--cpu-quota 50000
(2) 设置 CPU 占用比(权重 --cpu-shares)

原理--cpu-shares 指定容器的CPU权重(默认1024),仅在CPU资源争用时生效(不是硬限制)。权重比例即为CPU分配比例,例如A容器权重512、B容器权重1024,争用CPU时A:B=1:2。

示例:创建两个容器,设置不同CPU权重

bash 复制代码
docker run -itd --name c1 --cpu-shares 512 centos:7 /bin/bash  # c1权重512
docker run -itd --name c2 --cpu-shares 1024 centos:7 /bin/bash  # c2权重1024
# 旁注:当宿主机CPU繁忙时,c1和c2的CPU占用比约为1:2;若CPU空闲,两者均可使用满CPU资源

验证方法 :在两个容器内分别运行压力测试命令,再通过 docker stats 观察CPU占用情况

bash 复制代码
# 进入c1容器,安装压力测试工具stress
docker exec -it c1 bash
yum install -y epel-release && yum install -y stress
stress -c 4  # 产生4个进程,每个进程持续计算(消耗CPU)

# 同样操作在c2容器执行,然后在宿主机运行
docker stats  # 观察c1和c2的CPU %,会接近1:2的比例
(3) 绑定指定 CPU(--cpuset-cpus)

用途:将容器进程绑定到宿主机的指定CPU核心上(硬亲和性),避免容器在多个核心间切换,提升性能稳定性(适合对CPU敏感的应用)。

示例:将容器绑定到宿主机的第1和第3个CPU核心(CPU核心从0开始计数)

bash 复制代码
docker run -itd --name test7 --cpuset-cpus "1,3" centos:7 /bin/bash
# 旁注:--cpuset-cpus "1,3":绑定到第2、4个物理核心(0为第一个)
# 宿主机通过top命令按1可查看各核心使用率,能看到绑定的核心占用率明显升高

1.2 内存使用限制

内存限制比CPU限制更重要------若容器内存使用超出宿主机可用内存,会触发OOM(内存溢出),导致容器被杀死。Docker通过 -m/--memory--memory-swap 控制内存使用。

核心参数说明

  • -m/--memory:限制容器可用的物理内存(如512m、1g)
  • --memory-swap:限制容器可用的「物理内存+交换分区(swap)」总容量,必须与 -m 一起使用

参数规则与示例

bash 复制代码
# 示例1:限制物理内存300M,物理内存+swap总容量1G(即swap可用700M)
docker run -itd --name memtest -m 300m --memory-swap=1g centos:7 /bin/bash
# 旁注:1G - 300M = 700M,容器最多可使用700M swap

# 示例2:禁止容器使用swap(物理内存用尽直接触发OOM)
docker run -itd --name memtest2 -m 300m --memory-swap=300m centos:7 /bin/bash
# 旁注:--memory-swap与-m相等时,容器无法使用swap

# 示例3:不限制swap使用(宿主机有多少swap就可用多少)
docker run -itd --name memtest3 -m 300m --memory-swap=-1 centos:7 /bin/bash
# 旁注:--memory-swap=-1 表示swap不受限制,仅限制物理内存300M

二、数据卷管理(Data Volumes)

容器默认的文件系统是临时的------容器删除后,内部数据会丢失。为了实现数据持久化(容器删除后数据保留)、容器与宿主机数据共享、容器间数据共享,Docker提供了数据卷机制。

数据卷是容器中的特殊目录,它独立于容器的生命周期,即使容器被删除,数据卷中的数据也不会丢失。数据卷支持两种使用方式:宿主机目录挂载、数据卷容器共享。

2.1 宿主机目录挂载(-v 参数)

格式docker run -v 宿主机目录:容器内目录 [选项] 镜像

注意:宿主机目录必须是绝对路径,若目录不存在,Docker会自动创建(权限为root)。

示例1 :将宿主机/opt/www目录挂载到容器/var/www/html(Nginx网站根目录)

bash 复制代码
# 1. 宿主机创建目录并写入测试文件
mkdir -p /opt/www  # 宿主机创建目录
echo "<h1>Docker数据卷测试</h1>" > /opt/www/index.html  # 写入测试页面

# 2. 启动Nginx容器,挂载目录
docker run -d --name nginx-vol -v /opt/www:/var/www/html -p 8080:80 nginx
# 旁注:-v /opt/www:/var/www/html:宿主机/opt/www 挂载到容器/var/www/html
# 旁注:-p 8080:80:宿主机8080端口映射到容器80端口

# 验证:浏览器访问 http://宿主机IP:8080,会看到测试页面;修改宿主机/opt/www/index.html,页面会同步更新

示例2:设置挂载目录权限(只读/可写)

bash 复制代码
# 容器内目录设为只读(宿主机可写,容器只能读)
docker run -d --name nginx-vol-ro -v /opt/www:/var/www/html:ro -p 8081:80 nginx
# 旁注::ro 表示容器内目录为只读(read-only),默认是:rw(可读写)

# 验证:进入容器修改文件会报错
docker exec -it nginx-vol-ro bash
cd /var/www/html
echo "test" > index.html  # 报错:Permission denied

2.2 数据卷容器(Data Volumes Containers)

当多个容器需要共享数据时,可创建一个数据卷容器 (专门用于挂载数据卷),其他容器通过 --volumes-from 挂载该容器的数据卷,实现多容器数据共享。

示例:创建数据卷容器,让web2、web3容器共享其数据

bash 复制代码
# 1. 创建数据卷容器web1(不启动应用,仅用于共享数据)
docker run -itd --name web1 -v /data1 -v /data2 centos:7 /bin/bash
# 旁注:-v /data1 -v /data2:在容器内创建两个数据卷目录/data1、/data2(未指定宿主机目录,Docker自动分配宿主机目录)

# 2. 进入web1容器,写入测试数据
docker exec -it web1 bash
echo "this is web2" > /data1/abc.txt  # 向/data1写入文件
echo "THIS IS WEB2" > /data2/ABC.txt  # 向/data2写入文件
exit  # 退出容器

# 3. 创建web2容器,通过--volumes-from挂载web1的数据卷
docker run -itd --name web2 --volumes-from web1 centos:7 /bin/bash
# 旁注:--volumes-from web1:继承web1的所有数据卷(/data1、/data2)

# 4. 验证web2容器是否能访问数据
docker exec -it web2 bash
cat /data1/abc.txt  # 输出:this is web2(成功访问web1的数据)
cat /data2/ABC.txt  # 输出:THIS IS WEB2

# 5. 创建web3容器,同样挂载web1的数据卷(多容器共享)
docker run -itd --name web3 --volumes-from web1 centos:7 /bin/bash
docker exec -it web3 bash
cat /data1/abc.txt  # 同样能访问数据,实现三容器共享

2.3 数据卷总结

  • 宿主机目录挂载:适合「容器与宿主机共享数据」,比如Nginx配置文件、日志文件挂载
  • 数据卷容器:适合「多容器共享数据」,比如微服务中多个服务共享配置文件
  • 核心优势:数据持久化(容器删除不丢失)、跨容器共享、宿主机与容器双向同步

三、端口映射

Docker容器内部运行的服务(如Nginx、Tomcat)默认只能被宿主机和同一网络的容器访问,外部网络(其他机器)无法直接访问。端口映射通过将「宿主机端口」与「容器内端口」绑定,让外部网络通过宿主机端口访问容器内的服务。

Docker支持两种端口映射方式:随机端口映射、指定端口映射。

3.1 随机端口映射(-P 参数)

使用 -P(大写)参数,Docker会自动为容器暴露的端口(镜像中EXPOSE声明的端口)分配一个宿主机随机端口(默认从32768开始),适合无需固定端口的场景。

示例:启动Nginx容器,随机映射端口

bash 复制代码
docker run -d --name nginx-random -P nginx
# 旁注:-P 自动映射容器80端口(Nginx默认端口)到宿主机随机端口

# 查看端口映射情况
docker ps -a
# 输出示例:0.0.0.0:49170->80/tcp  表示宿主机49170端口映射到容器80端口

# 验证:外部浏览器访问 http://宿主机IP:49170,能看到Nginx默认页面

3.2 指定端口映射(-p 参数)

使用 -p(小写)参数,手动指定「宿主机端口:容器内端口」,适合需要固定访问端口的场景(如生产环境部署应用)。

示例:启动Nginx容器,指定宿主机43000端口映射到容器80端口

bash 复制代码
docker run -d --name nginx-specified -p 43000:80 nginx
# 旁注:-p 43000:80:宿主机43000端口 <-> 容器80端口,外部访问宿主机43000即可访问Nginx

# 查看端口映射
docker ps -a
# 输出示例:0.0.0.0:43000->80/tcp

# 验证:外部浏览器访问 http://宿主机IP:43000,正常显示Nginx页面

3.3 端口映射总结

  • -P(大写):随机映射,适合测试环境
  • -p(小写):指定映射,格式「宿主机端口:容器端口」,适合生产环境
  • 注意:宿主机端口不能被其他进程占用,否则容器启动失败

四、容器互联(使用 CentOS 镜像)

在实际应用中,多个容器需要相互通信(比如Web容器访问数据库容器)。Docker提供了 --link 选项实现容器互联,让一个容器可以通过另一个容器的「名称」访问其服务,无需记住容器的IP地址(容器重启后IP可能变化,但名称不变)。

下面以CentOS镜像为例,实现两个容器(web1、web2)的互联,让web2能通过web1的名称ping通web1。

4.1 步骤1:创建并运行源容器 web1

先创建一个源容器web1,作为通信的目标容器,指定名称便于后续关联。

bash 复制代码
docker run -itd -P --name web1 centos:7 /bin/bash
# 旁注:-itd:交互式后台运行;-P:随机映射端口;--name web1:指定容器名称为web1;centos:7:使用CentOS7镜像

4.2 步骤2:创建并运行接收容器 web2,关联 web1

创建web2容器,通过 --link 源容器名称:源容器别名 关联web1,其中「别名」是web2容器内访问web1的名称(可与源容器名称一致)。

bash 复制代码
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash
# 旁注:--link web1:web1:关联web1容器,在web2内用"web1"作为web1的访问名称
# 旁注:--link会自动在web2的/etc/hosts文件中添加web1的IP映射,所以能通过名称访问

4.3 步骤3:测试容器互联

进入web2容器,通过ping命令测试与web1的连通性(使用web1的名称)。

bash 复制代码
# 进入web2容器
docker exec -it web2 bash

# 测试ping web1(使用容器名称)
ping web1
# 输出示例:
# PING web1 (172.17.0.2) 56(84) bytes of data.
# 64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.068 ms
# 说明:web2成功ping通web1,实现容器互联

# 查看web2的/etc/hosts文件(验证IP映射)
cat /etc/hosts
# 输出会包含:172.17.0.2  web1  3ed82355f811(web1的IP和名称映射)

4.4 容器互联总结

  • --link 格式:--link 源容器名称:源容器别名
  • 核心原理 :在接收容器的/etc/hosts中添加源容器的IP-名称映射,实现通过名称访问
  • 局限性--link仅支持同一宿主机的容器互联,跨宿主机容器互联需使用Docker网络(如overlay网络)
  • 适用场景:简单的单宿主机多容器通信(如Web容器+数据库容器)

总结

今天我们了解的四大核心操作,覆盖了Docker部署应用的关键场景:

  1. 资源限制 :通过--cpus-m等参数控制CPU、内存,避免资源滥用
  2. 数据卷:实现数据持久化和共享,解决容器数据丢失问题
  3. 端口映射:让外部网络访问容器服务,是应用暴露的必备方式
  4. 容器互联:实现容器间通信,支撑多服务协同(如Web+数据库)

这些操作都是实战中高频使用的,建议大家动手实操一遍------只有实际运行命令,才能真正掌握细节(比如端口占用、权限问题等)。下一篇我们会讲解Docker镜像的高级创建方式(Dockerfile),以及Docker Compose编排多服务,敬请期待~

相关推荐
蓝胖的四次元口袋15 小时前
Docker Compose多容器编排与Nginx集群实战
运维·nginx·docker compose
懂软件的胡子个哥15 小时前
微信 API 消息回调怎么设计,才能避免丢消息和重复处理
运维·微信·架构·wechatapi·个人微信号二次开发
吉甫作诵16 小时前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
Acrellea17 小时前
告别粗放式能耗管理!安科瑞EIOT平台助力产业园区智慧低碳运营
运维·安全·能源
Databuff18 小时前
五款主流 SSH 免费工具介绍
运维·ssh·运维开发
菜鸟学编程o18 小时前
Linux常见指令
linux·运维·服务器
pt104319 小时前
AIOps机器学习——当警报阈值被调高之后
运维·人工智能·自动化
迪康coolmu19 小时前
企业文件外发管控落地实践 —— 基于迪康端点安全一体化管理系统
运维·网络·经验分享·安全
见闻小天地20 小时前
四方电气DL300变频器面向雕铣机多工况的技术参数与适配验证
运维·人工智能·业界资讯
千舟软件21 小时前
【宿舍管理小程序】新生入住不靠纸质表
大数据·运维·服务器·科技·业界资讯