一、bind mount数据卷的挂载(用主机的有内容文件挂载于容器空文件)
简单的挂载方式:docker run -it --rm --name test1 -v /lee:/data1:rw -v /etc/passwd:/data2/passwd busybox(-v表挂载,将主机的/lee目录挂载于容器的data1目录,并且设置rm已读模式)
二、数据卷的docker managed(使用空文件去指定容器的有内容文件)
1.bind mount必须指定host文件系统路径,限制了移植性
2.docker managed volume不需要指定mount源,docker自动为容器创建数据卷目录
3.默认创建的数据卷目录都在/var/lib/docker/volumes中
4.如果挂载时指定容器内已有目录,原有数据会被复制到/var/lib/docker/volume中
5.docker清理卷轴的方法:docker volume prune
mysql数据卷的挂载命令:
1.创建本地挂载目录:docker volume create mysqldate(该目录会被存储于/var/lib/docker/volumes内)
2.内容的改在:docker run -d --name mysql1 -e MYSQL_ROOT_PASSWORD=lee -v mysqldate:/var/lib/mysql mysql:5.7
3.查看容器挂载点:dockers inspect mysql
注释:容器内的mysql信息保存于主机的/var/lib/docker/volumes/mysqldate/_date内,如果将mysql容器删除的话,内容依然存在
4.查看所有的容器挂载内容:docker volume ls
5.删除单个挂载点:docker volume rm mysqldate
6.删除所有挂载点:docker volume prune(谨慎使用)
三、bind mount和docker managed volume的对比
四、备份与迁移数据卷:
示例1:
1.数据迁移
[root@openeuler xiaoli]# docker run -it --volumes-from mysql1 --rm --name tes2 busybox
/ # exit
注释:--volumes-from去指向数据容器的名称,数据会被存在于数据容器的挂载点上
2.数据备份
docker volume create leevol1:创建docker卷
mkdir data1:创建目录
tar zcf data1.tar.gz data1:对于data1进行打包,外主机打包内容
docker run -it --rm --name test -v leevol1:/data1 -v `pwd`:/backup busybox /bin/sh -c "tar zxf /backup/data1.tar.gz;/bin/sh"(将leevol1挂载容器data1,将含有压缩包的目录挂载到容器的backup,它解包的是挂载到容器内/backup目录下的data1.tar.gz文件,容器内进行解包)
leevol1 是一个 Docker 命名数据卷的名称。如果该数据卷不存在,Docker 会自动创建它。
[root@openeuler ~]# docker inspect leevol1
[
{
"CreatedAt": "2025-03-26T16:54:44+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/leevol1/_data",
"Name": "leevol1",
"Options": null,
"Scope": "local"
}
]
-cd /var/lib/docker/volumes/leevol1/_data
/data1 是容器内的挂载点,意味着将宿主机上的 leevol1 数据卷挂载到容器内的 /data1 目录。这样,容器内对 /data1 目录的读写操作实际上是在操作宿主机上的数据卷。
pwd 是一个反引号包裹的命令,在 Linux 中,反引号用于执行命令并将其输出作为当前命令的一部分。pwd 命令会输出当前工作目录的绝对路径,所以这里是将宿主机的当前工作目录挂载到容器内的 /backup 目录。这使得容器可以访问宿主机当前目录下的文件,例如后续要解压的 data1.tar.gz 文件。
利用容器编排完成haproxy和nginx负载均衡架构实施
1.mkdir docker.test
2.touch haproxy.yml
3.mkdir /var/lib/docker/volumes/conf
4.dnf install haproxy -y --downloadonly --downloaddir=/xixi:下载内容到/xixi目录下
5. rpm2cpio haproxy18-1.8.27-3.el7.x86_64.rpm | cpio -id
注释:rpm2cpio 是一个工具,将 RPM 格式的软件包转换为 CPIO 格式,并提取其中的文件。
示例2:
1.数据迁移
docker run -it --volumes-from mysql --rm --name test1 busybox
注释:--volumes-from去指向数据容器的名称,数据会被存在于数据容器的挂载点上
2.数据备份
docker volume create leevol1:创建docker卷
mkdir data1:创建目录
tar zcf data1.tar.gz data1:对于data1进行打包,外主机打包内容
docker run -it --rm --name test -v leevol1:/data1 -v `pwd`:/backup busybox /bin/sh -c "tar zxf /backup/data1.tar.gz;/bin/sh"(将leevol1挂载容器data1,将含有压缩包的目录挂载到容器的backup,它解包的是挂载到容器内/backup目录下的data1.tar.gz文件,容器内进行解包)
leevol1 是一个 Docker 命名数据卷的名称。如果该数据卷不存在,Docker 会自动创建它。
/data1 是容器内的挂载点,意味着将宿主机上的 leevol1 数据卷挂载到容器内的 /data1 目录。这样,容器内对 /data1 目录的读写操作实际上是在操作宿主机上的数据卷。
pwd 是一个反引号包裹的命令,在 Linux 中,反引号用于执行命令并将其输出作为当前命令的一部分。pwd 命令会输出当前工作目录的绝对路径,所以这里是将宿主机的当前工作目录挂载到容器内的 /backup 目录。这使得容器可以访问宿主机当前目录下的文件,例如后续要解压的 data1.tar.gz 文件。
五、限制 Nginx 容器的内存和磁盘 IO 速率
bash
docker run -d --name nginx_container \
--memory 512M \
--memory-swap 1G \
--device-read-bps /dev/sda:500kb \
--device-write-bps /dev/sda:500kb \
nginx:latest
上述命令创建了一个名为nginx_container的 Nginx 容器,限制其内存使用为 512MB,内存和 Swap 总和为 1GB,同时限制容器对/dev/sda设备的读速率为 500KB 每秒,写速率也为 500KB 每秒。
要验证使用上述命令创建的 nginx_container 容器的资源限制是否生效,可以从以下几个方面进行检查:
1. 验证容器是否正常运行
使用 docker ps 命令查看容器是否处于运行状态:
docker ps -f name=nginx_container
若输出中显示容器状态为 Up,则表明容器已成功启动并正在运行。
2. 验证内存限制
查看容器内存配置
通过查看容器的配置文件确认内存和内存交换的限制是否正确设置。先获取容器的 ID,再查看对应的 cgroup 文件:
CONTAINER_ID=$(docker inspect -f '{{.Id}}' nginx_container)
cat /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.limit_in_bytes
cat /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.memsw.limit_in_bytes
memory.limit_in_bytes 的值应为 536870912(即 512MB,512 * 1024 * 1024),memory.memsw.limit_in_bytes 的值应为 1073741824(即 1GB,1 * 1024 * 1024 * 1024)。
监控容器内存使用情况
使用 docker stats 命令实时监控容器的内存使用情况,确保其使用量在限制范围内:
docker stats nginx_container
观察输出中的 MEM USAGE / LIMIT 列,保证内存使用不超过 512MB。
3. 验证磁盘读写速率限制
查看磁盘读写速率配置
通过查看容器的块 I/O 控制组(blkio)文件确认磁盘读写速率限制是否正确设置:
CONTAINER_ID=$(docker inspect -f '{{.Id}}' nginx_container)
cat /sys/fs/cgroup/blkio/docker/$CONTAINER_ID/blkio.throttle.read_bps_device
cat /sys/fs/cgroup/blkio/docker/$CONTAINER_ID/blkio.throttle.write_bps_device
输出应显示 /dev/sda 的读速率限制为 500000(即 500KB,500 * 1024),写速率限制也为 500000。
测试磁盘读写速率
在容器内使用工具(如 dd)测试磁盘的读写性能,验证读写速率是否在限制范围内。首先进入容器:
docker exec -it nginx_container bash
然后在容器内执行以下命令进行读写测试:
# 读测试
dd if=/dev/sda of=/dev/null bs=1M count=100 conv=fdatasync
# 写测试
dd if=/dev/zero of=/testfile bs=1M count=100 conv=fdatasync
通过观察 dd 命令的输出信息,确认读写速率是否接近或不超过 500KB/s。
4. 验证 Nginx 服务是否正常
可以通过向容器内的 Nginx 服务发送 HTTP 请求来验证服务是否正常运行。在容器运行时,使用 curl 命令访问容器的 IP 地址或端口:
# 获取容器的 IP 地址
CONTAINER_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx_container)
# 发送 HTTP 请求
curl $CONTAINER_IP
若返回 Nginx 的默认欢迎页面或预期的内容,则说明 Nginx 服务在容器内正常运行。
启动
[root@openeuler ~]# docker exec -it nginx_container bash
root@9f3d3a8afc9f:/
六、docker容器的信息隔离:
LXFS是一个为LXC容器童工增强文件系统功能的工具
主要功能:
1.资源可见性:LXFS可以使容器内的进程看到更准确的CPU,内存以及磁盘I/O等资源的使用信息,在没有LXFS时候,容器内看到的资源信息可能不准确,这会影响到容器内运行的应用对资源的评估和管理
2.性能监控:方便对容器内的资源使用情况进行监控和性能分析,通过提供准确的资源信息,管理员和开发人员可以更好的了解容器化应用的性能瓶颈,并进行相应的优化
LXFS的安装与使用
1.安装:yum install lxcfs.x86_64 -y
2.使用:lxcfs /var/lib/lxc/lxcfs/ &
注释:在使用上述命令后,会在/var/lib/lxc/lxcfs下创建系统的控制组,进程和cpu等
隔离内存和cpu以及磁盘:
docker run -it --rm --name test
-v /var/lib/lxc/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw
-v /var/lib/lxc/lxcfs/proc/meminfo:/proc/meminfo:rw
-v /var/lib/lxc/lxcfs/proc/diskstats:/proc/diskstats:rw
-v /var/lib/lxc/lxcfs/proc/stat:/proc/stat:rw
-v /var/lib/lxc/lxcfs/proc/swaps:/proc/swaps:rw
--memory 200M centos:7
以上隔离了:cpu,内存,磁盘,系统信息,交换分区
七、docker的容器特权
--privileged=true的权限特别大,接近于宿主机的权限,为了防止用户的滥用,需要添加限制,只提供给容器必要的权限,此时Docker提供了权限的白名单的机制,使用--cap-add添加必要权限
docker run -it --rm --name test2 --privileged busybox
容器的特权白名单:
docker run --rm -it --name test --cap-add NET_ADMIN busybox
--cap-add添加的权限网址参考:http://man7.org/linux/man-pages/man7/capabilities.7.html
八、 Docker Compose
Docker Compose是Docker官方的开源项目,是一个用于定义和运行多容器Docker应用程序的工具。
服务(Service):在Docker Compose中,一个服务实际上可以包括若干运行相同镜像的容器实例,代表一个应用的容器。例如,一个Web应用、数据库等都可以被视为一个服务。
项目(Project):由一组关联的应用容器组成的一个完整业务单元。在docker-compose.yml文件中定义,整个docker-compose.yml文件定义一个项目。Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷的生命周期管理。
核心功能
定义和运行多容器应用:通过docker-compose.yml文件,用户可以定义多个容器的配置信息,包括容器之间的依赖关系、网络配置、数据卷管理等。然后,只需一个命令(如docker-compose up),就可以创建并启动所有定义的容器。
容器编排:Docker Compose支持容器的编排,可以根据容器的依赖关系自动启动和停止容器,确保应用在运行时具有正确的环境。
网络配置:Docker Compose支持自定义网络配置,使得容器之间的通信更加灵活和可靠。服务之间可以通过网络通信,Compose会自动创建网络。
数据卷管理:Docker Compose支持数据卷的挂载和管理,可以轻松地共享和持久化容器数据。
docker-compose.yml文件
docker-compose.yml 文件是 Docker Compose 的核心配置文件,用于定义和运行多容器 Docker 应用程序。
这个文件遵循 YAML格式,包含了一系列关于服务、网络、卷等配置的信息。
以下是一个基本的 docker-compose.yml 文件示例,以及一些关键字段的解释:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: lxcfsnamespace: defaultlabels:app: lxcfs
spec:selector:matchLabels:app: lxcfstemplate:metadata:labels:app: lxcfsspec:hostPID: truetolerations:- key: node - role.kubernetes.io/mastereffect: NoSchedulecontainers:- name: lxcfsimage: registry.cn - hangzhou.aliyuncs.com/denverdino/lxcfs:3.0.4imagePullPolicy: AlwayssecurityContext:privileged: truevolumeMounts:- name: cgroupmountPath: /sys/fs/cgroup- name: lxcfsmountPath: /var/lib/lxcfsmountPropagation: Bidirectional- name: usr - localmountPath: /usr/localvolumes:- name: cgrouphostPath:path: /sys/fs/cgroup- name: lxcfshostPath:path: /var/lib/lxcfs- name: usr - localhostPath:path: /usr/local
在这个示例中:
version 字段指定了 Compose 文件的版本。不同版本的 Compose 文件支持不同的配置选项。(最新版本使用的是name,version已经被舍弃)
services 字段下定义了一个或多个服务(容器)。在这个例子中,定义了两个服务:web 和 db。image 字段指定了容器使用的 Docker 镜像。
ports 字段定义了端口映射。
volumes 字段用于数据持久化或数据共享,可以挂载主机目录到容器目录,或使用命名卷。environment 字段用于设置环境变量。
networks 字段指定了容器使用的网络。
networks 字段定义了一个或多个自定义网络。在这个例子中,定义了一个名为 mynetwork 的桥接网络。
volumes 字段定义了一个或多个命名卷。在这个例子中,定义了一个名为 db_data 的卷,用于存储 MySQL 数据库的数据。
注意,YAML 文件对缩进非常敏感,因此请确保每个字段都正确缩进。
此外,根据实际需求,您可以添加更多配置选项或自定义服务、网络和卷。
详细参考官方文档:https://docs.docker.com/reference/compose-file/version-and-name/
docker compose 常用命令
docker-compose up:创建并启动容器。
docker-compose down:停止并删除容器、网络和卷(如果使用–volumes选项)。
docker-compose start:启动服务。
docker-compose stop:停止服务。
docker-compose restart:重启服务。
docker-compose logs:查看容器日志。
docker-compose ps:列出所有容器。
docker-compose config:检查
docker-compose.yml文件的配置。
详细参考官方文档:https://docs.docker.com/reference/cli/docker/compose/
Docker Compose 基本操作
创建一个目录并进入到该目录下:
mkdir -p /data/ahri/compose/basecd /data/ahri/compose/base
创建一个yml文件
vi docker-compose.yml
编写配置文件,注意,格式一定要正确
version: '3.8' # 指定 Compose 文件的格式版本
services: # 定义服务(容器)的列表web:image: nginx:latest # 指定容器使用的镜像ports:- "80:80" # 将主机的80端口映射到容器的80端口volumes:- ./html:/usr/share/nginx/html # 将主机的./html目录挂载到容器的/usr/share/nginx/html目录networks:- mynetwork # 指定容器使用的网络db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: example # 设置环境变量volumes:- db_data:/var/lib/mysql # 使用命名卷存储数据库数据networks:- mynetwork
networks: # 定义自定义网络mynetwork:driver: bridge # 使用桥接网络模式
volumes: # 定义命名卷db_data:
通过该命令查看配置文件是否出现错误:
docker compose config
创建首页目录,编辑首页内容:
mkdir -p ./mynginxhomecd ./mynginxhomeecho "Test Docker Compose" > index.html
启动服务:
docker compose up -d
查看运行的容器:
通过浏览器测试访问:
进入nginx容器查看环境变量TEST:
docker exec -it test_compose-web-1 bash
停止服务:
docker compose stop
启动服务:
docker compose start
删除服务:
docker compose down
配置文件解析
当前项目的命名:
设置镜像为nginx:1.23.4 ,环境变量为TEST,端口映射为8080,连接网络为mytestnet,映射卷为mynginxhome;
依赖关系分别是mysql和redis;condition可以设置满足依赖项条件;
mysql和redis启动前都会进行健康检查,只有健康了才满足该条件;
镜像为mysql:5.7 ,并设置密码;连接网络mytestnet;映射卷为varlib;
healthcheck就是健康检查:通过test进行测试,规定时间为10s;错误超时不过5s,重试次数为10 ;
redis也是跟mysql配置服务相同;
通过networks来创建一个docker network.
Docker部署WordPress
WordPress
WordPress 是使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。
WordPress 是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP 语言和 MySQL 数据库开发的,用户可以在支持 PHP 和 MySQL 数据库的服务器上使用自己的博客。
利用docker compose进行部署
1.编写yml配置文件
对项目进行命名:
服务db:创建镜像mysql 存储卷为db_data,设置环境变量,最后进行健康检查;
restart定义平台在容器终止时应用的策略。
always:该策略始终重新启动容器,直到将其删除。
name: docker-wordpress
services:db:image: mysql:5.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: mywordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresshealthcheck:test: mysql --user=root --password='mywordpress' -e "SELECT 1;"interval: 10stimeout: 5sretries: 10wordpress:depends_on:db:condition: service_healthyimage: wordpress:latestports:- "8081:80"restart: alwaysvolumes:- ./wordpress:/var/www/htmlenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpress
volumes:db_data:
networks:default:name:docker_wordpress_defaultdriver: bridge
docker compose config
可以看到,如果我们网络没有创建一个docker network,那么会自动配置一个默认的网络
启动wordpress
docker compose up -d wordpress
通过浏览器访问ip:
配置参数,点击安装.
进入容器,查看我们数据库存储的数据:
[root@openeuler ~]# docker compose exec db bash
bash-4.2# mysql -uroot -pmywordpress
use wordpress
select user_login from wp_users;
可以看到我们数据是放到我们的数据库中了.
退出,并释放空间:
docker compose down