镜像是什么?
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,它包含运行某个软件所需的内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像?
1、从远程仓库下载
2、他人拷贝给你
3、自己制作一个dockerfile
docker镜像加载原理:
Docker镜像加载原理
简单介绍这个图:
bootfs(boot file system) 主要包含bootloader和kernel, bpotloader 主要是引导加载kernel,当我们加载镜像的时候,会通过bootloader加载kernal,Docker镜像最底层是bootfs,当boot加载完成后整个kernal内核都在内存中了,bootfs也就可以卸载,值得注意的是,bootfs是被所有镜像共用的,许多镜像images都是在base image(rootfs)基础上叠加的
rootfs (root file system),在bootfs之 上.包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是 各种不同的操作系统发行版,比如Ubuntu, Centos等等 。
分层理解
真正干活的是docker上的容器,不同容器都有一个共同的镜像,这个镜像有不同层级,每个层级都有自己的内容,可以共用,docker根据不同的需求来叠加镜像,从而对外暴露一个整体的镜像,每个容器都是精简版的linux系统,bootfs相当于鲸鱼的背,各容器内核kernal共用
如何提交自己的镜像?
commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m='提交的描述信息' -a='作者' 容器id 目标镜像名:TAG
实战测试:
#启动一个默认的tomcat
#发现这个默认的tomcat是没有webapps应用,镜像的原因,官方默认的tomcat webapps下面是没有文件的!
#我自己手动拷贝进去了基本的文件
#将我们操作过的容器通过commit 提交作为一个镜像!我们以后就可以使用改动过的镜像就可以了
docker commit -a='zhangjicheng' -m='add webapps app' cb56c60b02a9 tomcat1.0
学习方式说明:理解概念,但是一定要实践。最后实践和理论相结合一次搞定这个知识!
容器数据卷
什么是容器数据卷?
docker理念回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中那么我们的容器删除数据都会丢失!需求:数据可以持久化
Mysql ,容器删了,删库跑路!需求:Mysql 数据可以保存在本地!
容器之间可以有一个数据共享的技术,docker 容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到linux上面!
image.png
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
使用容器卷
方式一:直接使用命令来挂载 -v
###docker run -it -v 主机目录,容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash #启动centos镜像
docker inspect b5b85562ddfd #进入容器内部
可以看到具体的卷是如何挂载的
测试一下文件的同步:
容器内添加一个test.java
容器外部:
注意:这个卷的同步是双向同步的;外部修改内部也会同步!即使容器是停止的!
好处:我们以后只需要修改在本地的文件即可,容器内就会自动同步!
实战:安装Mysql
1、获取镜像: docker pull mysql:5.7
2、运行容器并挂载文件路径; 安装mysql是需要配置密码的,这是需要注意的
官方的一个测试:#-e 配置文件
-d:后台运行
-p:端口映射
-v:卷挂载
-e:环境配置
--name:容器名字
[root@VM-0-11-centos ceshi]# docker run -d -p 3306:3306 -v /home/mysql/config:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql001 mysql:5.7
image.png
如果出现启动失败端口映射错误的话:
netstat -tanlp
sudo kill 进程号
查看占用3306端口的进程并杀掉这个进程
启动成功之后;测试一下外部链接内部容器mysql:
说明:DataGrip链接mysql过程 :
先链接打服务器的 3306端口----3306和容器内的3306映射,这个时候我们就可以链接上了
验证交互:
注意:假设我们将容器删除。我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!
具名和匿名挂载
匿名挂载
-v 容器路径!
docker run -d - P --name nginx01 -v /etc/nginx nginx
查看所有的卷的情况
docker volume ls
这里发现,这种就是匿名挂载,我们在-v 只写了容器内的路径,没有容器外的路径!
具名挂载
docker run -d -P --name nginx002 -v juming-nginx:/etc/nginx nginx
image.png
通过 -v 卷名:容器内路径
查看一下这个卷 docker volume inspect 卷名 #进入到这个卷里面
所有的docker容器内的卷,没指定目录的情况下都在 /var/lib/docker/volumes/卷名***/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用 具名挂载!
如何确定是具名挂载还是匿名挂载?还是指定路径挂载?
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径 :容器内路径 #指定路径挂载!
扩展:
通过 -v 容器内路径:ro rw 改变读写权限
ro 只能读
rw 可读可写
一旦设置了权限 容器对我们挂载出来的容器就有了限定了!
docker run -d -P --name nginx002 -v juming-nginx:/etc/nginx :ro nginx
docker run -d -P --name nginx002 -v juming-nginx:/etc/nginx :rw nginx
ro 只要看到ro 就说明这个路径只能通过宿主机来操作,容器是无法操作的!
初识Dockerfile
Dockerfie 就是用来构建docker镜像的构建文件!命令脚本!先体验一下
通过这个脚本可以生成镜像,镜像是一层一层的,脚本命令也是一层一层的
步骤:
1、创建一个dockerfile文件,名字可以随机 建议dockerfile
2、文件中的内容 指令(大写) 参数;这里的每个命令都镜像的一层!
FROM centos
VOLUME ["/volume01","/volume02"] #匿名挂载
CMD echo "**********make***********"
CMD /bin/bash
3、执行命令:docker build -f /home/docker-test-volume/dockerfile -t kuangshen/centos .
测试:启动一下我们自己创建的容器:
查看挂载文件是否存在:
容器内新建test.txt文件:
容器外同步:
这种方法我们未来使用的会非常的多,因为我们通常会构建自己的镜像!
假设构建镜像时候没挂载卷,要手动挂载 -v 卷名:容器内路径!
数据卷容器
两个mysql 甚至多个mysql数据共享
启动3个容器来测试一下
在docker01上创建文件 docker02上也同步验证:
通过--volumes -from 数据卷 就可以实现多个容器数据共享;数据共享只要有一个容器没删除,数据共享的文件就不会丢失!
多个mysql可实现数据共享
docker run -d -p 3306:3306 -v /home/mysql/config:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql001 mysql:5.7
docker run -d -p 3336:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes -from mysql001 mysql:5.7
这个时候,可以实现两个容器同步!
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!