Docker 快速入门(一)https://developer.aliyun.com/article/1469454
Docker镜像讲解
镜像是什么
镜像是一种轻量级可执行的独立软件包,用来打包软件运行环境和基于环境发开的软件,它包含运行某个软件所需要的内容,包括代码,运行时,库,环境变量,配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来
如何获得镜像:
- 从远程仓库下载
- 朋友拷贝
- 自己制作镜像dockerfile
Docker镜像加载原理
UnionFS 联合文件系统
Docker镜像加载的原理
分层理解
分层的镜像
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到一层层的下载,
我们会发只会下载一些新的,之前老的都是可以复用的
Docker的分层
每个操作系统都有自己的储存方式
docker上我们的操作可以是再镜像层面的基础上新加了一层,
docker镜像的特点
docker的镜像一般都是只读状态的,我们run起来的容器,都是再容器层面,新写的层面会被加到顶部。
所以我们的所有操作都是基于容器的,容器基于一个基本的镜像,
理解了这些我们再去提交一个属于自己的镜像
COMMIT镜像
docker commit 提交哦让其成为一个新的副本 #命令和git的原理类似 docker commit -m = “提交的描述i星系” -a =“作者” 容器id 目标的镜像名字:【tag】
实战测试:打包一个webapps下有文件的 tocmat上去
#1 启动一个tomcat #2 之前发现的问题,我们的tomcat下默认是没有文件的,都放在 webapps.dist虚下,每次我们都需要去将这个文件夹中的东西去复制到webapps中,十分的麻烦。 #3我自己将文件拷贝到了基本文件 #4 我自己拷贝的镜像我提交了。这个比较好用,我直接提交上去用我提交的我觉得舒服的镜像
到了这里就算是入门Docker
容器数据卷
什么是容器的数据卷
docker的理念回顾
将应用环境打包成一个镜像!
数据 如果数据在容器中,我们容器删除的话,数据也会跟着消失 需求 :需要持久化
MySql 容器删除=删库跑路 需求:MySql数据可以存储到本地!
容器之间可以有一个数据空想的技术,docker容器中产生的数据,同步到本地
删除容器数据不会消失,这个就是卷技术
目录的挂载,将我们的容器内的目录,挂在到linux上!
容器需要持久化和同步操作,容器间也可以数据共享
使用数据卷
方式1:直接使用命令来挂在 -v
docker run -it -v 主机目录:容器目录 #挂载测试 docker run -it -v /dockerTest/ceshi/:/home centos /bin/bash #查看容器元数据 docker inspcet 容器id
可以看到卷的挂载信息
绑定信息确认之后,我们来试试是不是真的成功了
绑定成功,之后我们测试,就是是不是容器停止下来数据还能有数据嘛?
我们这里在服务器的testjava文件中写点内容
之后去启动容器看看是否 同步
同步成功!!!
到这里我们就实现了数据卷的数据持久化操作,只要容器不消失,关闭之后再次打开也是可以看更改的内容的。
实战安装mysql
mysql持久话的问题
#拉去mysql的镜像 docker pull mysql:5.7 #启动挂载mysql的容器 mysql是必须要有密码的 #官方的测试 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag # -e 我们这里可以看到,我们需要配置环境的时候,就可以用-e来配置 docker run -d -p 3310:3306 -v /dockerTest/mysql/conf:/etc/mysql/conf.d -v /dockerTest/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 #-d 是后台挂在 #-p 映射端口 #-v 卷挂载 #--name 容器名字 #--e 配置环境,mysql密码 #启动成功之后打开数据库连接工具连接docker的mysql #navicat 连接 服务器的3310(映射的docker 3306)连接成功 #测试本地创建数据库,查看是否data的内容映射到成功
哪怕我们将容器删除,我们挂载到本地的数据是不会丢失的,这就实现了容器持久化。
具名挂载和匿名挂载
#匿名挂载 -v 容器内路径 docker run -d -P --name nginx01 -v /etc/nginx nginx #查看卷(volume)的信息 docker volume ls #这里发现数据都是没有名字的,这里我们没有设置本机的路径,-v只写了容器内的路径,这个就是匿名挂载 #具名挂载 docker run -d -P -v juming-nginx:/etc/nginx nginx 查看卷信息 docker volume ls local 10f1524cc8295a9e7dfd75c88dab113395da11959756738bf121b5733ac2be70 local 24439de8b83f5493f971314bc3e5ca0e8f60d14a338ee19c7e35910403ade730 local juming-nginx 可以看到我们刚才的设置的 #通过 -v 卷名 : 容器内路径 #查看一下这个卷
所有的docker容器内的卷,,没有指定目录,就都会放在/var/lic/docker/volumes/xxx/_data
我们通过具名挂载可以很轻松拿出来配置。大多数的时候我们都是具名挂载
#如何区分具名挂载,匿名挂载,和绝对路径挂载 -v 容器内路径 #匿名挂载 -v 卷名 :容器内路径 #具名挂载 -v /宿主机路径:容器路径 #指定路径挂载
拓展
#通过 -v 容器内的路径ro ow改变读写权限 ro readonly #只读 rw redwrite #可读可写 #一旦设置了容器权限,容器对我们挂载出来的内容就有限顶了 #ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的
初识dockerfile
dockerfile 就是通过构建docker 镜像的构建文件,命令脚本,
通过脚本可以生成镜像,镜像是一层一层的,脚本就是一个个命令,每个命令就是一层
#创建一个dockerfile 的文件,名字可以随意,建议dockerfile #文件中的内容 大写 FROM centos VOLUME ["volume01","volume02"] CMD echo "------end-------" CMD /bin/bash #这里的每个指令就是镜像的一层
启动i自己的容器
这个卷和外部一定有一个同步的目录
这个是匿名挂载
我们要找的话一定是一段很长的乱码
找到卷挂载的命令
容器同步成功
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像
假设构建的时候没有挂载卷,要手动镜像挂载,-v 卷名:容器路径!
数据卷容器
容器之间同步数据
我们要打开三个容器,启动第一个:可以看到我们挂载的两个容器
这里我们跑起来容器
docker run -it --name docker02 --volumes-from docker01 2dd933a342b1
挂载我们的docker01
我们可以看到docker02的里面也有之前两个挂载的容器
我们在docker01新增volume01新建个文件夹 docker01,在docker02中也可以看见
这里是docker02查看volume1 的内容
可以看出已经很明显了,挂载成功,这个时候我们docker01就是数据卷容器同时也是docker01容器
只要还有容器在挂载数据就不会丢失
多个mysql实现数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 #mysql02挂载mysql01 docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 --volumes-from mysql01 mysql:5.7
结论:
容器之间配置信息,数据卷容器的生命周期一直持续到没有容器位置
但是一旦持久化到了本地, 就不会消失
dockerfile
dockerfile介绍
用来构建docker 镜像的
构建步骤:
- 编写一个docker file 文件
- docker build 构建成一个镜像
- docker run 运行镜像
- docker push 发布镜像(Docker hub 阿里云镜像)
我们来看看官方是怎么做的
很多官方的镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
官方可以制作镜像,那我们也可以
DockerFile构建过程
基础知识:
- 每个保留关键字,指令都必须是大写字母
- 执行从上到下执行
- #表示注释
- 每个指令都会创建提交一个新的镜像层
dockerfile是面向开发的,我i们以后需要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单。
我们要掌握dockerfile 就基本可以掌握常用的docker镜像企业交付了
dockerfile :构建文件,定义了一切步骤,源代码
dockerimages:通过dockerfile生成的镜像,最终发布和运行的产品
docker容器:容器就是镜像运行起来,提供服务的
Dockerfile的指令
FROM # 基础镜像,一切从这里开始构建 MAINTAINER # 镜像是谁写的, 姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 保留端口配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令 ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令 COPY # 类似ADD, 将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量!
Docker 快速入门(三)https://developer.aliyun.com/article/1469457