文章目录


四、资源限制

4.1 CPU资源控制

4.1.1 概述(cgroups)

cgroups(Control Groups)是Linux内核资源控制机制,支持资源限制、优先级分配、资源统计、任务控制,Docker通过其实现CPU、内存、IO等限制。

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

  • 原理:通过cpu.cfs_period_us(周期,默认100000微秒)和cpu.cfs_quota_us(配额)控制,quota/period=可用CPU核心数(相对于1个CPU);
  • 示例:限制50%单核CPU:docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bashdocker run -itd --name cputest --cpus="0.5" centos:7 /bin/bash

4.1.3 设置CPU占用比(权重–cpu-shares)

  • 原理:指定相对权重(默认1024),仅CPU争用时生效;
  • 示例:容器c1(512)和c2(1024)CPU分配比1:2:
    docker run -itd --name c1 --cpu-shares 512 centos:7
    docker run -itd --name c2 --cpu-shares 1024 centos:7
    

4.1.4 绑定指定CPU(–cpuset-cpus)

示例:绑定到1、3核:docker run -itd --name test7 --cpuset-cpus "1,3" centos:7 /bin/bash

4.1.5 压力测试与验证示例(CPU)

  1. 容器内创建压力脚本:
    # /cpu.sh
    #!/bin/bash
    i=0
    while true; do let i++; done
    
  2. 运行脚本:docker exec -it <container> bash ./cpu.sh
  3. 安装stress工具测试:yum install -y epel-release stress && stress -c 4
  4. 手工修改cgroups:cd /sys/fs/cgroup/cpu/docker/<container-id>/ && echo 50000 > cpu.cfs_quota_us

4.1.6 注意事项(CPU)

  • –cpu-shares是权重,非限额;–cpu-quota/–cpus是硬限制;
  • –cpuset-cpus提升性能稳定性;
  • 多核宿主机需理解quota/period是“相对于1个CPU的份额”。

4.2 内存使用限制

4.2.1 基础选项

  • -m, --memory:限制物理内存(如-m 512m);
  • –memory-swap:限制物理内存+swap总量(需与-m配合)。

4.2.2 规则与示例

  • 示例:docker run -itd --name test8 -m 512m centos:7 /bin/bashdocker run -itd --name test8b -m 300m --memory-swap=1g centos:7
  • 规则:–memory-swap=-1(swap无限制)、–memory-swap=-m(不可用swap)。

4.2.3 验证与观察

  • 查看状态:docker stats
  • 查看cgroup:cd /sys/fs/cgroup/memory/docker/<container-id>/ && cat memory.limit_in_bytes
  • OOM行为:内存耗尽且无swap时,容器被内核OOM killer杀掉。

4.3 磁盘IO(blkio/io)控制

4.3.1 常用Docker参数(blkio)

  • –device-read-bps /dev/sda:1M:限制读速率1MB/s;
  • –device-write-bps /dev/sda:1M:限制写速率1MB/s;
  • –device-read-iops /dev/sda:100:限制读IOPS;
  • –device-write-iops /dev/sda:100:限制写IOPS;
  • 示例:docker run -it --name test10 --device-write-bps /dev/sda:1MB centos:7 /bin/bash

4.3.2 验证(dd测试)

命令:dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct,输出显示写速被限制为1MB/s。

4.4 清理Docker占用的磁盘空间

命令:docker system prune -a,删除停止容器、未使用镜像、网络和构建缓存。

4.5 常见命令速查

# CPU
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-quota 50000 centos:7
docker run -itd --name c3 --cpuset-cpus "1,3" centos:7
docker run -itd --name c4 --cpus="0.5" centos:7

# 内存
docker run -itd --name memtest -m 512m centos:7
docker run -itd --name memtest2 -m 300m --memory-swap=1g centos:7

# blkio
docker run -it --name iotest --device-write-bps /dev/sda:1MB centos:7

# 监控/验证
docker stats
docker exec -it <container> bash
cat /sys/fs/cgroup/cpu/docker/<container-id>/cpu.cfs_quota_us
cat /sys/fs/cgroup/memory/docker/<container-id>/memory.limit_in_bytes

