win2008iis配置网站,米拓模板网站建设,外贸网站 源,做公司网站别人能看到吗一、前言 记录时间 [2024-4-11] 系列文章简摘#xff1a; Docker学习笔记#xff08;二#xff09;#xff1a;在Linux中部署Docker#xff08;Centos7下安装docker、环境配置#xff0c;以及镜像简单使用#xff09; Docker 学习笔记#xff08;三#xff09;#x…一、前言 记录时间 [2024-4-11] 系列文章简摘 Docker学习笔记二在Linux中部署DockerCentos7下安装docker、环境配置以及镜像简单使用 Docker 学习笔记三Centos7 中 Docker 使用镜像、容器以及操作等常用命令小结 Docker 学习笔记五梳理 Docker 镜像知识附带 Commit 方式提交镜像副本安装可视化面板 portainer
更多 Docker 相关文章请参考上面专栏哦入门篇 1~5 已完结接下来是精髓篇容器数据卷、Dockerfile、Docker 网络。 学习工具包
Docker 学习视频Docker 官方文档Docker 远程仓库Linux 云服务器/虚拟机FinalShell 远程连接工具 文章内容速览
本文主要介绍容器数据卷技术介绍数据卷的两种挂载方式体验匿名挂载与具名挂载的区别之处不仅实现了容器与宿主机的数据同步还实现了多个容器之间的数据同步具体有
数据卷的两种挂载方式1. 使用 -v 命令来挂载2. 使用 Dockerfile 构建。如何区分具名挂载 / 匿名挂载 / 指定路径挂载数据卷容器父容器介绍容器数据卷实战MySQL 的安装和数据同步。
关于数据卷技术的小结论 数据卷技术并不是简单的共享而是拷贝。 容器 – 容器容器之间配置信息的传递数据卷容器的生命周期一直持续到没有容器使用为止。 容器 – 宿主机一旦数据持久化到了本地本地的数据是不会删除的。 二、容器数据卷技术介绍
在之前的 Docker 学习中我们了解到
Docker 将应用和环境打包成一个镜像Docker 在容器中运行镜像Docker 容器之间是互相隔离的
由此引发一个问题如果容器被删除了容器中的数据会随之一起丢失怎么办
数据卷技术恰能解决此问题实现数据持久化。
通过将容器内的目录挂载到 Linux 上实现 Docker 容器中产生的数据同步到本地通过将容器挂载到父容器实现容器之间的数据共享。
以后修改容器内的配置文件在本地就可以完成不需要特地进入容器了。 三、命令挂载 / Dockerfile 挂载 数据卷的两种挂载方式1. 使用 -v 命令来挂载2. 使用 Dockerfile 构建。 Dockerfile 方式使用较多因为经常需要自己构建镜像若构建镜像时没有挂载卷则需要手动命令挂载。 1. 使用命令挂载
操作步骤
docker run -it -v 主机目录:容器内目录测试一下将 centos 容器的 /home 目录挂载到宿主机的 /home/ceshi 目录
docker run -it -v /home/ceshi:/home centos /bin/bash启动后通过 inspect 查看详细信息
docker inspect 容器id查看结果Mounts 下面就是 -v 命令挂载信息
Mounts: [{Type: bind,Source: /home/ceshi, # Source 主机内地址Destination: /home, # Destination docker 内容器地址Mode: ,RW: true,Propagation: rprivate}...
]测试数据卷文件同步 容器同步到宿主机2. 宿主机同步到容器 测试一容器同步到宿主机
在容器的 /home 文件夹下新建一个测试文件
touch test.java然后查看宿主机的 /home/ceshi 文件夹
cd /home/ceshi查看文件目录发现宿主机的文件夹中同时拷贝了这个测试文件结果如图所示 测试二宿主机同步到容器
停止该容器
exit在宿主机上修改这个文件内容先打开文件按住 i 键进入修改
# 先打开文件
vim test.java# 按住 i 键进入修改写入内容
Hello, Linux updated!# 按下 ESC 键保存文件并退出
:wq查看之前运行过的容器获取容器 id
docker ps -a启动并进入容器
# 启动容器
docker start 容器id# 进入容器
docker attach 容器id查看文件内容发现容器内的数据依旧是同步的。
cat /home/test.java2. 使用 Dockerfile 构建 Dockerfile 是一个命令脚本用于构建 Docker 镜像文件。 通过这个脚本可以生成镜像。镜像是一层一层的脚本是一个一个的命令所以每个命令都是一层。 在创建镜像之时就完成了数据卷挂载。 创建 Dockerfile 文件 Dockerfile 文件名可以随意但是建议使用 Dockerfile 在 /home 目录下新建 docker-test-volume 文件夹Dockerfile 在这个文件夹下构建镜像。
新建目录
mkdir docker-test-volumecd 进入目录创建 dockerfile1 文件
vim dockerfile1写入内容并保存退出
# 文件的内容 指令大写 参数
# 这里的每个命令就是镜像的一层# 基于镜像 centos
FROM centos# 数据卷挂载目录可以写多个
# 这里是匿名挂载
VOLUME [volume01,volume02]# 完成后 输出信息
CMD echo --------end----------# 进入容器控制台的方式
CMD /bin/bash查看下文件内容确定下有没有问题
cat dockerfile1构建 Docker 镜像
基于 dockerfile1在当前目录下生成 1.0 版本的 yuanyuan/centos 镜像。
# 最后的 . 表示 当前目录
docker build -f dockerfile1 -t yuanyuan/centos:1.0 .构建过程如下 不难发现它没有输出完整的构建过程信息比如 VOLUME比如 echo难道是构建有问题
笔者通过查看镜像以及镜像元数据发现数据卷挂载目录写入成功镜像也完成了创建构建没有问题。 查看一下刚刚构建的镜像吧
[rootlocalhost docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yuanyuan/centos 1.0 b19d22d998db 2 years ago 231MB详细构建过程查看
所以是它省略了步骤那如果要看详细的构建过程应该如何操作呢当然是添加参数啦。
方法一DOCKER_BUILDKIT0方法二--progressplain
拿上面的构建命令举例大家可以自行尝试一下。
# 方法一
DOCKER_BUILDKIT0 docker build -f dockerfile1 -t yuanyuan/centos:1.0 .# 方法二
docker build -f dockerfile1 -t yuanyuan/centos:1.0 --progressplain .启动容器并查看
启动容器并进入到容器中
docker run -it b19d22d998db /bin/bash进入目录查看如图可以看到挂载的两个数据卷目录已经生成了。这两个数据卷目录在容器外部一定有同步的目录。 查看宿主机同步情况
查找同步目录
在容器内进入 volume01 目录并创建测试文件
[roote773f0b76b59 /]# cd volume01
[roote773f0b76b59 volume01]# touch container.txt然后 exit 退出容器查看该容器的信息
docker inspect 容器id在 Mounts 中找到如下信息
Source 为外部宿主机的同步目录Destination 为容器中的同步目录
Mounts: [{Type: volume,Name: 20bef5da955e65c8ea65ded49b3baf14e5c92b5a02856c4c91a4cb6a98972556,Source: /var/lib/docker/volumes/20bef5da955e65c8ea65ded49b3baf14e5c92b5a02856c4c91a4cb6a98972556/_data,// Source 中即为外部宿主机的同步目录Destination: volume01,Driver: local,Mode: ,RW: true,Propagation: },// ......volume02 省略],在容器外部宿主机查看同步情况
进入 volume01 的 Source 目录查看情况同步成功了
[rootlocalhost docker-test-volume]# cd /var/lib/docker/volumes/20bef5da955e65c8ea65ded49b3baf14e5c92b5a02856c4c91a4cb6a98972556/_data
[rootlocalhost _data]# ls
container.txt四、匿名挂载 / 具名挂载
1. 匿名挂载
匿名挂载的配置方式为-v 容器内路径
运行一个 nginx 试试
# -P 表示随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx学习下 volume 如何使用
docker volume --helpvolume 使用方式如下
[rootlocalhost ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:create Create a volumeinspect Display detailed information on one or more volumesls List volumesprune Remove unused local volumesrm Remove one or more volumes
Run docker volume COMMAND --help for more information on a command.查看本地所有 volume 的情况
docker volume ls查看发现匿名挂载是很长一串。
因为 -v 只写了容器内的路径没有写容器外的路径。
[rootlocalhost ~]# docker volume ls
DRIVER VOLUME NAME
local 70addcda47d2d792fce62f674394a8a3df02042fbf5a8e05ed8462e8065d89d22. 具名挂载 通过具名挂载可以方便地找到卷大多数情况使用具名挂载 具名挂载的配置方式为-v 卷名:容器内路径
运行一个 nginx 试试
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx查看本地 volume 的情况可以看到具名挂载卷的名字是刚刚设置的 juming-nginx
[rootlocalhost ~]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx查看一下这个卷
docker volume inspect juming-nginx结果如下可以发现Docker 容器内的卷在没有指定路径情况下默认会在 /var/lib/docker/volumes/xxx/_data
[rootlocalhost ~]# docker volume inspect juming-nginx
[{CreatedAt: 2024-04-10T20:54:3708:00,Driver: local,Labels: null,Mountpoint: /var/lib/docker/volumes/juming-nginx/_data,Name: juming-nginx,Options: null,Scope: local}
]进入目录查看一下我们成功拿到了 nginx 的配置文件 nginx.conf
[rootlocalhost _data]# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params3. 如何区分 如何区分具名挂载 / 匿名挂载 / 指定路径挂载 -v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载4. 拓展读写权限
改变读写权限
# 通过 -v 容器内路径:ro rw 改变读写权限
ro read-only # 只读
rw read-write # 可读可写# 举个例子
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx一旦设置了容器权限容器对挂载出来的内容就会有限定。
/etc/nginx:ro 表示容器内的 /etc/nginx 会被挂载为只读模式意味着不能在容器内部对这个目录进行写操作。 五、数据卷容器父容器
1. 原理介绍
数据卷技术不仅可以完成容器和宿主机之间的同步也可以完成两个/多个容器之间的同步。
使用方式将一个容器挂载到另一个容器上被挂载的容器我们称之为父容器或数据卷容器。 2. 启动容器测试 通过上面 Dockerfile 制作的 yuanyuan 镜像我们启动 3 个容器来测试多个容器之间数据同步。 启动并进入容器 docker01
docker run -it --name docker01 yuanyuan/centos:1.0查看详细目录可以看到数据卷目录
[rootb3824bd95c81 /]# ls -l
total 56
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume01
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume02启动并进入容器 docker02
为了方便测试我们可以使用 FinalShell 创建多个 SSH 连接3 个都连接我们的 Linux第 1 个进入 docker01 容器第 2 个进入 docker02 容器。
我们把 docker01 作为数据卷容器docker02 挂载到 docker01 上。
# 挂载参数 --volumes-from
docker run -it --name docker02 --volumes-from docker01 yuanyuan/centos:1.0查看详细目录可以看到数据卷目录
[root6ff9c85ebd26 /]# ls -l
total 56
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume01
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume02启动并进入容器 docker03
docker03 也挂载到 docker01 上
# 挂载参数 --volumes-from
docker run -it --name docker03 --volumes-from docker01 yuanyuan/centos:1.0查看详细目录可以看到数据卷目录
[root2f1eead0d71f /]# ls -l
total 56
drwxr-xr-x 2 root root 4096 Apr 11 06:08 volume01
drwxr-xr-x 2 root root 4096 Apr 11 05:49 volume023. 测试容器间的数据同步 通过 --volumes-from可实现容器间的数据同步。 数据同步是双向的。 测试 docker01 docker02
在 docker01 容器的 volume01 卷中创建文件
[rootb3824bd95c81 /]# cd volume01
[rootb3824bd95c81 volume01]# touch docker01在 docker02 容器的 volume01 卷中查看
可以看到docker01 中创建的内容同步到了 docker02 上。
[root6ff9c85ebd26 /]# cd volume01
[root6ff9c85ebd26 volume01]# ls
docker01测试 docker02 docker01
在 docker02 容器的卷中创建文件
[root6ff9c85ebd26 volume01]# touch docker02在 docker01 容器的卷中查看
可以看到docker02 中创建的内容同步到了 docker01 上。
[rootb3824bd95c81 volume01]# ls
docker01 docker02测试 docker03 docker01 / 02
在 docker03 容器的卷 volume01 中创建文件
touch docker03分别在 docker01 和 docker02 容器的 volume01 卷中查看
可以看到docker03 中创建的内容同步到了 docker01 和 docker02 容器上。 4. 删除父容器
删除 docker01 容器
[rootlocalhost ~]# docker rm -f docker01在 docker02 / docker03 容器中查看数据卷发现文件依然存在它们依然可以访问这个数据卷。
[root6ff9c85ebd26 volume01]# ls
docker01 docker02 docker03这说明数据卷技术并不是简单的共享而是拷贝。
docker02 和 docker03 是把 docker01 中的数据卷拷贝了一份到自己那里。
注意就算此时父容器 docker01 被删除了docker02 和 docker03 依然能够实现数据同步 容器 – 容器容器之间配置信息的传递数据卷容器的生命周期一直持续到没有容器使用为止。
容器 – 宿主机一旦数据持久化到了本地本地的数据是不会删除的。 六、MySQL 实战 实战MySQL 的安装和数据同步思考MySQL 的数据持久化问题。 1. 安装 MySQL
获取镜像
获取镜像下载 MySQL
docker pull mysql:5.7运行容器
在 docker hub 上查看如何使用 mysql参考这里
docker run --name some-mysql -e MYSQL_ROOT_PASSWORDmy-secret-pw -d mysql:tag运行容器需要做数据挂载注意安装启动 mysql 需要配置密码
-d后台运行-p端口映射-v卷挂载-e环境配置--name容器名字
注意命令中的斜杠 \ 是在一条命令没写完但是要进行换行情况下使用如果命令写在同一行就不需要斜杠。
docker run -d -p 3346:3306 \
-v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD123456 --name mysql01 mysql:5.7测试连接
测试一下自己电脑上能不能连接成功
使用数据库工具比如 Navicat、WorkBench 之类的测试一下
输入宿主机的 ip还有映射的端口号 3346以及用户名和密码
在本地创建一个数据库 test Linux 中查看容器挂载目录 /home/mysql/data发现数据库 test 完成了同步
说明映射路径是正确的 删除容器
删除 mysql01 容器
docker rm -f mysql01然后查看 /home/mysql/data 目录发现挂载的数据卷依然存在不会和容器一起删除。
实现了数据持久化功能 2. 多个 MySQL 实现数据同步
启动两个 mysql 容器让他们实现数据同步
先启动容器 mysql01配置一下容器内数据卷路径
docker run -d -p 3346:3306 -v /etc/mysql/conf.d -v /var/lib/mysql \
-e MYSQL_ROOT_PASSWORD123456 --name mysql01 mysql:5.7再启动 mysql02把 mysql02 挂载到 mysql01 上
docker run -d -p 3346:3306 \
-e MYSQL_ROOT_PASSWORD123456 --name mysql02 --volumes-from mysql01 mysql:5.7注意
端口设置一样的话相当于两个容器共用一个数据库。无论是在本地连接还是各自容器内查看它们的内容都保持一致。
但不能同时启动因为端口同一时刻只能分配给一个容器。 七、总结
本文主要介绍了容器数据卷技术介绍了数据卷的两种挂载方式体验了匿名挂载与具名挂载的区别之处不仅实现了容器与宿主机的数据同步还实现了多个容器之间的数据同步。初学入门挑战容器数据卷技术一文通。 一些参考资料
狂神说系列 Docker 教程https://www.bilibili.com/video/BV1og4y1q7M4/
Docker 官方文档https://docs.docker.com/engine/install/centos/
Docker 远程仓库https://hub.docker.com/
FinalShell 下载http://www.hostbuf.com/t/988.html