> 技术文档 > Docker超详细解析【从入门到深入】_docker详解

Docker超详细解析【从入门到深入】_docker详解


1.Docker概述

1.1Docker为什么会出现?

Docker相当于轻量级的虚拟机,但是别把它当作虚拟机用

一款产品:开发--上线 两套环境! 应用环境,应用配置!

开发 ---运维,问题:我在我电脑上可以运行,版本更新,导致服务器不可用!对运维来说,考验十分大。

环境配置是十分的麻烦,每一个机器都要部署环境(集群Redis,ES,Hadoop....)!

发布一个项目(jar + (Redis MySQL jdk ES)),项目能不能带上环境打包

Java --jar(环境:jdk,mysql,redis,es)配置麻烦,不能跨平台(项目通过java可以跨平台,其他不一定能跨平台)

 ---打包项目带上环境(镜像) ---(Docker仓库:商店) ---下载我们发布的镜像,直接运行即可!

Java --apk -------------------------------------------------发布(应用商店) --张三使用apk --安装即可!

Java --jar(环境)--打包项目带上环境(镜像)--Docker仓库,类似应用商店

Docker给以上问题,提出了解决方案!

Docker的想想来自于集装箱!

JRE --多个应用 (端口冲突)

隔离: Docker核心思想! 打包装箱! 每个箱子都是互相隔离的。

Docker通过隔离机制,可以将服务器利用到极致

1.2Docker为什么这么火?

容器中技术出来之前,都是使用虚拟机技术

虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术

十分轻巧

虚拟机:在window中安装一个Vmware ,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!

Vm, Linux centos原生镜像(一个电脑!) 隔离,需要开启多个虚拟机! 几个G 几分钟启动

Docker,隔离,镜像(最核心的环境 4M +jdk +mysql)十分的小巧,运行镜像就可以了,秒级启动

文档地址:Docker Docs

仓库地址:https://hub.docker.com/  远程仓库,APP商店

1.3Docker能干嘛

虚拟机技术的缺点:

  1. 资源占用十分多
  2. 冗余步骤多
  3. 启动很慢!

容器化技术

容器化技术不是模拟一个完整的操作系统

           虚拟机                         docker

比较Docker和虚拟机技术的不同

*传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件

*容器内的应用直接运行在宿主机的内核,容器是没有自己的内核,也没有虚拟我们的硬件,所以就轻便了

*每个容器间都是互相隔离的,每个容器内都有一个属于自己的文件系统,互补影响。

DevOps(开发,运维)

更快速的交付和部署

传统:一堆帮助文档,安装程序

Docker:打包镜像,发布测试,一键运行

更便捷的升级和扩缩容

使用了Docker之后,我们部署应用就和搭积木一样!

更简单的系统运维

在容器化之后,我们的开发,测试环境高度一致。

更高效的计算资源利用

Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例!服务器性能最大化利用。

2.Docker 安装

2.1Docker的基本组成

客户端-服务器-仓库

镜像(image):--apk安装包

docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 ===> run ===> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

容器(container):--应用

Docker利用 容器技术,独立运行一个或者一个组应用,通过镜像来创建的

启动,停止,删除,基本命令!

目前可以把这个容器理解为一个简易的linux系统

仓库(repository)--应用商店

仓库就是存放镜像的地方!

仓库分为公有仓库和私有仓库

Docker Hub(默认是国外的)

阿里云..都有容器服务器(配置镜像加速!)

2.2安装Docker

环境查看

# uname -r

# cat /etc/os-release

帮助文档:

  1. 卸载旧版本

 1.卸载旧版本

yum remove docker \\

docker-client \\

docker-client-latest \\

docker-common \\

docker-latest \\

docker-latest-logrotate \\

docker-logrotate \\

docker-engine

2.需要的安装包

yum install -y yum-utils

3.设置镜像的仓库

#(国外) yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新软件包的索引

yum makecache fast

4.安装docker相关的内容 docker-ce社区 ee企业版

yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

5.启动docker

systemctl start cocker

6.dokcer version 查看是否安装成功

7.hello-world

docker run hello-world

8.查看下载的hello-world镜像

docker images

#卸载docker

yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

rm -rf /var/lib/docker

rm -rf /var/lib/containerd

回顾hello-world流程

底层原理

docker是怎么工作的