五、数据卷容器(Data Volumes Containers)

5.1 数据卷

5.1.1 创建与挂载数据卷

命令:docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash,将宿主机/var/www挂载到容器/data1。

5.1.2 在数据卷中写入数据

容器内操作:echo "this is web1" > /data1/abc.txt,宿主机可通过/var/www/abc.txt查看。

5.2 数据卷容器

5.2.1 创建数据卷容器

命令:docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash,创建/data1、/data2两个数据卷。

5.2.2 共享数据卷(–volumes-from)

命令:docker run -it --volumes-from web2 --name web3 centos:7 /bin/bash,web3挂载web2的所有数据卷。

六、端口映射

6.1 随机端口映射

命令:docker run -d --name test1 -P nginx,-P自动将容器端口映射到宿主机随机端口(32768开始),通过docker ps -a查看映射端口。

6.2 指定端口映射

命令:docker run -d --name test2 -p 43000:80 nginx,将宿主机43000端口映射到容器80端口,访问http://192.168.80.10:43000

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

7.1 创建源容器web1

命令:docker run -itd -P --name web1 centos:7 /bin/bash

7.2 创建接收容器web2并互联

命令:docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash,–link指定别名web1。

7.3 测试连接

命令:docker exec -it web2 bash && ping web1,验证通信。

八、Docker镜像的创建

8.1 基于现有镜像创建

  1. 启动并修改容器:docker create -it centos:7 /bin/bash,进入容器修改后退出;
  2. 提交镜像:docker commit -m "new" -a "centos" 000550eb36da centos:test(-m提交说明,-a作者,容器ID,新镜像名)。

8.2 基于本地模板创建

  1. 下载模板:wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
  2. 导入镜像:cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

8.3 基于Dockerfile创建(重点)

8.3.1 Docker镜像的分层结构

  • 镜像由多层文件系统组成,每条Dockerfile指令生成一层,容器启动时添加读写层;
  • 依赖UnionFS(联合文件系统),支持分层叠加、目录挂载;
  • 底层为bootfs(引导加载器和内核),上层为rootfs(操作系统发行版目录和文件)。

8.3.2 Dockerfile操作常用指令(重点)

  1. FROM:指定基础镜像(Dockerfile第一条指令),示例:FROM centos:7
  2. MAINTAINER:指定维护者信息,示例:MAINTAINER "John Doe <johndoe@example.com>"
  3. RUN:执行命令并提交结果,示例:RUN yum install -y httpd
  4. ENTRYPOINT:设置容器启动默认命令,示例:ENTRYPOINT ["httpd"]
  5. CMD:容器启动默认命令,可被docker run命令覆盖,示例:CMD ["httpd", "-D", "FOREGROUND"]
  6. EXPOSE:声明容器内端口,示例:EXPOSE 80
  7. ENV:设置环境变量,示例:ENV MY_VAR=my_value
  8. ADD:复制宿主机文件/目录到镜像,支持URL下载和自动解压,示例:ADD myfile.tar.gz /app
  9. COPY:复制本地文件/目录到镜像,示例:COPY . /app
  10. VOLUME:创建容器挂载点,示例:VOLUME ["/data"]
  11. USER:设置容器内运行命令的用户,示例:USER root
  12. WORKDIR:设置后续指令工作目录,示例:WORKDIR /app
  13. ONBUILD:镜像作为基础镜像时执行的命令,示例:ONBUILD RUN echo "Building from base image"
  14. HEALTHCHECK:设置容器健康检查,示例:HEALTHCHECK CMD curl --fail http://localhost:8080 || exit 1

8.3.3 Dockerfile示例

# 建立工作目录
mkdir /opt/apache && cd /opt/apache && vim Dockerfile

# 基于基础镜像
FROM centos:7
# 维护者信息
MAINTAINER this is apache image <hmj>
# 安装apache
ADD CentOS-Base.repo /etc/yum.repos.d/
RUN yum clean all && yum -y update && yum -y install httpd
# 暴露80端口
EXPOSE 80
# 复制网站首页
ADD index.html /var/www/html/index.html
# 启动脚本(方式一)
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]

