容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。
学前准备
1、Linux(必要)
2、Spring Boot
Docker 学习
Docker 概述
Docker 为什么出现?
一款产品: 开发–上线 两套环境!应用环境,应用配置!
开发 — 运维。问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说考验十分大?
开发即运维!
环境配置是十分的麻烦,每一个及其都要部署环境(集群 Redis、ES、Hadoop…) !费时费力。
发布一个项目( jar + (Redis MySQL JDK ES) ),项目能不能带上环境安装打包!
之前在服务器配置一个应用的环境 Redis MySQL JDK ES Hadoop 配置超麻烦了,不能够跨平台。
开发环境 Windows,最后发布到 Linux!
传统
:开发 jar,运维来做!
现在
:开发打包部署上线,一套流程做完!
Docker 给以上的问题,提出了解决方案!
安卓流程:java — apk —发布(应用商店)一 张三使用 apk 一 安装即可用!
docker 流程: java — jar(环境)— 打包项目帯上环境(镜像) — (Docker 仓库:商店)—下载我们发布的镜像—直接运行即可!
Docker 的思想就来自于集装箱!
JRE – 多个应用(端口冲突) – 原来都是交叉的!
隔离
:Docker 核心思想!打包装箱!每个箱子是互相隔离的。
Docker 通过隔离机制,可以将服务器利用到极致!
本质:所有的技术都是因为出现了一些问题,我们需要去解决,才去学习!
Docker 历史
2010 年,几个搞 IT 的年轻人,就在美国成立了一家公司 dotCloud
做一些 pass 的云计算服务!LXC(Linux Container 容器)有关的容器技术!
Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
他们将自己的技术(容器化技术)命名就是 Docker
Docker 刚刚延生的时候,没有引起行业的注意!dotCloud,就活不下去!
开源
2013 年,Docker 开源!
越来越多的人发现 docker 的优点!火了。Docker 每个月都会更新一个版本!
2014 年 4 月 9 日,Docker1.0 发布!
docker 为什么这么火?十分的轻巧!
在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机
:在 window 中装一个 VMware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也属于虚拟化技术,Docker容器技术
,也是一种虚拟化技术!
1 | VMware : linux centos 原生镜像(一个电脑!) 隔离、需要开启多个虚拟机! 几个G 几分钟 |
到现在,所有开发人员都必须要会Docker!
聊聊 Docker
Docker 基于 Go 语言开发的!开源项目!
docker 官网:https://www.docker.com/
文档:https://docs.docker.com/ Docker 的文档是超级详细的!
Docker 能干嘛
之前的虚拟机技术
虚拟机技术缺点:
1、 资源占用十分多
2、 冗余步骤多
3、 启动很慢!
容器化技术
容器化技术不是模拟一个完整的操作系统
比较 Docker 和虚拟机技术的不同:
- 传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内核中,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序。
Docker:打包镜像发布测试一键运行。
更便捷的升级和扩缩容
使用了 Docker 之后,我们部署应用就和搭积木一样。
项目打包为一个镜像,扩展 服务器 A!服务器 B。
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用
Docker 是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
只要学不死,就往死里学!
Docker 安装
Docker 的基本组成
镜像(image):
docker 镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat 镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker 利用容器技术,独立运行一个或者一组应用,通过镜像来创建的.
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux 系统。
仓库(repository):
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库。(很类似 git)
Docker Hub 是国外的。
阿里云…都有容器服务器(配置镜像加速!)
安装 Docker
环境准备
1、需要会 Linux 基础
2、Linux 要求内核 3.0 以上
3、我们使用 Xshell 连接远程服务器进行操作!
环境查看
1 | # 系统内核是 3.10 以上的 |
安装
帮助文档:https://docs.docker.com/engine/install/
1 | #1、卸载旧版本 |
1 | #7、测试 |
1 | #8、查看已经下载的镜像(从这里可以查看已有镜像的id) |
了解:卸载 docker
1 | #1、卸载依赖 |
阿里云镜像加速
1、登录阿里云找到容器镜像服务
第一次进去要设置仓库密码
2、找到镜像加速器
3、配置使用
1 | #1.创建一个目录 |
镜像加速到此配置完毕!
回顾 HelloWorld 流程
docker run 流程图
底层原理
Docker 是怎么工作的?
Docker 是一个 Client - Server 结构的系统,Docker 的守护进程运行在主机上。通过 Socket 从客户端访问!
Docker-Server 接收到 Docker-Client 的指令,就会执行这个命令!
为什么 Docker 比 Vm 快
1、docker 有着比虚拟机更少的抽象层。由于 docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的都是实际物理机的硬件资源。因此在 CPU、内存利用率上 docker 将会在效率上有明显优势。
2、docker 利用的是宿主机的内核,而不需要 Guest OS,VM 需要的是 Guest OS。
1 | GuestOS: VM(虚拟机)里的的系统(OS) |
因此,当新建一个容器时,docker 不需要和虚拟机一样重新加载一个操作系统内核,避免引导。
当新建一个虚拟机
时,虚拟机软件需要加载 GuestOS,整个新建过程是分钟级别
的。
docker
由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个 docker 容器只需要几秒钟
。
等之后学习完所有的命令,再回过头来看这段理论,就会很清晰!
Docker 的常用命令
帮助命令
1 | docker version #显示docker的版本信息。 |
帮助文档的地址:https://docs.docker.com/engine/reference/commandline/docker/
镜像命令
1 | docker images #查看所有本地主机上的镜像 可以使用docker image ls代替 |
docker images 查看镜像
查看所有本地主机上的镜像
1 | [root@iz2ze4lfnjztrjppyfbqo1z ~]# docker images |
docker search 搜索镜像
1 | [root@iz2ze4lfnjztrjppyfbqo1z ~]# docker search mysql |
docker pull 下载镜像
1 | # 下载镜像 docker pull 镜像名[:tag] |
docker rmi 删除镜像
1 | docker rmi -f 镜像id #删除指定id的镜像 |
容器命令
说明:我们有了镜像才可以创建容器,Linux,下载 centos 镜像来学习
1 | docker中下载centos |
1 | docker run 镜像id #新建容器并启动 |
1 | [root@iz2ze4lfnjztrjppyfbqo1z ~]# docker container list #和docker ps相同 |
新建容器并启动
1 | docker run [可选参数] image 或者 docker container run [可选参数] image |
列出所有运行的容器
1 | docker ps 命令 #列出当前正在运行的容器 |
退出容器
1 | exit #容器直接退出 |
删除容器
1 | docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf |
可能有人分不清镜像和容器,举个例子,镜像和容器的关系就像类和对象的关系,容器就像是镜像的实例。
U盘装过系统吗,镜像就是U盘里的文件,容器就是装好的系统。
镜像可以理解为安装包,可以用这个来安装容器。
启动和停止容器的操作
1 | docker start 容器id #启动容器 |
其它常用命令
后台启动命令
1 | # 命令 docker run -d 镜像名 |
查看日志
1 | docker logs --help |
查看容器中进程信息
1 | # 命令 |
查看镜像的元数据
1 | # 命令 |
进入当前正在运行的容器
1 | 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置 |
1 | # 命令 |
从容器内拷贝文件到主机上
1 | docker cp 容器id:容器内路径 主机目的路径 |
小结
命令大全
1 | attach Attach local standard input, output, and error streams to a running container #当前shell下 attach连接指定运行的镜像 |
docker的命令是十分多的,上面学习的都是最常用的容器和镜像的命令,之后我们还会学习很多命令!
练习
Docker 安装 Nginx
1 | #1. 搜索镜像 search 建议大家去docker hub搜索,可以看到帮助文档 |
宿主机端口
和 容器内部端口
以及端口暴露:(使用阿里云服务器记得到安全组中把端口放行)
思考问题:我们每次改动 nginx 配置文件,都需要进入容器内部?十分麻烦,我要是可以在容器外部提供一个映射路径,达到在容器外部修改文件,容器内部就可以自动修改?
这就是后面要学习的: -v 数据卷
Docker 安装 Tomcat
1 | #官方的使用 |
这样 docker 部署 tomcat 就可以访问了
问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?要是可以在容器外部提供一个映射路径,比如 webapps,我们在外部放置项目,就自动同步到内部就好了!
部署 elasticsearch+kibana
1 | # es暴露的端口很多! |
使用 kibana 连接 es (elasticSearch)?思考网络如何才能连接?
可视化面板安装
portainer(先用这个,不是最佳的选择)
1 | docker run -d -p 8080:9000 \ |
Rancher(CI/CD 再用)
什么是 portainer?
Docker 图形化界面管理工具!提供一个后台面板供我们操作!
1 | # 安装命令 |
测试访问:外网:8080 http://ip:8080/
选择本地的
进入之后的面板
可视化面板平时不会使用,测试玩玩就行!
Docker 镜像讲解
镜像是什么
镜像是一种轻量级、可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
所有应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像
- 从远程仓库下载
- 别人拷贝给你
- 自己制作一个镜像
DockerFile
Docker 镜像加载原理
UnionFs (联合文件系统)
我们下载的时候看到的一层一层的就是这个!
UnionFs(联合文件系统):Union 文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
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 等等。
平时我们安装进虚拟机的 CentOS 都是好几个 G,为什么 Docker 这里才 200M?
对于个精简的 OS,rootfs 可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用 Host 的 kernel,自己只需要提供 rootfs 就可以了。由此可见对于不同的 Linux 发行版, boots 基本是一致的, rootfs 会有差別,因此不同的发行版可以公用 bootfs.
虚拟机是分钟级别,容器是秒级!
分层理解
分层的镜像
我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层层的在下载!
思考:为什么 Docker 镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于资源共享了!比如有多个镜像都从相同的 Base 镜像构建而来,那么宿主机只需在磁盘上保留一份 base 镜像,同时内存中也只需要加载一份 base 镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过 docker image inspect 命令
1 | [root@iz2ze4lfnjztrjppyfbqo1z ~]# docker image inspect redis |
理解:
所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或培加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于 Ubuntu Linux16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python 包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创健第三个镜像层该像当前已经包含 3 个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含 3 个文件,而镜像包含了来自两个镜像层的 6 个文件。
上图中的镜像层跟之前图中的略有区別,主要目的是便于展示文件
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有 6 个文件,这是因为最上层中的文件 7 是文件 5 的一个更新版。
文种情況下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中
Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统
Linux 上可用的存储引撃有 AUFS、 Overlay2、 Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,井且每种存储引擎都有其独有的性能特点。
Docker 在 Windows 上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW [1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆并合井,对外提供统一的视图。
特点
Docker 镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部!
这一层就是我们通常说的容器层,容器之下的都叫镜像层!镜像层是无法改变的!
commit 镜像
1 | docker commit 提交容器成为一个新的副本 |
实战测试
1 | # 1、启动一个默认的tomcat |
如果你想要保存当前容器的状态,就可以通过 commit 来提交,获得一个镜像,就好比我们我们使用虚拟机的快照。
到这里才算入门Docker!!认真吸收练习!
容器数据卷
什么是容器数据卷
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器一删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享的技术!Docker 容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到 Linux 上面!
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
方式一 :直接使用命令挂载 -v
1 | -v, --volume list Bind mount a volume |
测试文件的同步
再来测试!
1、停止容器
2、宿主机修改文件
3、启动容器
4、容器内的数据依旧是同步的
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
实战:安装 MySQL
思考:MySQL 的数据持久化的问题
1 | # 获取mysql镜像 |
测试连接
:注意 3306 端口要在阿里云服务器的安全组中打开,否则无法连接。
当我们在本地用 SQLyog 或者 Navicat 新建名称为 test 的数据库时候,容器也会创建
假设我们将包含 mysql 的容器删除时
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能
。
具名和匿名挂载
1 | # 匿名挂载 |
所有的 docker 容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/自定义的卷名/_data
下
如果指定了目录,docker volume ls 是查看不到的
区分三种挂载方式
1 | # 如何确定是三种挂载的哪一种: 匿名挂载、具名挂载、指定路径挂载 |
拓展:
1 | # 通过 -v 容器内路径: ro rw 改变读写权限 |
初识 Dockerfile
Dockerfile 就是用来构建docker镜像的构建文件!
命令脚本!先体验一下!
通过这个脚本可以生成镜像
,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!
1 | # 创建一个dockerfile文件,名字可以随便 建议Dockerfile |
启动自己写的容器镜像
1 | $ docker run -it 镜像id /bin/bash # 运行自己写的镜像 |
这个卷和外部一定有一个同步的目录
查看一下卷挂载
1 | # docker inspect 容器id |
测试一下刚才的文件是否同步出去了!
此处借用了https://blog.csdn.net/weixin_43591980/article/details/106316094中的图片,同为狂神爱好者。
这种方式使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
!
数据卷容器
多个MySQL同步数据!
命名的容器挂载数据卷!
1 | # 测试 启动3个容器,通过刚才自己写的镜像启动 |
1 | # 再新建一个docker03同样继承docker01 |
多个 mysql 实现数据共享
1 | $ 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 |
结论:
容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
DockerFile
DockerFile 介绍
dockerfile
是用来构建 docker 镜像的文件!命令参数脚本!
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
查看一下官方怎么做的
点击后跳到一个 Dockerfile
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
DockerFile 构建过程
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
Dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写 dockerfile 文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:
构建文件,定义了一切的步骤,源代码。
DockerImages:
通过 DockerFile 构建生成的镜像,最终发布和运行产品。
Docker容器:
容器就是镜像运行起来提供服务。
DockerFile 的指令
以前我们使用别人的镜像,现在我们自己写一个!
1 | FROM # from:基础镜像,一切从这里开始构建 |
实战测试
scratch 镜像
1 | FROM scratch |
Docker Hub 中 99% 的镜像都是从这个基础镜像过来的 FROM scratch
,然后配置需要的软件和配置来进行构建。
实战:CentOS 镜像
1 | # 1./home下新建dockerfile目录 |
1 | [root@iz2ze4lfnjztrjppyfbqo1z dockerfile]# docker images |
我们平时拿到一个镜像,可以用 “docker history 镜像id” 研究一下是什么做的
CMD 和 ENTRYPOINT 区别
1 | CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。 |
测试 cmd
1 | # 编写dockerfile文件 |
测试 ENTRYPOINT
1 | # 编写dockerfile文件 |
Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比它们然后测试效果!
实战:Tomcat 镜像
准备镜像文件
安装 rz 和 sz,以便于更好地上传东西到linux,或者 使用xftp工具
1 | yum -y install lrzsz |
准备tomcat 和 jdk 到当前目录,编写好README
编写 dockerfile
官方命名Dockerfile
,build 会自动寻找这个文件,就不需要 -f 指定了。
1 | $ vim Dockerfile |
构建镜像
1 | # 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件 |
run 镜像
1 | # -d:后台运行 -p:暴露端口 --name:别名 -v:绑定路径 , 挂载的目录不存在会自动创建 |
访问测试
1 | $ curl localhost:9000 |
发布项目
(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
1、在 test 目录下新建 WEB-INF,然后在 WEB-INF 目录下新建 web.xml
1 |
|
2、在 test 目录下新建 index.jsp
1 | <%@ page language="java" contentType="text/html; charset=utf-8" |
发现:项目部署成功,可以直接访问!
我们以后开发的步骤:需要掌握Dockerfile的编写!
我们之后的一切都是使用docker镜像来发布运行!
发布自己的镜像
发布到 Docker Hub
1、地址 https://hub.docker.com/ ,注册账号
2、确定这个账号可以登录
3、登录
1 | [root@iz2ze4lfnjztrjppyfbqo1z ~]# docker login --help |
4、提交 push 镜像
1 | # 直接push发现push不上去 |
发布到阿里云镜像服务上
看官网,很详细 https://cr.console.aliyun.com/repository/
1、登录阿里云
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
5、浏览阿里云
1 | # 相关操作 |
小结
Docker 网络
理解 Docker 网络
学习之前清空下前面的docker 镜像、容器
,留一个干净的环境学习
1 | # 删除全部容器 |
测试
三个网络
问题: docker 是如果处理容器网络访问的?
1 | # 测试 运行一个tomcat |
原理
1、我们每启动一个 docker 容器,docker 就会给 docker 容器分配一个 ip,我们只要安装了 docker,就会有一个 docker0 桥接模式,使用的技术是veth-pair
技术!
https://www.cnblogs.com/bakari/p/10613710.html
再次测试 ip addr
2 、再启动一个容器测试,发现又多了一对网络
1 | # 我们发现这个容器带来网卡,都是一对对的 |
3、我们来测试下 tomcat01 和 tomcat02 是否可以 ping 通
1 | # 获取tomcat01的ip 172.17.0.2 |
网络模型图
此处借用狂神的图。
结论:tomcat01 和 tomcat02 公用一个路由器,docker0。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
小结
Docker 使用的是 Linux 的桥接,宿主机是一个 Docker 容器的网桥 docker0
Docker 中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应的网桥一对就没了!
–link
思考一个场景
我们编写了一个微服务,database url=ip: 项目不重启,数据 ip 换了,我们希望可以处理这个问题,可以通过名字来进行访问容器?
1 | # ping不通 |
探究:
1 | [root@iz2ze4lfnjztrjppyfbqo1z ~]# docker network ls |
1 |
|
1 | #查看tomcat03里面的/etc/hosts发现有tomcat02的配置 |
本质探究:
–link 本质就是在 hosts 配置中添加映射
现在使用 Docker 已经不建议使用–link 了!
自定义网络,不适用 docker0!
docker0 问题:不支持容器名连接访问!
自定义网络
1 | docker network |
查看所有的 docker 网络
网络模式
bridge :桥接 docker(默认,自己创建也是用 bridge 模式)
none :不配置网络,一般不用
host :和宿主机共享网络
container :容器网络连通(用得少!局限很大!)
测试
1 | # 我们直接启动的命令 --net bridge,而这个就是我们得docker0 |
1 | [root@iz2ze4lfnjztrjppyfbqo1z ~]# docker network inspect mynet |
启动两个 tomcat,再次查看网络情况
1 | [root@iz2ze4lfnjztrjppyfbqo1z ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat |
在自定义的网络下,服务可以互相 ping 通,不用使用–link
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!
好处:
redis - 不同的集群使用不同的网络,保证集群是安全和健康的
mysql-不同的集群使用不同的网络,保证集群是安全和健康的
网络连通
1 | # 测试两个不同的网络连通 再启动两个tomcat 使用默认网络,即docker0 |
1 | # 要将tomcat01 连通 tomcat—net-01 ,连通就是将 tomcat01加到 mynet网络 |
结论:假设要跨网络操作别人,就需要使用docker network connect 连通!
实战:部署 Redis 集群
1 | # 创建网卡 |
1 | # 测试集群 |
存值
关闭 13 节点
故障转移,14 变成了 master
docker搭建redis集群完成!
我们使用docker之后,所有的技术都会慢慢变得简单起来!
SpringBoot 微服务打包 Docker 镜像
1、构建 SpringBoot 项目
2、打包运行
1 | mvn package # 点击右侧maven工具栏中的package |
3、编写 Dockerfile
在这之前装一个插件,在插件库搜索 docker,编写 Dockerfile 可以高亮!
1 | FROM java:8 |
4、构建镜像
1 | # 1.复制jar和Dockerfile到服务器 |
5、发布运行
1 | # 查看镜像 |
以后我们使用了Docker之后,给别人交付就是一个镜像即可!
发布时间: 2020-12-17
最后更新: 2024-06-24
本文标题: Docker超详细通俗易懂基础篇
本文链接: https://blog-yilia.xiaojingge.com/posts/7adb457d.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
