DockerFile
Docker镜像加载原理
UnionFS:封层、轻量级并且高性能的文件系统。支持对文件系统的修改和提交来一层层叠加
Docker的镜像其实就是一层一层的文件系统组成
对一些精简的OS,rootfs可以很小。只需要基本的命令。工具和程序库。底层直接用Host的kernel
Docker分层理解
如果有之前已有的文件层,不会重复下载,而是进行复用。类似叠加的操作
提交分层镜像 Commit
1.启动一个默认的tomcat
2.将一些文件拷贝进去
3.将容器作为一个新的镜像进行commit
4.想要保存当前的容器状态,就可以通过commit来提交,获得一个镜像
1
2
3
4
image-20200524161949673
Docker容器数据卷
定义
docker的理念:将应用和环境打包成一个镜像!
如果剧都在容器中,那么容器删除,数据就会丢失 —> 需求,数据可以持久化
容器之间可以由一个数据共享的技术!Docker容器中产生的数据,同步到本地
将容器内的目录,挂载到linux上面。
总结:容器的持久化和同步操作!容器间可以实现数据共享!
使用数据卷
方式一:使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
# 挂载本地与容器
docker run -it -v /home/test:/home centos /bin/bash
#启动后用docker inspect进行测试
1
2
3
4
5
image-20200524162909989
运行结果:
image-20200524163111581
同理,宿主主机上的文件修改也会在容器中同步。
以后修改只需要在本地修改即可:容器内会自动同步
安装MySQL
注意需要配置一个初识密码密码
#设置初识密码
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# -d 后台运行
# -p 端口映射
# -v 数据卷挂载
# -e 设置mysql的初识密码
# --name 设置运行时的进程名
1
2
3
4
5
6
7
8
9
10
11
image-20200524165806722
删除容器后,挂载到本地的数据卷依旧会被保留 — 实现了数据的持久化
# 匿名挂载:没有起名字 -- 仅指明了容器内的数据目录 -- etc/var
# -P 随机端口映射
docker run -d -P --name nginx-1 -v etc/var nginx
# 具名挂载,通过 -v 加上容器内路径 -- 建议使用
1
2
3
4
5
大部分时候都是用具名挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载
1
2
3
拓展
# 通过 -v 容器内路径:ro rw 改变读写权限
ro -- 只读
rw -- 可读可写
# 一旦设置了容器权限,容器对我们挂载的内容就有限定了
# ro 只能通过宿主主机来操作
1
2
3
4
5
6
DockerFile初识
DockerFile是用来构建docker镜像的构建文件!命令脚本
通过脚本生成镜像,镜像是一层层的,脚本的一个个命令,都是一层
docker build -f dockerfile1 -t dennis/centos:1.0 .
#其中dockerfile1的内容如下。指令都是大写的
FROM centos
VOLUME ["volume1","volume2"]
CMD echo "-----end---"
CMD /bin/bash
#这里的每个命令就是镜像的一层
1
2
3
4
5
6
7
8
9
image-20200524171423832
image-20200524171836720
这个卷和外部一定有一个同步的目录! — 匿名挂载
image-20200524172405409
这是一个匿名挂载卷
数据卷容器
多个mysql共享数据!
利用一个容器实现多个容器之间的数据共享
#在创建容器的时候使用命令 --volumes-from [容器1]
新创建的容器会与容器1的数据进行同步。 --- 这里的容器1就是数据卷容器
1
2
# 实验,删除了最开始链接的dennis1之后,dennis2与dennis3之间还是可以保持数据共享
1
image-20200524173651079
这是一种备份的机制
多个mysql数据共享
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3311:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
#这个时候,可以实现两个容器的数据同步