docker(二)
cgroups(Control Groups)是Linux内核资源控制机制,支持资源限制、优先级分配、资源统计、任务控制,Docker通过其实现CPU、内存、IO等限制。Docker Compose是Docker官方开源项目,通过YAML文件定义多个关联服务,实现容器集群快速编排,分为工程(project)、服务(service)、容器(container)三层。企业级Docker镜像仓库管理平台
文章目录
四、资源限制
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/bash或docker 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)
- 容器内创建压力脚本:
# /cpu.sh #!/bin/bash i=0 while true; do let i++; done - 运行脚本:
docker exec -it <container> bash ./cpu.sh; - 安装stress工具测试:
yum install -y epel-release stress && stress -c 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/bash或docker 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 基于现有镜像创建
- 启动并修改容器:
docker create -it centos:7 /bin/bash,进入容器修改后退出; - 提交镜像:
docker commit -m "new" -a "centos" 000550eb36da centos:test(-m提交说明,-a作者,容器ID,新镜像名)。
8.2 基于本地模板创建
- 下载模板:
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz; - 导入镜像:
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操作常用指令(重点)
- FROM:指定基础镜像(Dockerfile第一条指令),示例:
FROM centos:7; - MAINTAINER:指定维护者信息,示例:
MAINTAINER "John Doe <johndoe@example.com>"; - RUN:执行命令并提交结果,示例:
RUN yum install -y httpd; - ENTRYPOINT:设置容器启动默认命令,示例:
ENTRYPOINT ["httpd"]; - CMD:容器启动默认命令,可被docker run命令覆盖,示例:
CMD ["httpd", "-D", "FOREGROUND"]; - EXPOSE:声明容器内端口,示例:
EXPOSE 80; - ENV:设置环境变量,示例:
ENV MY_VAR=my_value; - ADD:复制宿主机文件/目录到镜像,支持URL下载和自动解压,示例:
ADD myfile.tar.gz /app; - COPY:复制本地文件/目录到镜像,示例:
COPY . /app; - VOLUME:创建容器挂载点,示例:
VOLUME ["/data"]; - USER:设置容器内运行命令的用户,示例:
USER root; - WORKDIR:设置后续指令工作目录,示例:
WORKDIR /app; - ONBUILD:镜像作为基础镜像时执行的命令,示例:
ONBUILD RUN echo "Building from base image"; - 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示例
- 项目结构:
/opt/compose_nginx_tomcat/
├── docker-compose.yml
├── nginx
│ ├── Dockerfile
│ └── nginx.conf
├── tomcat
│ ├── Dockerfile
│ └── webapps
│ └── ROOT.war
└── wwwroot
└── index.html
- 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 创建新项目
- 浏览器访问
http://192.168.10.23,登录(admin/Harbor12345); - 创建项目“myproject-yjs”;
- 登录并推送镜像:
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 创建用户并分配权限
- Web界面:系统管理→用户管理→创建用户(yjs-zhangsan/Abc123456);
- 项目→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格式,或者提取其中的核心命令制作成速查手册吗?
更多推荐



所有评论(0)