- 本文仅用作自己在学习路上遇到问题、解决问题方面的记录。如被提供给同样在此方面遇到问题的同学参考,不胜荣幸。若文中有出现纰漏不够严谨之处,望海涵。意见之处,不吝赐教。
一、Docker的介绍及安装
1、什么是Docker
Docker是基于Go语言实现的云开源项目
Docker的主要目标是一次封装、到处运行
Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置,到处使用。
2、Docker能干吗
以前的虚拟机:
- 缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
Docker与传统虚拟机的区别:
- 传统虚拟机技术是虚拟化一套硬件后,在其上运行一个完整的操作系统,在该系统上再运行所需应用进程
- 容器内的应用进程直接运行于宿主的内核。容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更为轻便。
- 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源
3、实际的运行
- 更高效、更可预测
- 运维层面的产品,更简单的系统运维
- 应用更快速的部署
4、Docker的基本组成
4.1、镜像(image)
Docker镜像就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器
4.2、容器(container)
Docker利用容器独立运行的一个或者一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做一个简易版的Linux环境(包括Root权限、进程空间、用户空间等)和运行在其中的应用程序。容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是刻度、可写的。
4.3、仓库(repository)
仓库是集中存放镜像文件的场所。仓库分为公开和私有。仓库和仓库注册服务器是有所区别的。仓库注册服务器上存放多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。
二、Docker镜像介绍
1、镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包含代码、运行时、库、环境变量和配置文件。
1.1、UnionFS
UnionFS(联合文件系统):一种分层,轻量级并且高性能的文件系统。它支持对文件的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
1.2、镜像加载原理
- Docker的镜像实际上是由一层一层的文件系统组成,这种层级的文件系统UnionFs。
- Bootfs(boot file system)主要包含Bootloader和Kernel(操作系统内核)。Bootloader主要是引导加载Kernel,Linux刚启动时会加载Bootfs文件系统,在Docker的镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含Boot加载器和内核。当boot加载完成之后,整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
- Rootfs(root file system),在Bootfs之上,包含的就是典型Linux系统中的/dev/proc/bin/etc等标准目录和文件。Rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
1.3、分层的镜像
pull的文件是一层一层拉取。
1.4、分层结构的特点
- 共享资源
2、镜像的特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为容器层,容器层之下的都被叫镜像层。
3、镜像的操作
目的是将已改变的环境制作成一个新的镜像,在其他电脑使用的时候,可以直接拉取制作好的镜像即可完成环境的共享。
1 | docker commit -m ="要提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名] |
3.1、下载tomcat镜像
1 | docker pull tomcat:8.5.64-jdk16-openjdk |
3.2、创建容器并启动
1 | docker run -it -p 8888:8080 tomcat |
参数 | 说明 |
---|---|
-p | 主机端口:docker容器端口 |
-P | 随机分配端口 |
-i | 交互 |
-t | 终端 |
1 | 访问 |
命令补充
进入方式 | 说明 |
---|---|
exec | 在容器中打开新的终端并且可以启动新的进程 |
attach | 直接进入容器启动命令的终端,不会启动新的进程 |
3.3、修改容器
发现启动的容器中没有要访问的资源,自己创建即可
1 | docker exec -it 容器ID /bin/bash |
3.4、创建镜像
现在的容器和现在的有区别了,可以在此基础上创建新的镜像
1 | docker commit -a='author' -m ='description message' 容器ID 名称/tomcat:版本 |
3.5、启动新的镜像
1 | docker run -it -p 8888:8080 名称/tomcat:版本 |
三、Docker数据卷
1、数据卷
当容器停止获取删除后,容器中部分数据出现丢失现象,为了实现容器的数据持久化引入数据卷来解决这个问题。
1.1、数据卷的定义
为了保存数据在docker中,我们使用卷的概念。容器卷就相当于Redis中持久化方式的RDB和AOF。
1.2、解决的问题
完成数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
- 数据卷可以在容器之间共享或者重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一致持续到没有容器使用它为止
持久化:容器间集成和共享数据
1.3、数据卷的使用
1.3.1、直接添加
1 | docker pull centos:7 |
数据共享的操作验证
在宿主机里添加相应的文件内容,打开容器可以看到对应的内容
反之亦然
停掉容器重新启动发现数据依然存在
权限控制:不允许在容器中进行修改
修改权限:
1 | docker run -it -v /宿主机绝对路径:/容器目录:ro 镜像名 |
1.3.2、DockerFiler添加
宿主机根目录下创建一个mydocker
1 | mkdir mydocker |
修改Volume信息
1 | volume test |
根据这个DockerFile构建我们的镜像文件
1 | docker build -f dockerFile1 -t 名称 .(加一个点) |
根据新创建的镜像文件创建容器,启动后可以看到容器中创建的对应的目录
1 | docker run -it 名称 |
这对应的目录和宿主机映射的路径的查找可以通过inspect命令查找
1 | docker inspect 容器ID |
验证和1.3.1验证方式相同
2、数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据的容器,称之为数据卷容器。
2.1、启动一个父容器
1 | docker run -it --name dc01 名称/centos |
2.2、创建两个子容器
1 | docker run -it --name dc02 --volumes-from dc01 名称/centos |
- 子容器共享父容器资源
- 修改任意子容器资源在另一个子容器中更新内容也是可见的
注意:删除dc01后,dc02和dc03之间的数据同样共享
容器之间配置信息的传递,数据卷的生命周期一直持续到没有数据使用为止
3、DockerFile
DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
- 编写DockerFile文件
- docker build
- docker run
3.1、构建过程
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像提交
3.2、执行流程
docker执行一个DockerFile脚本的流程大致如下:
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新的容器
- 执行docker中的下一条指令直到所有指令都执行完成
从软件的角度看,DockerFile、Docker镜像和Docker容器分别代表软件的三个不太阶段。
DockerFile:定义进程所需一切的文件
Docker镜像:编译后产生的镜像文件,当运行Docker镜像时,会真正开始提供服务
Docker容器:容器是直接提供服务的
3.3、DockerFIle案例
从官方pull下来的centos没有vim命令,将其强化
- 编写DockerFile文件
1 | FROM centos |
- 构建镜像文件
1 | //docker build -f DockerFile文件路径 -t 镜像名称:tag |
- 运行
1 | docker run -it 名称/centos7:1.7 |