Docker 是一个Client-Server结果的系统,Docker的守护进程运行在主机上。通过Sokcet从客户端访问!

DockerServer接收到Docker-Clinet的指令,就会执行这个命令!

Docker为什么比VM快

  1. Docker有着比虚拟机更少的抽象层
  2. Docker利用的数宿主机的内核,vm需要时Guest OS.

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

虚拟化技术分全虚拟,半虚拟,容器技术三大类

LXC是Linux Container。和docker一样是容器技术

3.Docker 命令

docker version #显示docker版本信息

docker info  #x显示docker的系统信息,包括镜像和容器的数量

docker --help

帮助文档的地址:Reference | Docker Docs

3.1镜像命令

docker images #查看本机镜像

docker search搜索镜像

docker pull下载镜像

docker rmi 删除镜像

docker rmi -f 容器ID #删除指定镜像

docker rmi -f $(docker images -aq) #删除全部镜像

3.2 容器命令

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

dokcer pull centos

新建容器并启动

列出所有的运行容器

退出容器

exit        #直接容器停止并退出

Ctrl + P +Q   #容器不停止退出

删除容器

docker rm 容器ID             #删除指定的容器

docker rm -f $(docker ps -aq)     #删除所有的容器

docker ps -a -q|xargs docker rm   #删除所有的容器

启动和停止容器的操作

docker start 容器ID    #启动容器

docker restart 容器ID   #重启容器

docker stop 容器ID     #停止当前正在运行的容器

docker kill 容器ID      #强制停止当前容器

3.3 常用命令

3.3.1后台启动容器

#命令 docker run [可选的参数] 镜像名

# docker run -d centos

#问题docker ps,发现centos停止了

#常见的坑 docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

#nginx,容器启动,发现自己没有提供服务,就会立刻停止,就是没有程序了

#nginxd,容器启动,发现自己没有提供服务,就会立刻停止,就是没有程序了

doc

3.3.2查看日志

#命令 docker logs -f -t --tail num 容器ID

#自己编写一段shell脚本

#docker run -d centos /bin/sh -c “while true; do echo kuangshen;sleep 1;done”

#显示日志

-tf  #显示日志

--tail number #显示日志条数

3.3.3查看容器中进程信息 ps

#命令 docker top 容器ID

pid 是进程id ;ppid是父id

3.3.4查看镜像的元数据

#命令 docker inspect容器ID

3.3.5进入当前正在运行的容器

#我们通常容器都是后台方式运行的,需要进入容器,修改一些配置

#命令 docker exec -it 容器ID /bin/bash

#命令 docker attach 容器ID

#docker exec     #进入容器后开启一个新的终端,可以在里面操作(常用)

#docker attach   #进入容器正在执行的终端,不会启动新的进程

3.3.6将文件从容器中拷出

在容器内新建一个文件

#命令 touch test.java

将文件从容器中拷到主机上

#命令 docker cp 容器ID:/文件路径/文件名 /拷贝到的目标路径

例:docker cp b78453025116:/home/test.java /home/

#拷贝是一个手动过程,未来我们使用 -v  卷技术

3.3.7小结

4 部署

4.1部署Nginx

1.搜索镜像

docker search nginx

2.下载镜像

docker pull nginx

3.查看镜像

docker images

4.运行

docker run -d --name nginx01 -p 3344:80 nginx

5.测试

rurl localhost:3344

6.端口暴露的概念

思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分麻烦,是否可以在容器外部提供一个映射路径,达到在容器外修改文件,容器内就可以自动修改?-v 数据卷。。

4.2部署Tomcat

官方使用文档:

docker run -it --rm tomcat:9.0

#之前启动的都是后台,停止容器之后,容器还是可以查到,docker run -it --rm 一般用来测试,用完就删除了

#下载在启动

docker pull tomcat

#启动运行

docker run -d -p 3355:8080 --name tomcat01 tomcat

#测试访问404

#进入容器

docker exec -it tomcat01 /bin/bash

#发现问题

1.linux命令少了。2.没有webapps

原因:

1.阿里云镜像的原因:默认是下载最小的镜像,所有不必要的都剔除掉

2.保证最小的可运行环境

思考问题:我们以后部署项目,每次都要进入容器?是否可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了!

4.3部署ES+kibana