# 准备启动脚本run.sh
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
/usr/sbin/apachectl -D FOREGROUND

# 准备网站页面
echo "this is test web" > index.html

# 生成镜像
docker build -t httpd:centos .

# 运行容器
docker run -d -p 1216:80 httpd:centos

8.3.4 构建镜像

命令:docker build -t my-web-server .,基于当前目录Dockerfile构建镜像。

九、Docker Compose编排

9.1 简介

Docker Compose是Docker官方开源项目,通过YAML文件定义多个关联服务,实现容器集群快速编排,分为工程(project)、服务(service)、容器(container)三层。

9.2 Docker Compose环境安装

# 下载
curl -L https://github.com/docker/compose/releases/download/2.26.0/docker-compose-linux-aarch64 -o /usr/local/bin/docker-compose
# 安装
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version

9.3 YAML文件格式及编写注意事项

9.3.1 YAML基本语法

  • 大小写敏感,使用空格缩进(推荐2个空格),不支持TAB;
  • 列表项用“-”表示,字典用“: ”连接键值对,注释用“#”;
  • 支持对象映射、序列数组、布尔值等数据结构。

9.3.2 Docker Compose配置常用字段

字段 描述
build 指定Dockerfile文件名和构建上下文路径
dockerfile 指定Dockerfile路径(build子级标签)
context 构建上下文路径或git仓库URL
image 指定镜像
command 覆盖容器启动默认命令
container_name 指定容器名称(唯一,不可scale)
deploy 部署和运行服务配置(仅Swarm模式使用)
environment 添加环境变量
networks 加入顶级networks定义的网络
network_mode 设置容器网络模式(host、bridge等)
ports 暴露容器端口(不低于60)
volumes 挂载宿主机目录或命名卷(命名卷需在顶级volumes定义)
volumes_from 从其他服务/容器挂载卷(仅版本2支持)
hostname 容器主机名
sysctls 设置容器内内核参数
links 连接其他容器(服务名称[:别名])
privileged 给容器root权限(true/false)
restart 重启策略(no、always、on-failure、unless-stopped)
depends_on 控制服务启动顺序(解决依赖问题)

9.3.3 Docker Compose常用命令

  • build:重新构建服务;
  • ps:列出容器;
  • up:创建和启动容器;
  • exec:在容器内执行命令;
  • scale:指定服务容器启动数量;
  • top:显示容器进程;
  • logs:查看容器输出;
  • down:删除容器、网络、数据卷和镜像;
  • stop/start/restart:停止/启动/重启服务。

9.3.4 项目结构与YAML示例

  1. 项目结构:
/opt/compose_nginx_tomcat/
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   └── nginx.conf
├── tomcat
│   ├── Dockerfile
│   └── webapps
│       └── ROOT.war
└── wwwroot
    └── index.html
  1. YAML示例(nginx+tomcat):
version: '3'
services:
  nginx:
    container_name: nginx
    build:
      context: ./nginx
    ports:
      - "8081:80"
    volumes:
      - ./wwwroot:/usr/share/nginx/html
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - app_network
    depends_on:
      - tomcat
  tomcat:
    container_name: tomcat
    build:
      context: ./tomcat
    ports:
      - "8080:8080"
    networks:
      - app_network
    environment:
      - JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom
networks:
  app_network:
    driver: bridge

9.4 Nginx反向代理配置(nginx/nginx.conf)

