欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > docker数据卷挂载,安全与优化隔离,docker Compose

docker数据卷挂载,安全与优化隔离,docker Compose

2025/3/31 23:50:01 来源:https://blog.csdn.net/m0_74157475/article/details/146549378  浏览:    关键词:docker数据卷挂载,安全与优化隔离,docker Compose

一、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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词