#es 暴露的端口很多!

#es 十分小号内存

#es 的数据一般需要放置到安全目录!!挂载

# -- net somenetwork ?网络配置

1.启动elasticsearch

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discover.type=single-node” elasticsearch:7.6.2

2.启动了,linux就卡住了, docker stats查看cpu状态

3.关闭,增加内存的限制 修改配置文件 -e环境配置修改

docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e “discover.type=single-node” -e ES_JAVA_OPTS=”-Xms64m -Xmx512m” elasticsearch:7.6.2

4.查看docker stats

使用kibana连接es

5. 可视化工具

1.portainer(先用这个)

docker run -d -p 8088:9000 \\ --restart=always -v /var/run/docker.socek:/var/run/docker.sock --privileged=true portainer/portainer

2.Rancher(CI/CD再用)

什么是portainer?

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

docker run -d -p 8088:9000 \\ --restart=always -v /var/run/docker.socek:/var/run/docker.sock --privileged=true portainer/portainer

测试访问:http://Ip:8088/

进入之后的面板

6. Docker 镜像

6.1镜像是什么

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有容器,包含代码,运行时,库,环境变量和配置文件。

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

如何得到镜像:

*从远程仓库下载

*朋友拷贝给你

*自己制作一个镜像DockerFile

6.2Docker镜像加载原理

UnionFS(联合文件系统)

我们下载的时候看到的一层层就是这个!