server {
  listen 80;
  server_name localhost;
  location / {
    proxy_pass http://tomcat:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

9.5 启动服务

命令:cd /opt/compose_nginx_tomcat && docker-compose up -d(-d后台运行)。

十、Docker-Harbor私有仓库部署与管理

10.1 搭建本地私有仓库

10.1.1 下载registry镜像

命令:docker pull registry

10.1.2 配置Docker守护进程

编辑/etc/docker/daemon.json

{
"insecure-registries": ["192.168.10.23:5000"],
"registry-mirrors": ["https://ae3f5qei.mirror.aliyuncs.com"]
}

重启Docker:systemctl daemon-reload && systemctl restart docker.service

10.1.3 运行Registry容器

命令:docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

10.1.4 容器重启策略

  • no:退出不自动重启;
  • on-failure:非正常退出时重启;
  • on-failure:3:最多重启3次;
  • always:退出总是重启;
  • unless-stopped:除非Docker服务停止,否则退出总是重启。

10.1.5 为镜像打标签

命令:docker tag centos:7 192.168.10.23:5000/centos:v1

10.1.6 上传镜像到私有仓库

命令:docker push 192.168.10.23:5000/centos:v1

10.1.7 列出私有仓库所有镜像

命令:curl http://192.168.10.23:5000/v2/_catalog

10.1.8 获取镜像所有Tag

命令:curl http://192.168.10.23:5000/v2/centos/tags/list

10.1.9 测试私有仓库下载镜像

docker rmi -f 8652b9f0cb4c
docker pull 192.168.10.23:5000/centos:v1

10.2 Harbor简介

10.2.1 什么是Harbor

企业级Docker镜像仓库管理平台,基于Docker Registry扩展,提供图形化界面、权限控制等功能,通过docker-compose部署。

10.2.2 Harbor特性

图形化管理界面、基于角色的访问控制、LDAP/AD集成、镜像复制、审计日志、安全扫描(集成Clair)。

10.2.3 Harbor架构

核心组件:Proxy(反向代理)、Registry(镜像存储)、Core services(UI、Token、Webhook)、Database(元数据存储)、Job services(镜像复制)、Log collector(日志收集)。

10.3 部署Harbor服务

10.3.1 安装Docker Compose(同9.2)

10.3.2 下载Harbor安装包

wget https://github.com/goharbor/harbor/releases/download/v2.4.0/harbor-offline-installer-v2.4.0.tgz
tar zxvf harbor-offline-installer-v2.4.0.tgz -C /usr/local/

10.3.3 修改Harbor配置文件(/usr/local/harbor/harbor.yml)

hostname: 192.168.10.23
harbor_admin_password: Harbor12345

10.3.4 启动Harbor

cd /usr/local/harbor/
./prepare
./install.sh

10.3.5 查看Harbor启动状态

命令:cd /usr/local/harbor/ && docker-compose ps

10.3.6 创建新项目

  1. 浏览器访问http://192.168.10.23,登录(admin/Harbor12345);
  2. 创建项目“myproject-yjs”;
  3. 登录并推送镜像:
docker login http://127.0.0.1
docker pull nginx
docker tag nginx:latest 127.0.0.1/myproject-yjs/nginx:v1
docker push 127.0.0.1/myproject-yjs/nginx:v1

10.4 客户端上传镜像

10.4.1 配置Docker客户端

编辑/usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.10.23 --containerd=/run/containerd/containerd.sock

重启Docker:systemctl daemon-reload && systemctl restart docker,登录并上传镜像:

docker login -u admin -p Harbor12345 http://192.168.10.23
docker pull 192.168.10.23/myproject-yjs/nginx:v1
docker tag cirros:latest 192.168.10.23/myproject-yjs/cirros:v2
docker push 192.168.10.23/myproject-yjs/cirros:v2

10.5 维护管理Harbor

10.5.1 创建用户并分配权限

  1. Web界面:系统管理→用户管理→创建用户(yjs-zhangsan/Abc123456);
  2. 项目→myproject-yjs→成员→添加用户,分配“开发人员”角色。

10.5.2 查看日志

Web界面查看操作日志(按时间顺序记录)。

10.5.3 修改Harbor配置文件

cd /usr/local/harbor
docker-compose down -v
vim harbor.yml  # 修改可选参数
./prepare
docker-compose up -d

10.5.4 迁移Harbor数据

cd /usr/local/harbor
docker-compose down -v
tar zcvf kgc-registry.tar.gz /data/registry/docker/registry/v2/repositories/myproject-yjs

10.5.5 彻底移除Harbor

cd /usr/local/harbor
docker-compose down -v
rm -r /data/database
rm -r /data/registry

需要我帮你将这份整理后的文档导出为PDF格式,或者提取其中的核心命令制作成速查手册吗?

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