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编排多服务,敬请期待~

相关推荐
隔壁阿布都2 小时前
Docker Compose中的网络管理
运维·docker·容器
_oP_i2 小时前
开源项目 SQLBot Dockerfile、docker-compose.yaml、Dockerfile-base 三个文件直接的关系
docker
云和数据.ChenGuang2 小时前
运维工程师技术教程之Pull Requests(PR)
运维·分布式·git·数据库运维工程师·运维教程
小快说网安2 小时前
抗 DDoS 防护在等保测评中的权重提升:云服务器如何通过防护能力加分?
运维·服务器·ddos·等保测评
翼龙云_cloud2 小时前
阿里云渠道商:如何快速解决更换阿里云GPU公网IP后出现的网络故障?
运维·tcp/ip·阿里云·云计算
陌路203 小时前
TCP连接如何确保其可靠性
运维·服务器
最贪吃的虎3 小时前
Spring Boot 自动装配(Auto-Configuration)深度实现原理全解析
java·运维·spring boot·后端·mysql
DO_Community3 小时前
从零开始,用 n8n 设计可扩展的自动化工作流
运维·ai·自动化·devops
程序员老赵3 小时前
Nextcloud Docker 容器化部署指南
docker·数据分析·数据可视化