将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面!
**总结: **容器的持久化和同步操作!容器间数据也是可以共享的!
使用数据卷方式一: 直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录 [root@QCSJdeLinux ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
测试文件的同步(在主机上改动,观察容器变化)
再来测试(测试通过)
- 停止容器
- 主机上修改文件
- 启动容器
- 容器内的数据依旧是同步的!
# 获取镜像 [root@QCSJdeLinux ~]# docker pull mysql:5.7 # 运行容器, 需要做数据挂载! # 安装启动mysql,需要配置密码(注意) # 官方测试, docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag # 启动我们的 -d # 后台运行 -p # 端口隐射 -v # 卷挂载 -e # 环境配置 --name # 容器的名字 [root@QCSJdeLinux ~]# docker run -d -p 3306: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 # 启动成功之后,我们在本地使用navicat链接测试一下 # navicat链接到服务器的3306 --- 3306 和 容器的3306映射,这个时候我们就可以连接上mysql喽!具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /ect/nginx nginx
# 查看所有卷的情况
[root@QCSJdeLinux ~]# docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!
# 具名挂载
[root@QCSJdeLinux ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
[root@QCSJdeLinux ~]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
docker volume inspect juming-nginx
[root@QCSJdeLinux ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2020-08-12T18:15:21+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况都是在/var/lib/docker/volumes/xxx/_dat
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载! -v 容器内路径 # 匿名挂载 -v 卷名:容器内路径 # 具名挂载 -v /宿主机路径:容器内路径 # 指定路径挂载!
拓展:
# 通过 -v 容器内路径:ro rw 改变读写权限 ro readnoly # 只读 rw readwrite #可读可写 # 一旦这个设置了容器权限,容器对我们挂载出来的内容就有限定了! docker run -d -P --name nginx02 -v juming-niginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v juming-niginx:/etc/nginx:rw nginx # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的!Dockerfile
Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像
# 创建一个dockerfile文件, 名字可以随机 # 文件的内容 指定(大写) 参数 FROM centos VOLUME ["volume01", "volume02"] CMD echo "----end----" CMD /bin/bash # 这里的每一个命令都是镜像的一层!
创建自己的镜像:
docker build -f dockerfile1 -t qcsj/centos
启动自己的容器
docker run -it qcsj/centos /bin/bash ls -al #这个时候下面会有两个目录,就是我们生成镜像的时候自动挂载数据卷目录 volume01 volume02
docker inspect 容器id
测试一下刚才的文件是否同步到主机上了!
这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
数据卷容器实现数据同步就用--volumes-from就可以实现数据共享
# 启动三个容器,通过我们自己的镜像 docker run -it --name docker01 qcsj/centos docker run -it --name docker02 --volumes-from docker01 qcsj/centos # 这时候就做到容器间数据同步了,在docker02下也有两个volume01 和 volume02文件了
多个mysql之间实现数据共享
[root@QCSJdeLinux home]# docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 [root@QCSJdeLinux home]# docker run -d -p 3307:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
结论:
- 容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。
- 但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
dockerFile是用来构建docker镜像的文件!命令参数脚本!
构建步骤
-
编写一个dockerFile文件
-
docker build 构建成为一个镜像
-
docker run 运行镜像
-
docker push 发布镜像(DockerHub、阿里云镜像)
基础知识:
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
dockerfile是面向开发的,我们以后发布项目,做镜像,就要编写dockerfile文件,这个文件十分简单
-
DockerFile:构建文件,定义了一切的步骤,源代码
-
DockerImages:通过Dockerfile构件生成的镜像,最终发布和运行的产品!
-
Docker容器:容器就是镜像运行起来提供服务器
FROM # 基础镜像,一切从这里开始构建。比如centos MAINTAINER # 镜像是谁写的,姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOST # 暴露端口的配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令。 COPY # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量
创建一个自己的centos
# 1. 编写Dockerfile的文件 [root@QCSJdeLinux dockerfile]# cat mydockerfile-centos FROM centos MAINTAINER QCSJ<1731691002@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH # 镜像的工作目录 RUN yum -y install vim # 添加 vim 命令 RUN yum -y install net-tools EXPOSE 80 # 暴露80端口 CMD echo $MYPATH CMD echo "---end---" CMD /bin/bash # 2. 通过这个文件构建镜像 # 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] . [root@QCSJdeLinux dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 . Successfully build d2d9f0ea8cb2 Successfully tagged mycentos:0.1 # 我们在运行我们的镜像就有了ifconfig 和 vim命令了 docker run -it mycentos:0.1
CMD 和 ENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令



