3 . docker容器的数据卷
3.1 数据卷概念
思考:
• Docker 容器删除后,在容器中产生的数据也会随之销毁
• Docker 容器和外部机器可以直接交换文件吗?
• 容器之间想要进行数据交互?
数据卷
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
数据卷的作用
• 容器数据持久化
• 外部机器和容器间接通信
• 容器之间数据交换
3.2 配置数据卷
创建启动容器时,使用 –v 参数 设置数据卷
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
注意事项:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 一个容器可以挂载多个数据卷
- 一个数据卷也可以被多个容器挂载
- 两个容器可以挂载同一个容器
在宿主机中实现与容器目录的挂载:
在c1容器中的root目录下就可以看到data_container文件夹:如下图
同时我们我们回到宿主机中,可以在data文件夹下创建一个文件oldlu.txt ,可以发现在容器中也会生成oldlu.txt文件:如下图
- 数据卷的持久化:
当我们把c1容器删除后,宿主机中的数据卷依然存在。 所以当我们重新创建一个容器的同时依然可以挂载宿主机中的data文件夹,对应data里的数据依然同步到容器中。
- 一个容器可以挂载多个数据卷
- 多个容器可以挂载同一个数据卷
分别创建两个容器,两个容器都挂载宿主机中data目录,当 修改c3容器的data目录c4会实现同步。
从而实现两个容器之间的交互。
3.3 配置数据卷容器
多容器进行数据交换
- 多个容器挂载同一个数据卷
- 数据卷容器
步骤:
1.创建启动c3数据卷容器,使用 –v 参数 设置数据卷
docker run –it --name=c3 –v /volume centos:7 /bin/bash
创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷
docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bash docker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash
3.4 数据卷小结
- 数据卷概念
•宿主机的一个目录或文件 - 数据卷作用
• 容器数据持久化
• 客户端和容器数据交换
• 容器间数据交换 - 数据卷容器
• 创建一个容器,挂载一个目录,让其他容器继承自该容器( --volume-from )。
• 通过简单方式实现数据卷配置
4. 应用部署
参考资料中docker应用部署
5. Dockerfile
前面的课程中已经知道了,要获得镜像,可以从Docker仓库中进行下载。那如果我们想自己开发一个镜像,那该如 何做呢?答案是:Dockerfifile
Dockerfifile其实就是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfifile文件并根据Dockerfifile文 件的描述来构建镜像。
5.1 Docker 镜像原理(了解)
思考:
- Docker 镜像本质是什么?
是一个分层文件系统 - Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G? ?
Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
- Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB? ?
由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的
tomcat镜像大小500多MB
Linux操作系统:文件系统
Linux : 内核态 (cpu),用户态(内存,硬盘)
5.2 镜像制作
5.2.1 容器转为镜像
- 使用docker commit命令可以将容器保存为镜像。
命令形式:docker commit 容器名称 镜像名称
eg: docker commit 381827f60f70 itheima_tomcat:1.0
- 使用docker save命令可以将已有镜像保存为tar 文件。
命令形式:docker save –o tar文件名 镜像名
docker save -o itheima_tomcat:1.0.tar
- 使用docker load命令可以根据tar文件恢复为docker镜像。
命令形式:docker load -i tar文件名
# 加载恢复镜像 docker load -i itheima_tomcat.tar # 在镜像恢复之后,基于该镜像再次创建启动容器 docker run -di --name=new_tomcat -p 8080:8080 itheima_tomcat:1.0
注意:新的镜像制作后,原本容器中挂载的目录将失效, 索引一般在恢复镜像创建容器容器的时候需要重新挂载。
5.3 Dockerfile 概念
- Dockerfile 是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件
构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝移植
Dochub网址:https://hub.docker.com
关键字:
关键字 | 作用 | 备注 |
FROM | 指定父镜像 | 指定dockerfile基于哪个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
5.4 Dockerfile 案例
需求1:
自定义centos7镜像。要求:
- 默认登录路径为 /usr
- 可以使用vim
实现步骤:
① 定义父镜像:FROM centos:7
② 定义作者信息:MAINTAINER itheima itheima@oldlu.cn
③ 执行安装vim命令: RUN yum install -y vim
④ 定义默认的工作目录:WORKDIR /usr
⑤ 定义容器启动执行的命令:CMD /bin/bash
⑥ 通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本
Dockerfile文件:
文件编写完成执行命令构建:
docker build -f ./centos_dockerfile -t itheima_centos:1 .
需求2:
定义dockerfile,发布springboot项目
实现步骤
① 定义父镜像:FROM java:8
② 定义作者信息:MAINTAINER itheima itheima@oldlu.cn
③ 将jar包添加到容器: ADD springboot.jar app.jar
④ 定义容器启动执行的命令:CMD java –jar app.jar
⑤ 通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本
文件编写完成执行命令构建:
docker build -f ./springboot_dockerfile -t app .
6. 服务编排
6.1 服务编排概念
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。
- 要从Dockerfile build image 或者去dockerhub拉取image
- 要创建多个container
- 要管理这些container(启动停止删除)
- 服务编排: 按照一定的业务规则批量管理容器
6.2 Docker Compose 概述
6.2.1 Docker Compose
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建 ,启动和停止。使用步骤:
- 利用 Dockerfile 定义运行环境镜像
- 使用 docker-compose.yml 定义组成应用的各服务
- 运行 docker-compose up 启动应用
6.2.2 Docker Compose 安装使用
参考《docker-compose》
7. Docker 私有仓库
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像 到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜 像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
搭建参考《docker 私有仓库.md》
8. Docker相关概念
docker容器虚拟化 与 传统虚拟机比较:
dubbo和rockeMQ有什么区别,分不清楚准备用现成的
知道做了什么,命令记不住, -e之类的缩写记不住意思.独立完成困难