【狂神说Java】Docker最新超详细版教程通俗易懂(1) 2020

您所在的位置:网站首页 docker版 【狂神说Java】Docker最新超详细版教程通俗易懂(1) 2020

【狂神说Java】Docker最新超详细版教程通俗易懂(1) 2020

2023-01-12 17:22| 来源: 网络整理| 查看: 265

1、Docker学习

弱小和无知不是生存的障碍,傲慢才是。

只要学不死,就往死里学!

Docker概述.Docker安装.Docker命令 。镜像命令。容器命令。操作命令 Docker镜像!·容器数据卷!.DockerFile·Docker网络原理·IDEA整合DockerDocker ComposeDocker SwarmCI\CD Jenkins 为何出现

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

之前在服务器配置一个应用的环境Redis MySQL jdk ES Hadoop ,配置超麻烦了,不能够跨平台。Windows,最后发布到Linux !

传统:开发jar,运维来做!

现在:开发打包部署上线,—套流程做完!

java – apk --发布 (应用商店) ----张三使用apk —安装即可用! java -.- jar(环境.).…打包项目带上环境(镜像 ) -( Docker仓库:商店 )–下载我们发布的镜像—直接运行即可!

Docker的思想就来自于集装箱! JRE–多个应用(端口冲突) —原来都是交叉的! 隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。水果―生化武器 Docker通过隔离机制,可以将服务器利用到极致!

Docker历史

2010年,几个搞IT的年轻人,就在美国成立了一家公司dotcloud做一些pass的云计算服务! LXC有关的容器技术! 他们将自己的技术(容器化技术)命名就是Docker ! Docker刚刚诞生的时候,没有引起行业的注意! dotCloud,就活不下去! 开源 开发源代码! 2013年,Docker开源!

Docker越来越多的人发现了docker的优点!火了,Docker每个月都会更新一个版本!2014年4月9日,Docker1.0发布! Docker为什么这么火?十分的轻巧! 在容器技术出来之前,我们都是使用虚拟机技术! 虚拟机∶在window中装一个Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!虚拟机也是属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!

vm:linux centos原生镜像(一个电脑!)隔离,需要开启多个虚拟机! docker:隔离,镜像〔最核心的环境4m + jdk + mysq1)十分的小巧,运行镜像就可以了!小巧! 聊聊docker

https://www.docker.com/

最下面选 docs:https://docs.docker.com/

docker镜像:https://hub.docker.com/

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

编程语言 Go

一个完整的Docker有以下几个部分组成:

DockerClient客户端Docker Daemon守护进程Docker Image镜像DockerContainer容器

Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用

虚拟机技术缺点∶1、资源占用十分多2、冗余步骤多3、启动很慢!

Kernel 内核,Lib 多个应用

容器:

Kernel + 多个容器(每个容器是 lib+app)

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

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

传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了·每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响

DevOps (开发、运维) 应用更快速的交付和部署传统:一堆帮助文档,安装程序 Docker :打包镜像发布测试,一键运行更便捷的升级和扩缩容 使用了Docker之后,我们部署应用就和搭积木一样! 项目打包为一个镜像,扩展服务器A!服务器B更简单的系统运维 在容器化之后,我们的开发,测试环境都是高度一致的。更高效的计算资源利用∶ Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。

2、Docker安装 角色了解

客户端 client

docker buildpullrun

服务器 docker_host

docker deamon 守护进程images 镜像,相当于 Class类模板containers 容器。就是 类创建出的对象。

仓库 registry

nginxredies

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

容器(container ) : Docker利用容器技术,独立运行一个或者—个组应用,通过镜像来创建的。启动,停止,删除,基本命令! 目前就可以把这个容器理解为就是一个简易的linux系统

仓库( repository ) :仓库就是存放镜像的地方!仓库分为公有仓库和私有仓库!Docker Hub(默认是国外的) 阿里云…都有容器服务器(配置镜像加速! )

安装和卸载

安装Docker 环境准备 1、需要会一点点的Linux的基础2、centOs 7 3、我们使用Xshell 连接远程服务器进行操作! 环境查看

#系统内核是 3.10 以上的 [root@kuangshen /]# uname -r 3.10.0-1062.12.1.e17.x86_64 [root@kuangshen /]# cat /etc/os-release NAME=""centos Linux" VERSION="7 (core)"

https://docs.docker.com/engine/install/centos/