UnionFs(联合文件系统),Union文件系统(UnionFS)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统使Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像的(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看来,只能是一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

例:tomcat和mysql都需要centos,直接从已有的一方拿过去即可。

容器是隔离的,不关镜像的事。

镜像是分层的,容器是隔离的。

Docker镜像加载原理

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

bootfs(boot file system)主要是包含BootLoader和Kernel,BootLoader主要是引导加载kernel,Linux刚启动回家再bootfs文件系统,在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核,当boot加载完成之后整个内核就都在内存中了,此时内存的使用权由bootfs转交给内核,系统也会卸载bootfs.

Rootfs,在bootfs之上,包含的就是典型的Linux系统中的/dev,/proc,/bin,/etc等目标目录和文件。Rootfs就是各种不同操作系统发行版,比如Ubuntu,Centos等。

平时我们安装虚拟机的Centos都是好几个G,为什么Dokcer才200M?

对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就行。因为底层直接用主机的Kernel,自己只需要提供rootfs就可以了,由此可见,对不同linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同发行版可以公用bootfs。

镜像分层理解

我们下载一个镜像,看到日志输出,可以看到是一层层的在下载

思考:为什么docker镜像采用这种分层的结构?

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

查看镜像分层的方式:docker image inspect redis:latest

理解:

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

例如:Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层,如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像,如果继续添加一个安全补丁,就会创建第三个镜像层

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合

这种情况下,上层镜像中的文件覆盖了底层镜像中的文件,这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。

Docker通过存储引擎(新版采用快照机制的方式)来实现镜像层堆栈,并保证镜像层对外展示为统一的文件系统。

Linux上可用的存储引擎有AUFS,OVerlay2,Device Mapper,Btrfs以及ZFS,顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种引擎都有其独特的性能特点

Docker在windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW.下面展示了与系统显示的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

特点:

Docker镜像都是只读的,当容器启动后,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常说的容器层,容器之下的都叫镜像层!

如何提交一个自己的镜像

Commit镜像

docker commit 提交容器成为一个新的副本

docker commit  -m=提交的描述信息 -a=作者 容器ID 目标镜像名:[tag]

实战测试

1.启动一个默认的tomcat

2.发现这个默认的tomcat 是没有webapps,镜像的原因,官方的镜像默认webapps是没有文件的

3.自己考进去了基本的文件

4.将我们操作过的容器通过commit提交作为一个镜像,我们以后就使用我们修改过得镜像即可,这就是我们自己的一个修改的镜像

如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像

就好比我们以前学习vm时候 快照。

7.容器数据卷

什么是容器数据卷

Docker的理念回顾

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

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

MySQL,容器删了,数据也没了。需求:MySQL数据可以存储在本地

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

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

总结:容器的持久化和同步操作!容器间也是可以数据共享的!

使用数据卷

方式一:使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录

#测试:docker run -it -v /home/cheshi:/home centos /bin/bash

#启动起来之后,可以使用docker inspect 容器ID 查看挂载情况

测试文件的同步

停止容器

宿主机上修改文件

容器启动

容器内部的数据依旧是同步的

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

实战:安装MySQL!

思考:MySQL的数据持久化问题

#获取镜像

docker search mysql

docker pull mysql:5.7

#运行容器,需要做的数据挂载!#安装启动mysql,需要配置密码,

#官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

#启动我们的mysql

-d 后台运行

-p 端口映射

-v 卷挂载

-e 环境配置

--name 容器名字

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d

-v /home/mysql/data:/var/lib/mysql

-e MYSQL_ROOT_PASSWORD=123456

--name mysql mysql:5.7

#启动成功之后,我们在本地使用sqlyog来连接测试一下

#sqlyog-连接到服务器的3310 ---3310和容器内的3306映射,这个时候我们就可以连接上了!

#在本地测试创建一个数据库,查看下我们映射的路径是否ok!

我们将容器删除。

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

具名和匿名挂载

#匿名挂载

-v 容器路径!

docker run -d -P --name -v /etc/nginx nginx

#查看所有volume的情况

docker volume ls

#这里发现,这种挂载就是匿名挂载 我们在-v 后只写了容器内的路径,没写容器外的路径

#具名挂载

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

docker volume ls

#通过-v 卷名:容器内路径

#查看一下这个卷

所有docker容器内的卷,没有指定目录的情况下都是在 /var/lib.docker/volumes/xxx/_data

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

如何确定是具名挂载还是指定路径挂载!

-v 容器内的路径               #匿名挂载

-v  卷名:容器内的路径:       #具名挂载

-v  /宿主机路径:容器内的路径   #指定路径挂载

两类:1:指定目录挂载,2:匿名和具名这俩都不指定路径

拓展:

通过 -v 容器内的路径: ro rw 改变读写权限

ro readonly  只读

rw readwrite 读写

一旦设置了容器权限,容器对我们挂载出来的内容就有限定了

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

#ro  说明这个路径只能通过宿主机来操作,容器内部无法操作!

挂载方式二:Dockerfile就是用来构建docker镜像的构建文件!命令脚本!

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

#创建一个dockerfile文件。 名字可以随意 建议 dockerfile

#文件中的内容  指令(大写) 参数

FROM centos

VOLUME [“volume01” , “volume02”]

CMD echo  “----end---”

CMD /bin/bash

#这里的每个命令,就是镜像的一层!

启动下自己的容器

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

查看一下卷挂载的路径

测试一下刚才的文件是否同步出去了!

这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!

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

数据卷容器

多个mysql同步数据!

#启动3个容器 通过我们自己写的镜像启动

docker run -it --name docker02 --volumes-from docker01 kuangshen/centos:1.0

Docker run -it --name docker03 --volumes-from docker01 kuangsheng/centos:1.0

#删除docker01,查看docker02,docker03数据还是存在

多个mysql、redis实现数据共享

# docker run -d -p 3310:3306  -v /etc/mysql/conf.d -v /var/lib/mysql

 -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

# docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02

 volume-from mysql01 mysql:5.7

#这个时候,可以实现两个容器的数据同步

结论:

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

但是一旦你持久化到本地(父容器挂载到宿主机),这个时候,本地的数据不会删除!

8DockerFile

8.1 DockerFile介绍

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

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build构建成为一个镜像
  3. docker run 运行镜像
  4. docker pull 发布镜像(DockerHub,阿里云镜像)

查看一下官方是怎么做的

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

8.2 DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层,并提交

dockerfile是面向开发的,我们以后发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

1.开发,部署,运维。。

Docker镜像逐渐成为企业交付的标准,必须掌握!

DockerFile:构建文件,定义一切步骤,源代码

DockerImages:通过DockerFIle构建生成的镜像,最终发布和运行的产品

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

DockerFile的指令

FROM               #基础镜像,一切从这里开始构建

MAINTAINER         #镜像是谁写的,姓名+邮箱

RUN                #镜像构建的时候需要运行的命令

ADD                #步骤:tomcat镜像 这个Tomcat压缩包!添加内容

WORKDIR            #镜像的工作目录

VOLUME             #挂载的目录

EXPOSE              #暴露端口配置 -p

CMD         #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT   #指定这个容器启动的时候要运行的命令,可以追加命令

ONBUILD    #当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令,触发指令

COPY    #类似ADD  将文件拷贝到镜像中

ENV     #构建的时候设置环境变量!

实战测试

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

创建一个自己的Centos

1.编写DockerFIle文件

FROM centos

MAINTAINER lxj

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum -y install vim

RUN yun -y install net-tools

EXPOSE 80

CMD echo $MYPATH

CMD echo ----end---

CMD /bin/bash

2.通过这个文件构建镜像

#命令: docker build -f dockerfile文件路径 -t 镜像:[tag]

对比之前得centos

我们增加之后的镜像

可以通过docker history 研究一个镜像是怎么做的。 --no-trunc这个参数显示完成信息。

CMD和ENTRYPOINT的区别

CMD         #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT   #指定这个容器启动的时候要运行的命令,可以追加命令

测试CMD命令

测试ENTRYPOINT命令

实战:Tomcat镜像

1.准备镜像文件 tomcat压缩包,jdk的压缩包!

2.编写dockerFile文件 官方命名Dockerfile ,build会自动寻找这个文件,就不需要 -f 指定!

    FROM centos

    MAINTAINER linxingjie

    COPY readme.txt /usr/local/readme.txt

    #ADD命令会自动解压

    ADD jdk-8ull-linux-x64.tar.gz /usr/loacl/

    ADD apache-tomcat-9.0.22.tar.gz /usr/loacl/

    RUN yum -y install vim

    ENV MYPATH  /usr/local

    WORKDIR  $MYPATH

    ENV JAVA_HOME  /usr/local/jdk1.8.0_11

    ENV CLASSPATH  $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    ENV CATALINA_HOME  /usr/local/apache-tomcat-9.0.22

    ENV CATALINA_BASH  /usr/local/apache-tomcat-9.0.22

    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

    EXPOSE 8080

    CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh  &&

    tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

    3.构建镜像

    docker build -t diyTomcat . #Dockerfile 是官方名字 不用-f指定了

    4.启动镜像

    docker run -d

    -p 9090:8080

     --name linxjTomcat

    -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test

    -v /home/kuangshen/build/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.22/logs

    diyTomcat

    5.发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)

    挂载的test文件夹下,新建WEB-INF文件,在WEB-INF文件夹下放置web.xml

    在test文件夹下新建一个index.jsp(index.html)

    6.访问测试

    外部访问9090端口

    我们以后的开发步骤:需要掌握dockerFile的编写!我们之后的一切都可以使用docker镜像来发布运行!!

    发布自己的镜像

    发布到DockerHub

    提交的时候一直也是按照镜像的层级来提交的!

    发布到阿里云的服务器上

    小结

    9.Docker网络原理

    原理

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

    再次测试ip addr

    2.再启动一个容器,我们发现又多了一对网卡(宿主机263,容器内部264)

      # 我们发现这个容器带来的网卡,都是一对对的

      # Evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连接协议,一段彼此相连

      # 正因为这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的

      # OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术

      3.我们测试tomcat01和tomcat02是否可以ping通

      docker exec -it tomcat02 ping 172.18.0.2

      绘制网络连接图

      结论:tomcat01和tomcat02是公用的一个路由器  docker0

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

      小结

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

      Docker内的所有网络接口都是虚拟的。虚拟的转发效率高!(内网传递文件!)

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

      --LInk

      思考一个场景,我们编写了一个微服务,database url =ip 。项目不要重启,数据库ip换掉了我们希望可以处理这个问题。可以通过名字来进行访问容器

      自定义网络

      创建两个容器使用自己搭建的网络

      docker run -d  -P --name tomcat-net-01 --net mynet tomcat

      docker run -d  -P --name tomcat-net-02 --net mynet tomcat

      网络联通

      测试打通 tomcat01 --mynet

      Docker network connect mynet tomcat01

      联通之后就是将tomcat01 放到mynet网络下?

      一个容器两个Ip地址!!

      #列子:阿里云服务,公网IP 私网IP

      10.实战:Redis集群部署

      Docker搭建redis集群完成!

      11.IDEA整合Docker

      1.构架springboot项目

      2.打包应用

        3.编写dockerfile

          4.构建镜像

            5.发布运行