1. 概述
官网:https://docs.docker.com/
Docker Hub 网站:https://hub.docker.com/
容器较为官方的解释:
一句话概括容器:容器就是将软件打包成标准化单,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间基础设施上运行不同软件时的冲突。
容器较为通俗的解释:
如果需要通俗地描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说得容器存放的东西可能更偏向于应用,比如网站、程序甚至是系统环境。
2. 虚拟化技术和容器化技术
2.1 虚拟化技术
首先,Docker 容器虚拟化技术为基础的软件,那么什么事虚拟化技术呢?
简单点来说,虚拟化技术可以这样定义:
虚拟化技术是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。
2.2 Docker 基于 LXC 虚拟容器技术
Docker 技术是基于 LXC(Linux container-Linux 容器)虚拟容器技术的。
LXC,其名称来自 Linux 软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system-level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易地创建和管理系统或应用容器。
LXC 技术主要是借助 Linux 内核中提供的 CGroup 功能和 name space 来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。
cgroup 和 namespace 介绍:
- namesapce 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
(以上关于 namespace 介绍内容来自 https://www.cnblogs.com/sparkdev/p/9365405.html,更多关于 namespace 的内容可以查看这篇文章)。
- CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物力资源(如 cpu memory i/o 等等)的机制。
(以上关于 CGroup 介绍内容来自https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html,更多关于 Cgroup 的内容可以查看这篇文章)
cgroup 和 namespace 两者对比:
两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace 是为了隔离进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制。
3. Docker 基本组成
Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期
4. Docker 安装
4.1 查看系统内核和系统信息
命令:
示例:
4.2 开始安装 Docker
卸载旧版本
命令:
示例:
下载依赖安装包:
配置镜像仓库:
示例:
更行yum软件包
下载 docker
一般情况下安装 社区版
4.3 启动 Docker
命令:
示例:
4.4 Docker 的 HelloWorld
命令:
示例:
5. Docker 卸载
6. 配置阿里云镜像
进入阿里云官网,搜索容器镜像服务
执行命令:
7. Docker 运行流程和原理
启动流程
运行原理
Docker 整体架构
8. Docker 常用命令
命令的帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
管理镜像常用命令
创建容器
容器限制
8.1 基本命令
命令:
示例:
8.2 镜像命令
docker images 查看本地主机的所有镜像
示例:
列表参数介绍:
docker search 搜索镜像
示例:
docker pull 镜像名[:tag] 下载镜像
示例:
docker rmi 删除镜像
8.3 容器命令
docker run [可选参数] image 运行容器
示例:
进入容器
exit 退出容器
docker ps 列出容器
docker rm 删除容器
启动和重启容器命令
8.4 其他命令
后台启动容器
查看日志
查看容器中进程信息
查看镜像的数据
进入当前正在运行的容器
方式一:
拷贝容器文件到主机
拷贝容器的文件到主机中
常用命令小结
9. Docker 图形化管理工具
9.1 Docker UI
命令:
示例:
使用:
会出现如下的界面:
9.2 Shipyard
镜像下载
脚本安装 shipyard
9.3 Portainer
命令:
示例:
使用:
10. 常见容器部署:Nginx、Tomcat 、es + kibana
10.1 Nginx
命令:
测试访问:
10.2 Tomcat
命令:
测试访问:
10.3 es + kibana
添加 ‘-e ES_JAVA_OPTS = “-Xms128m -Xmx512m” ’,配置 ElasticSearch 的虚拟机占用的内存大小。
docker stats 查看资源占用情况
10.4 端口暴露的原理
10.5 可视化
- portainer(先用这个)
- Rancher(CI/CD 再用)
11. Docker 镜像讲解
11.1 镜像是什么
Docker 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、库、环境变量、配置文件、运行时环境等。
所有的应用,直接打包成 Docker 镜像,然后通过镜像创建出容器,然后就可以直接跑起来。
如果得到镜像:
- 从远程仓库下载,比如 docker hub、阿里云的镜像仓库等。
- 朋友拷贝给你。
- 自己制作一个镜像 DockerFile。
通过对原有的镜像创建的容器进行一些修改(也可以不修改),然后通过 Commit 命令提交一个新的镜像。
UnionFS(联合文件系统)
- 联合文件系统(UnionFS)是一个分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
- 特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker 镜像加载原理
docker 镜像实际上是由一层层的文件系统组成,这种层级文件系统就是联合文件系统。
- bootfs(boot file system)主要包含 BootLoader 和 kernel,BootLoader 主要负责引导加载 kernel,Linux 刚启动时会加载 bootfs 文件系统来引导内核的加载,Docker 镜像的最底层就是 bootfs。这一层与我们典型的 unix 系统是一样的,包含 boot 引导器和内核,当 boot 加载完成后整个内核就在内存中了,此时内存的使用权已经由 bootfs 转交给内核,此时系统会卸载 bootfs。
- rootfs(root file system),包含典型 Linux 系统中的 /dev,/proc,/bin,/etc 等标准目录和文件。rootfs 就是各种不同 Unix 操作系统发行版(Ubuntu,Centos等)。因为底层直接用 Host 的 Kernel,rootfs 只包含最基本的命令,工具和程序就可以了。
我们平时安装的虚拟机 centos 镜像好几个G,Docker 安装的才 200 多M,因为对于一个精简的OS,rootfs 可以很小,只需包含最基本的命令,工具和程序库就行了,因为底层直接使用宿主机的内核,自己只需提供 tootfs(相当于操作内核的客户端)就可以,由此可见不同发行版的 bootfs 基本是一致的,rootfs 有差别,因此不同的发行版可以公有 bootfs。虚拟机是分钟级别,容器是秒级。
第一图仅仅是 bootf + rootfs,然后如果要制作一个 emacs 环境的镜像,就在这个基础上新加一层 emacs 镜像,如图二。如果要在添加一个 Apache 环境,那就再图二基础上加一个 apache 镜像。如图三,图中的每一层镜像都能进行复用。
11.2 分层理解
分层的镜像
比如:上面的 redis 镜像。使用 docker inspect redis 镜像的ID 命令查看镜像的信息,找到 layer 信息。
由上图可以看到下载的 redis 镜像是由 6 个镜像一层层组成的。
这些镜像都是一个个独立可复用的镜像,如果下载其他镜像是,某一层镜像已经存在本地了,就不用再下载,直接复用该镜像,节省空间。比如上面下载 redis 镜像时,提示某个镜像已经存在。
注意:
Docker 镜像都是只读的,用镜像创建容器启动时,实际上是在原本的镜像上新建了一层可写层到原本镜像的顶部,这一层我们叫做容器层,容器层之下的叫做镜像层。
如上图,使用 Tomcat 镜像创建容器后,会在 Tomcat 镜像的基础上新建一个可写层,容器的写入是在可写层进行记录,然后使用 commit 命令把该容器创建一个新的镜像,实际上新的镜像是 tomcat镜像 + 可写层镜像,以 tomcat 镜像为基础。通过下面介绍使用容器构建镜像,可以更好地理解。
11.3 commit 镜像
命令:
实战测试
12. 容器数据卷
12.1 什么是容器数据卷
为了实现数据持久化,使容器之间可以共享数据。可以将容器内的目录,挂载到宿主机上或其他容器内,实现同步和共享的操作。即使将容器删除,挂载到本地的数据卷也不会丢失。
docker 的理念回顾
将应用和环境打包成一个镜像。
数据如果都在容器中,那么我们容器一旦删除,数据就会丢失 需求:数据可以持久化
MySQL,容器删了,删库跑路 需求:MySQL数据可以存储在本地
容器之间可以有一个数据共享的技术,Docker 容器中产生的数据同步到本地
这就是卷技术,目录的挂载将我们容器内的目录挂载到 Linux 上面
容器的持久化和同步操作,容器间也是可以做数据共享的
12.2 使用数据卷
方式一:直接使用命令来挂载 -v
测试文件的同步(在主机上改动,观察容器变化)
再来测试(测试通过)
1. 停止容器
2. 主机上修改
3. 启动容器
4. 容器内的数据依旧是同步的!
好处:我们以后只要在本地进行修改即可,不需要每次都进入容器内部都能实现自动同步
12.3 实战:安装MySQL
思考:MySQL 的数据持久化的问题!
假设删除了 docker 镜像
发现,挂载到本地的数据卷依然没有丢失,这实现了容器数据持久化功能
12.4 具名和匿名挂载
所有 docker 容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxxx/_data
我们通过具名挂载可以方便找到我们的一个卷,大多数情况都使用具名挂载
拓展
12.5 初识 DockerFile
Dockerfile 就是用来构建 docker 镜像的构建文件!也就是命令脚本
通过这个脚本可以生成一个镜像,镜像是一层一层的,脚本一个个的命令对应层数
部署容器
启动自己的容器
这个卷和外部一定有一个同步的目录!
在目录下新建一个测试用的文件
查看卷挂载的路径
测试一下刚才的文件是否同步到主机上了
成功。
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
12.6 数据卷容器
多个 mysql 同步数据!
CTRL + p + q 退出当前的 docker01,通过 docker01 挂载 docker02
同理创建一个 docker03,在数据卷上新建的文件也会在其他容器上同步
多个 mysql 实现数据共享
结论
容器之间配置信息的传递,数据卷的声明周期一直持续到没有容器使用为止。
但是一旦持久化到了本地,这个时候,本地的数据是不会被删除的。
13. DockerFile
13.1 DockerFile 介绍
Dockerfile 是用来构建 docker 镜像的文件,命令参数脚本
构建步骤:
1. 构建一个 dockerfile 文件
2. docker build 构建成为一个镜像
3. docker run 运行镜像
4. docker push 发布镜像(DockerHub、阿里云镜像仓库)
查看一下官方是怎么做的
很多官方镜像都是基础包,我们通常会自己搭建自己的镜像。
官方既然可以制作镜像,那我们也可以自己构建。
13.2 DockerFile 构建过程
基础知识:
1. 每个保留关键字(指令)都必须是大写字母
2. 执行顺序从上到下
3. # 标识注释
4. 每一个指令都会创建提交一个新的镜像层,并提交!
Docker 镜像原理
Dockerfile 概念及作用
Dockerfile 关键字
定义容器运行的时候监听的端口,启动容器的时候 -p 来绑定暴露端口,格式:EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR工作目录指定容器内部的工作目录,如果没有创建则自动创建,如果指定 / 使用的是绝对地址,如果不是 / 开头,那么是在上一条 workdir 的路径的相对路径USER指定执行用户指定 build 或者启动的时候,用户 RUN CMD ENTRYPOINT 执行的时候的用户HEALTHCHECK健康检查当存在 ONBUILD 关键字的镜像作为基础镜像的时候,当执行 FROM 完成之后,会执行 ONBUILD 的命令,但是不影响当前镜像,用处也不怎么大STOPSIGNAL发送信号量到宿主机该 STOPSIGNAL 指令设置将发送到容器的系统调用信号已退出。SHELL指定执行脚本的 shell指定 RUN CMD ENTRYPOINT 执行命令的使用,使用的shell
Dockerfile 案例
dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写 dockerfile 文件,这个文件十分简单。
步骤:开发、部署、上线运维
Dockerfile:构建文件,定义了一切的步骤,源代码
Dockerimage:通过 Dockerfile 构建生成的镜像,最终发布和运行的产品
Docker 容器:镜像运行起来提供服务
13.3 DockerFile 指令
以前的时候我们是使用别人的,现在我们尝试用 dockerfile 构建一个自己的镜像
13.4 实战测试
DockerHub 中 99% 的镜像都是从基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建
创建一个自己的 centos
对比之前原生的 centos:增加之后的镜像默认进入了工作目录,且可以使用 vim
我们可以列出本地进行的变更历史
我们平时拿到一个镜像,可以研究一下它是如何构建的了。
CMD 和 ENTRYPOINT 区别
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
12
测试 CMD
测试 ENTRYPOINT
DockerFile 中很多命令都十分相似,我们需要了解他们的区别,最好的学习方式就是测试并对比效果
13.5 实战:Tomcat 镜像
1. 准备镜像文件 tomcat 压缩包
1. 编写 dockerfile 文件,官方命令 Dockerfile,build 会自动寻找这个文件,就不需要 -f 进行指定了
1. 构建镜像
2. 启动镜像
3. 访问测试
访问网站
1. 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)
在 tomcat 的 test 文件夹下建立文件夹 WEB-INF,在其中创建 web.xml
在 test 文件夹下创建 index.jsp
发现:项目部署成功,可以正常访问页面 http://IP地址:9090/test/
13.6 发布自己的镜像
DockerHub
1. 地址 https://hub.docker.com/ 注册自己的账号
2. 确定这个账号可以登录
3. 在我们的服务器上提交自己的镜像
1. 登录完毕后就可以提交镜像了 docker push
5. 提交镜像
提交的时候也是按照镜像层级来进行提交的
阿里云镜像服务
1. 登录阿里云
2. 找到容器镜像服务
3. 创建命令空间
4. 创建容器镜像
5. 浏览阿里云
小结:
14. Docker 网络
14.1 理解 Docker0
清空所有环境
三个网络
#问题: docker是如何处理容器网络访问的?
Docker 在官网下载 Tomcat 镜像里面没有 ip addr 等命令解决
解决方案:
1. 进入上面你利用 Tomcat 镜像运行的容器。
2. 执行下面两个命令
3. 成功
原理:
1. 我们每启动一个 docker 容器,docker 就会给 docker 容器分配一个 id,我们只要安装了 docker,就会有一个网卡 docker0
桥接模式,使用的技术是 veth-pair 技术
再次测试 ip addr
1. 再启动一个容器测试,发现又多了一对网卡
1. 我们来测试下 tomcat01 和 tomcat02 是否可以ping通
绘制一个网络模型图
结论:tomcat01 和 tomcat02 是共用的一个路由器,docker0.
所有的容器不指定网络的情况下,都是 docker0 路由的,docker 会给我们的容器分配一个默认的可用 IP
小结:
docker 使用的是 Linux 的桥接,宿主机中是一个 docker 容器的网桥 docker0
docker 中所有网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件)
只要容器删除,对应网桥一定就没了!
14.2 -link
思考一个场景,我们编写一个微服务,database url = ip:,项目不重启,数据库 ip 换掉了,我们希望可以处理这个问题,可以用名字来访问容器?
其实这个 tomcat03 就是在本地配置了 tomcat02 的配置
本质探究:-link 就是我们在 hosts 配置中增加了一个 tomcat02 56140c84bab0
我们现在玩 Docker 已经不建议使用 -link了!
自定义网络!不使用 Docker0!
Docker0 的问题:它不支持容器名链接访问!
14.3 自定义网络
查看所有的 docker 网络
网络模式
bridge:桥接模式,桥接 docker 默认,自己创建的也是用 bridge 模式
none:不配置网络
host:和宿主机共享网络
container:容器网络连通!(用的少,局限很大)
测试:
我们自己的网络就创建好了
在自己创建的网络里面启动两个容器
我们自定义的网络 docker 都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
好处:
redis – 不同的集群使用不同的网络,保证集群时安全和健康的
mysql – 不同的集群使用不同的网络,保证集群时安全和健康的
14.4 网络连通
测试打通 tomcat01 和 mynet
14.5 实战 部署 Redis 集群
docker 搭建 redis 集群完成!
14.6 SpringBoot 微服务打包 Docker 镜像
- 构建 springboot 项目
- 打包应用
- 编写 Dockerfile
- 构建镜像
- 发布运行
Navicat Premium 11.1.14激活今天的文章
Navicat Premium 11.1.14激活(Docker核心教程)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/114054.html