一、什么是镜像
镜像是一种轻量级、可执行的独立软件包、用来打包软件运行环境和基于运行坏境开发的软件,他包含运行某个所需要的所用内容,包裹代码、运行时、库、环境变量和配置文件。
所用的应用,直接打包成docker镜像、就可以直接跑起来!
二、如何得到镜像
1.从远程仓库下载
2.朋友拷贝给你
3.自己制作一个镜像DockerFile
三、镜像加载原理
UnionFS(联合文件系统)
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并高性能的文件系统,它支持对文件系统的修改做为一次提交来层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种的应用镜像
特性:一次同时可以加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所用底层的文件和目录
四、commit镜像
docker commit 提交容器成为一个新的的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
1.启动一个默认的tomcat
2.发现这个默认的tomcat 是没有webapps应用,镜像的原因,官方的镜像默认webapps下面试没有文件的!
3.我自己拷贝进去了基本的文件
4.将我们操作过的容器通过commit提交为一个镜像!我们以后就使用我们修改过的镜像即可,这就是我们自己修改过的镜像
入门基本Docker
五、容器数据卷
一、什么是容器数据卷
docker理念:将应用和坏境打包成一个镜像!
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地!
这就是卷技术!也就是目录挂载,将我们容器内的目录,挂载到到本地上(Liunx上面)
六、使用数据卷
方法一:直接使用命令来挂载 -v
docker run it -v 主机目录:容器目录
测试
[root@iZwz9b96gsillkg6v5gbmjZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
七、安装mysql
下载mysql
docker pull mysql:5.7
1.容器运行,需要做数据挂载,安装启动mysql,需要配置设置密码,这是要注意点
官方测试,docker run --name mysql01 -e MYSQL_ROOT_PASSWWORD="自己要设置的密码" -d mysql:5.7
启动我们的mysql5.7 并挂载
[root@iZwz9b96gsillkg6v5gbmjZ ~]# docker run -d -p 3305: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
假设我们的容器删了
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
八、具名和匿名挂载
匿名挂载
-v 容器内路径 -P 是水机容器端口
docker run -d -p 端口 --name nginx01 -v /etc/nginx nginx
#查看所用的volume(镜像) 的情况
[root@iZwz9b96gsillkg6v5gbmjZ ~]# docker volume ls
#这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容纳器外的路径
具名挂载
[root@iZwz9b96gsillkg6v5gbmjZ ~]# docker run -d -P --name nginx01 -v jiuti_ming:/etc/nginx nginx
[root@iZwz9b96gsillkg6v5gbmjZ ~]# docker volume ls
local e2a3a1121c4ffa38243332fdb984f9969e13719e70923e72feee6d196f0ade5e
local jiuti_ming
#通过 -v 卷名:容器内路径
#查看一下这个有卷名的卷
#查看一下这个没有卷名的卷
所用的docker容器内的卷,没有指定目录的情况下都在`/var/lib/docker/volumes/xxx/_data`下面
#我们通过具名挂载可以方便找到我们的一个卷,大多数情况下我们使用的是具名挂载
区分具名挂载还是匿名挂载,还是指定路径挂载
# -v 容器内的路径 匿名挂载
# -v 卷名:容器内路径 具名挂载
#-v /宿主机路径:容器内路径 指定路径挂载
扩展
#通过- v 容器内路径,ro , rw 改变读写权限
ro #只读
rw #可读可写
#一旦这个设置了容器的权限,容器对我们挂载出来的内容就有了限定了
docker run -d -p --name nginx01 -v juming_nginx01:/etc/nginx:ro nginx
docker run -d -p --name nginx01 -v juming_nginx01:/etc/nginx:ro nginx
# ro只要看到ro就说明这个路径只能通过宿主机来操作,容器内是无法操作的
九、数据容器卷
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
但是,一旦持久化到本地,这个时候,本地数据是不会删除的
例如:创建一个容器 ,条件 存在一个容器song
创建容器
docker run -d -p 3305:3306 -e MYSQL_ROOT_PASSWORD=12456 -name mysql02 --volumes-form song mysql:5.7
#这样可以实现,两个容器可以同步,是通过--volumes-form 来同步的,其实就是一个拷贝的原理