选择 docker engin,别选 desktop sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine yum install -y yum-utils yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo #国外的太慢了 yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐使用 #更新yum软件包索引 yum makecache fast #这是最新的,老师的不带 plugin #docker-ce社区 ee企业版 yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin 安装指定版本 yum list docker-ce --showduplicates | sort -r docker-ce.x86_64 3:18.09.1-3.el7 docker-ce.x86_64 3:18.09.0-3.el7 ## 我的查看,最新的为 3:20 docker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stable sudo yum install docker-ce- docker-ce-cli- containerd.io docker-compose-plugin systemctl start docker sudo docker run hello-world docker version docker version Client: Docker Engine - Community Version: 20.10.22 API version: 1.41 Go version: go1.18.9 #老师的是:19.03.8。go版本为:12.17 docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest feb5d9fea6a5 15 months ago 13.3kB 卸载docker sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin # 这是docker 默认工作路径 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd 阿里云镜像加速 (6) 安装加速镜像 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json "Id": "523c3da6dba46f5206963de5cb9741f4e8b9b2e4cf48a78a03214e39955b613b", "Created": "2023-01-09T07:18:16.099878957Z", "Path": "/bin/sh", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 32063, "ExitCode": 0, "Error": "", "StartedAt": "2023-01-09T07:18:16.413427589Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:5d0d" "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "ee3c31d14c0bdb9f6691ce5c8777a18b520d0c7e6060570d1150268f87af6c00", "EndpointID": "b20e539b3b86546b62f837bee19cd5282e5c35101671a3480a81a2025824f11f", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } } 从容器内拷贝文件到主机上 cp 现在容器里面,新建一个文件。然后退出容器,进行copy docker cp 065ebf34869a:/home/test.java /home docker cp 容器id:容器内路径 目的的主机路径 #拷贝是一个手动过程,未来我们使用-v卷的技术,可以实现,自动同步/home /home (两个 容器内和现实的home 打通) 启动Nginx 和 Tomcat docker pull nginx #-p宿主机端口﹔容器内部端口 docker run -d --name nginx01 -p 3344:80 nginx #映射到本地的3344 curl localhost:3344 docker exec -it cda39ce07e69 /bin/bash whereis nginx cd /etc/nginx

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

docker run -it --rm tomcat:9.0 #我们之前的启动都是后台.停止了容器之后,容器还是可以查到 docker run -it --rm.一般用来测试,用完即删除。关了后,就找不到了。 # 容器会删除,镜像 还是在的。 docker run -d -p 3355:8080 --name tomcat01 tomcat docker exec -it tomcat01 /bin/bash cd /usr/local/tomcat/webapps #目录是空的 # 从这里复制一份 cp -r webapps.dist/* webapps http://192.168.44.147:3355/ #即可出现Tomcat欢迎页

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

部署 es + Kibana elasticsearch——连接Linux内网IP(当前 主机)Kibana——连接Linux内网IP 两个程序都连接到 当前主机的端口,才能通信。 #去掉网络配置 --net somenetwork docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag # tag 装 7.6.2 #启动了Linux就卡住了docker stats查看cpu的状态 curl localhost:9200 #environment #赶紧关闭,增加内存的限制,修改配置文件 -e环境配置修改 docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx1024m" -e "discovery.type=single-node" elasticsearch:7.6.2 可视化 portainer

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

portainer 'pɔ:teinə/ n. 集装箱岸吊,码头货柜起重机

Rancher ( CI/CD再用)

# 百度的 docker run -d --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /app/portainer_data:/data --restart always --privileged=true portainer/portainer-ce # 老师的 # -v是挂载。里面的数据,挂载到本机 docker run -d -p 8088:9000 --restart always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer # 连在一起 docker run -d -p 8088:9000 --restart always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer 大约在0.6版,privileged被引入docker。 使用该参数,container内的root拥有真正的root权限。 甚至允许你在docker容器中启动docker容器。 4、镜像

镜像是什么 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。 所有的应用,直接打包docker镜像,就可以直接跑起来!如何得到镜像:

从远程仓库下载朋友拷贝给你自己制作一个镜像DockerFile 联合文件系统

Docker镜像加载原理UnionFS(联合文件系统) UnionFS(联合文件系统):Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。 特性︰一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Git控制版本记录

安装了centos 1

安装了docker 2

安装了jdk3

联合文件系统:我们下载的时候看到的一层层就是这个!

比如:mysql 和 redis 都需要 centos,只需要一份就行了。 加载原理

镜像加载原理:

内核加一层 images在加一层

