(一)自定义镜像

一、本地目录挂载
将来我们自己开发好了java应用并且要用docker去部署,那么就需要去自行制作成镜像,也就是自定义镜像。
假设我们需要往Linux服务器上直接部署java应用而不使用docker,那么在这之前就需要给该环境安装好JRE,也就是JVM运行环境,再把jar包传上去并启动就能部署成功。
但是我们要想该系统拿到我们的jar包就能直接运行,不需要以上步骤,那么只要使用docker并向java项目镜像文件中准备好JRE、jar包就可以了吗?我们都知道java应用之所以能跨系统运行就是因为JRE与JVM,但是JVM最终是要跟操作系统交互的,不同操作系统的JVM也不一样。那么在制作镜像时就需要针对将要部署的Linux发行版来准备JRE以及该系统的全部函数库,那么它就可以不依赖于所部署的操作系统。

假设现在要基于Ubuntu发行版来制作自定义java镜像
- 准备Linux运行环境及函数库
- 准备JRE并配置环境变量
- 拷贝jar包
- 编写运行脚本
最终构建好java镜像
实际上docker是把该应用的不同部分分别打成包最后再合并在一起称为一个完整的包,也将此一份份包称之为层(Layer)。

像这样分层后,假设我们需要针对不同Linux系统去制作java镜像,我们只需要去修改(重新制作)基础镜像层的内容即可,而不需要又去重新制作上层镜像内容,上传镜像也就只需要去上传基础镜像并共享前面几层镜像即可。
这样制作的好处:分层解耦、复用、节省空间。
假设现在我们去拉取一个Redis镜像,就能看到它分为几层来进行下载,已下载的层也不会再重复下载。
二、Dockerfile
可以看到在docker中把一整个镜像文件分为了多层结构,不过实际上我们并不需要亲手去制作镜像,只需要借助Dockerfile去描述清楚镜像的结构(入口、层、基础镜像) ,docker就可以自动帮我们完成整个镜像的构建。
- From指的是希望镜像从哪开始,可以去指定需要的Linux发行版,docker就会自动去找对应的基础镜像,在此基础上去完成对应操作。
- Entrypoint指的是入口,比如java应用的入口启动脚本就是java -jar xxx.jar。
中间层就是要把java、jar包拷入,再来配置环境变量。
(1)案例示范

像这样的java应用部署过程还是有点繁琐,因为不同java应用都要用到JDK,而不同java应用变化的仅仅是jar包的名称,所以在这整个镜像结构当中将来在部署java应用时真正会变化的就是架构的名称,所以如果每次构建java应用镜像都得重新写这名字就会比较繁琐。
也就是说可以把其他不变的配置,比如JDK、环境变量等,都抽取出来,制作为一个基础镜像。
在这个openjdk基础镜像当中就已经配置好了所有JDK的环境,以后只需要执行拷贝jar包以及设置入口的命令即可。
三、自定义镜像

这个" . . . "是Linux系统中表示相对路径的写法。
(1)执行步骤
①准备dockerfile代码

注意还需要去配置容器内部的时区,若不做的话时区默认就不会为东八区了,而是中时区。这样与国内时间出现差异,那么它的日志及运行都会存在差异
①上传demo.jar包及openjdk基础镜像到虚拟机
- 上传demo.jar包
- 上传openjdk基础镜像并加载该镜像到宿主机当中
- 构建自定义镜像
根据docker images命令就能查看到docker-demo已经成为了本地的镜像文件
- 创建并运行docker-demo容器
根据docker ps命令就能查看到docker-demo容器的运行状态
根据docker logs命令就能查看到docker-demo容器的运行日志
能够成功进行访问
(二)容器网络
一、网络介绍
分别查看mysql与dd容器的网络配置状态
- mysql容器
还拥有自己的IP地址 - dd容器
同样拥有自己的IP地址。
我们可以发现这两个IP地址非常相似,只有最后一位不相同,说明这两个容器其实是在同一个网段当中,也就意味着它们之间可以互相访问。但是前面提到docker容器之间都是自己独立的隔离空间,为什么还有相同网段可以互相访问,这是因为他们都有相同的网关"Gateway"。
在我们安装docker时,它会在虚拟机内创建一张虚拟网卡,名字默认为docker0,它拥有自己的范围地址。并且还会给该网卡创建一个虚拟的网桥,前面mysql与dd容器的IP地址都在docker0的地址范围内,也就说明它们都与docker0通过网桥连上了,也说明它们被分配了一个在该范围内的IP地址。
通过ip addr命令就能查看到当前虚拟机上的网卡。
可以看到docker0的网卡。
此时进入到dd容器当中再来ping mysq容器的IP地址,发现能成功ping通。
但是并不能说明该dd服务就能与mysql数据库连接,因为前面说到该IP地址是由docker网桥进行分配的,若该服务重新启动,那么它的IP地址就会改变或被其他服务占用。说明以后在java项目当中若要配置MySQL的地址就不能直接配置为该固定地址。
因此原来这种IP地址连接的方式并不靠谱,也就需要去用到自定义网络了。
二、网络的命令

自定义网络也就是一个新的网桥,它的网段与原有网卡的网段不同,将来加入该网桥之间的容器就能实现互连了。因为自定义网络中是通过容器名实现互连的,并不需要知道对方的IP地址。
- docker network ls查看所有网络
可以看到这里面有一个bridge网络,也就是网桥 - docker network create创建网络
再次查看所有网络,就能看到新创建的网络
也能发现虚拟机中多了一个新的网卡
- 指定容器加入网络
先写网络名再写容器名。
再通过docker inspect mysql命令来查看Mysql容器中的详细信息。
发现他成功连上了heima网络:
但是也会发现Mysql容器此时的network有两个,另外一个是默认网桥
-
通过在创建并运行容器的命令中加上 --network 参数来实现容器在创建时的一刻直接加入网络。
再通过docker inspect dd命令来查看dd容器中的详细信息。
此时会发现它只剩下了一个网络。
因为容器在创建时指定了需要连接的网络那么它就不会再加入默认网络了。
-
这时就可以在dd容器中轻松连接至mysql容器。
若去访问不在同一网桥中的地址则无法连通。