天天看点

Docker

Docker

镜像(image):

容器(container):

仓库(repository):

环境准备

需要linux基础

Centos7

使用软件进行远程连接

环境查看
安装

帮助文档

登录阿里云找到容器服务

找到镜像加速的地址

配置应用

Docker

docker是怎么工作的?

Docker 是一个client-server 结构的系统,Docker的守护进程运行在主机上,通告Socker从客户端访问

Dokcer server 接收到Docker-client 的指令,就会执行这个命令

Docker

Docker为什么比虚拟机快

Docker有着比虚拟机更少的抽象层

Docker 利用的是宿主机的内核,VM需要Guest OS

所以,新建一个容器的时候,Docker不需要虚拟机一样重新加载一个操作系统的内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级

Docker

说明:我们有了镜像才可以创建容器,Linux,下载一个centos 镜像来测试学习

Docker
Docker

使用kibana连接es,思考网络如何才能连接过去

Docker

portainer(先用这个)

Rancher(CI/CD再用)

什么是portainer?

Docker图形化界面管理工具,提供一个后台面板供我们操作

访问测试:http://ip:8080

镜像是一种轻量级、可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软

件所需的所有内容,包括代码、运行时库、环境变量和配置文件

所有的应用,直接打包docker镜像,就可以直接跑起来

远程仓库下载

其他人拷贝给你

自己制作一个镜像dockerfile

UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对

文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite

several directories into a single virtual filesystem)。Union文件系统是 Docker镜像的基础。镜像可以通过分层

来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起

来,这样最终的文件系统会包含所有底层的文件和目录

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

boots(boot file system)

主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel, Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 boots。

这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。

当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。

rootfs(root file system) 在 bootfs之上。

包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。

rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos等等。

Docker

对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。

由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs.

虚拟机是分钟级别,容器是秒级!

最大的好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

所有的 Docker镜像都起始于一个基础镜像层,当进行修改或培加新的内容时,就会在当前镜像层之上,创建新的镜像层。

Docker
Docker

实战测试

如果想要保存当前容器的状态,我们可以通过commit来提交,获得一个镜像,类似于虚拟机的快照

docker的理念回顾

将应用和环境打包成一个镜像

如果数据都在容器中,那么删除容器,数据就会丢失! 需求:数据可以持久化

MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!!目录的挂载,将我们容器内的目录,挂载到Linux上面

Docker
Docker
Docker
Docker

好处:

我们以后修改只需要在本地修改即可,容器内自动同步!

Docker

发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能

Docker

我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的是具名挂载

Dockerfile就是用来构建docker镜像的构建文件、命令脚本

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层

Docker

这个卷和外部有一个同步的目录

Docker

查看一下挂载的路径

Docker

测试一下刚才的文件是否同步

这种方式之后使用的很多,因为 通常我们会构建自己的镜像

假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径

多个mysql同步数据

Docker
Docker
Docker
Docker
Docker

多个mysql实现数据共享

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止

但是一旦持久化到了本地,这个时候本地的数据是不会删除的

dockerfile是用来构建docker镜像的文件,命令参数脚本

编写一个dockerfile文件

docker build构建成为一个镜像

docker run 运行镜像

docker push 发布镜像(docker hub,阿里云镜像仓库)

很多官方镜像都是基础包,很多功能都没有,我们通常自己搭建自己的镜像

每个保留关键字(指令)都必须是大写字母

从上到下顺序执行

表示注释(#)

每个指令都会创建提交一个新的镜像,并提交

Docker

Dockerfile是面向开发的,以后发布项目,做镜像,就需要编写dockerfile文件

Docker镜像逐渐成为企业交付的标准

Dockerfile:构建文件,定义了一切的步骤,源代码

Dockerimages:通告Dockerfile构建生成的镜像,最终发布运行的产品

Docker容器:容器就是镜像运行起来提供服务

Docker

Docker Hub中99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建

Docker

我们可以通过 docker history+镜像id 列出本地镜像的变更历史

我们平时拿到一个镜像,可以研究一下他是怎么做到的

发布项目

提交的时候也是按照镜像的层级来进行提交的

https://hub.docker.com 注册自己的账号

确定这个账号可以登录

在我们服务器上提交自己的镜像

登录完毕之后就可以提交镜像了,docker push

登录阿里云

找到容器镜像服务

创建命名空间

Docker

创建容器镜像

Docker

浏览阿里云

Docker

阿里云容器镜像的就参考官方地址

Docker
Docker

三个网络

Docker

我们每启动一个docker容器,docker就会给docker容器分配一个ip ,我们只要安装了docker,就会有一个网卡docker0 桥接模式,使用的技术是 evth-pair技术

再次测试ip addr

Docker

再启动一个容器测试,发现又多了一对网卡

Docker

我们测试 tomcat01 和 tomcat02 可以ping通

Docker

结论: tomcat01 和 tomcat02 是共用的一个 docker0

所有的容器不指定网络的情况下,都是通过docker0通信的,docker会给我们的容器分配一个默认的可用IP

Docker

Docker使用的是Linux的桥接,宿主机中是一个Dokcer容器的网桥 docker0

Dcoker中的所有的网络接口都是虚拟的,虚拟的转发效率高

只要容器删除,对应网桥一对就都没了

Docker
场景:编写了一个微服务,项目不重启,数据库 IP 换掉了,如何用名字来进行访问容器

探究:inspect

Docker
Docker

--link 就是在我们hosts配置中增加了一个 172.18.0.3 tomcat02 312857784cd4

现在已经不建议使用 --link 了

docker0的问题:不支持容器名连接网络

查看所有的docker 网络

Docker

网络模式:

bridge:桥接(默认)

测试:

自定义一个网络

Docker

自定义的网络 docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络

redis:不同的集群使用不同 的网络,保证集群是安全和健康的

mysql:不同的集群使用不同的网络,保证集群是安全和健康的

Docker
Docker
Docker
Docker
Docker

结论:假设要跨网络操作别人,就需要使用docker network connect 连通

Docker
下一篇: 镜像发布