Docker镜像加载原理 docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。 bootfs(boot fle system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。 rootfs (root file system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。

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

分层理解

分层理解 分层的镜像 我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!

思考:为什么Docker镜像要采用这种分层的结构呢? 最大的好处,我觉得莫过于是资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。 查看镜像分层的方式可以通过docker image inspect命令!

理解︰ 所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层 举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。 该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。

docker inspect redis #可看到分层信息 "RootFS": { "Type": "layers", "Layers": [ "sha256:2edcec3590a4ec7f40c1f", "sha256:9b24afeb7c2f21e513ca77ad5f115c079b57cb", "sha256:4b8e2801e0f956a4253685246b82766ea1", "sha256:529cdb636f61e95ab91a6040796150b4522372", "sha256:9975392591f2774d260f45025ec3cc9b18ed", "sha256:8e5669d8329bcce950199b582f6e94952" ]

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。 Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。 Docker在Windows上仅支持windowsfilter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1].下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

Docker镜像都是只读的,当容器启动时, 个新的可写层被加载到镜像的顶部! 这一层就是我们通常说的容器层,容器之下的都叫镜像层!

就是 原来的 pull下来的是 镜像层,你 改过后,再次打包运行。 commit 提交镜像 docker commit 提交容器成为一个新的副本 #命令和git原理类似 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG] docker commit -a="kuangshen" -m="add webapps app" 687ba2ee4c87 tomcat02:1.0 docker run -it -p 8080:8080 tomcat # 进入容器,复制一份 cp -r webapps.dist/* webapps # 提交新的镜像 Tomcat 操作 相当于 又加了一层 commit 成 新的镜像 5、容器数据卷

什么是容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像! 数据﹖如果数据都在容器中,那么我们容器删除,数据就会丢失!需求∶数据可以持久化MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地! 容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

mysql写入的数据 /usr/mysql同步到 /home/mysql

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

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

-v 方式一:直接使用命令来挂载 -v docker run -it -v 主机目录:容器内目录 docker run -it -v /home/ceshi:/home centos /bin/bash docker inspect 0a949ac33283 "Mounts": [ { "Type": "bind", "Source": "/home/ceshi", #主机内地址 "Destination": "/home", #容器内地址 "Mode": "", "RW": true, "Propagation": "rprivate" } # 之后这个两个文件夹,相当于是同一个文件夹,相互同步。同步的过程,双向绑定 # 在容器内 新建一个文件。在主机内/home/ceshi 即可看到。 # 假如在/home/ceshi 增删改, # 启动后 进入 这个docker 容器(不启动 没法进入容器),查看 /home # 两边的文件 也是相同的

再来测试! 1、停止容器 2、宿主机上修改文件 3、启动容器 4、容器内的数据依旧是同步的!

volume 英 /ˈvɒljuːm n. 体积,容积;总数,总量;音量,响度;(厚,多) inspect 英 /ɪnˈspekt/ v. 检查,审视;检阅,视察;进行检查,进行视察

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

比如 Tomcat 的 webapp 文件夹,挂在后,在 本主机 修改 文件即可。 Mysql 部署 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 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 mysql01 mysql:5.7 # -e 配置环境 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 mysql01 mysql:5.7 配置后:新建一个数据库如test111,在主机里:/home/mysql/data 即可找到这个文件删除 mysql 容器,也没关系,数据是在的 发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能! volume 和 具名和匿名挂载 docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机端口 # -v /etc/nginx 只指定容器名,匿名挂载 docker volume --help Usage: docker volume COMMAND Manage volumes Commands: create Create a volume inspect Display detailed information on one or more volumes #查看 ls List volumes prune Remove all unused local volumes rm Remove one or more volumes #查看所有的volume的情况 docker volume ls # 结果如下 local e0bbcc1188663dede63c1aaf1da1360bb698020f37e785807112956b4bbdc479 #这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径! #没有指定 主机的目录,就是起个名字。 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx docker volume ls #可以看到。叫做 具名挂载。 DRIVER VOLUME NAME local juming-nginx docker volume inspect juming-nginx [ { "CreatedAt": "2023-01-09T08:53:03-05:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", "Name": "juming-nginx", "Options": null, "Scope": "local" } ] # 所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes / xxxxl_data cd /var/lib/docker/ #这里是 docker的工作目录 我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的`具名挂载` 如何确定是具名挂较还是匿名挂载,还是指定路径挂载 -v 容器内路径 #匿名挂载 -v 卷名:容器内路径 #具名挂载 -v /宿主机路径:容器内路径 #指定路径挂载! docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx # 或者 rw。通过-v容器内踣径:rorw改变读写权限。 ro readonly rw readwrite #一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了! # ro只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

初识DockerFile

Docker网络

Docker Compose

Docker Swarm

CI\CD

Jenkins 流水线!


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3