Docker使用(三)Docker底层分析

Docker使用(三)Docker底层分析

四、底层分析

1、Docker镜像原理
1.1 commit镜像

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

命令和git原理类似

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

实操:

1、启动一个默认tomcat

2、发现这个默认的tomcat没有webapps应用,镜像的原因,官方镜像默认是没有的

3、自己copy 进去基本文件

4、将我们操作的容器通过commit提交为一个镜像

2、Docker容器数据卷
2.1 什么是容器数据卷

将应用和数据打包成一个镜像

需求:数据持久化

Mysql ,容器删除了,删库跑路。需求:数据存储在本地

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

============================================================================

2.2 使用容器数据卷

方式一:直接使用命令来挂载 -V

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

root@localhost \~\]# docker run -it -v /home/ceshi:/home centos /bin/bash ============================================================================ 通过inspect查询容器状态 \[root@localhost home\]# docker inspect e4dcbd52904f ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/9158c1d9005a5a683714746f34f6438e.webp) 测试: ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/31f59eecc04ff72b6d814bba4dec6a40.webp) ============================================================================ ###### 2.3 具名和匿名挂载 **# 匿名挂载** -v 容器内路径 \[root@localhost /\]# docker run -d -P --name nginx01 -v /etc/nginx nginx # 查看所有的volume的情况 \[root@localhost /\]# docker volume ls ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/6830128116d0a7664c83ec122fcf08bf.webp) 这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径! **# 具名挂载** # 通过 -v \*\*卷名:\*\*容器内路径 \[root@localhost /\]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx 5ed2d5cbdef110d9484b1fa0017fc83f5ae2d08b84f4628b38d0f383e890ae47 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/90c95d182299803c295f44dae999ee55.webp) \[root@localhost /\]# docker volume ls ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/64234edfb1bfc017a273329a9c6ace18.webp) \[root@localhost /\]# docker volume inspect juming-nginx ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/e0045e34cf5ce86003da49a4232d53f4.webp) 可以看到,所有的docker容器内的卷,没有指定目录的情况下都是在:/var/lib/docker/volumes/XXX/_data,我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用:具名挂载。 **# 如何区分匿名挂载/具名挂载** -v 容器内路径 # 匿名挂载 -v 卷名:容器内路径 # 具名挂载 -v /宿主机路径:容器内路径 # 指定路径挂载 **拓展:** # 通过 -v 容器内路径:ro rw 改变读写权限(这个权限是相对于容器说的) ro readonly # 只读 rw readwrite # 读写 \[root@localhost /\]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx # ro 只要看到ro 说明这个路径只能通过宿主机来操作,容器内是无法操作的。 ============================================================================ ###### 2.4 初始数据卷之Dockerfile \[root@localhost \~\]# cd /home # 建立一个测试文件夹 \[root@localhost home\]# mkdir docker_test_volume # 建立一个dockefile1文件,名字可以随机,每个命令就是docker镜像的一层 \[root@localhost docker_test_volume\]# vim dockefile1 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/3fadb86cbf9f20b898dff976ca238850.webp) # build \[root@localhost docker_test_volume\]# docker build -f dockefile1 -t cheristhuan/centos:1.0 . ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/5ee3e2755ae1d53fc03c6308d4e1b2de.webp) # 运行刚刚镜像 \[root@localhost docker_test_volume\]# docker run -it c9e468f74ddf /bin/bash ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/21069b9d5cc65fd50ed78f464986cf5c.webp) ##### 3、Dockerfile ###### 3.1 **介绍** 构建步骤: 1、编写一个dockerfile文件 2、docker build 构建成为一个镜像 3、docker run 运行镜像 4、docker push 发布镜像(DockerHub、阿里云镜像仓库) ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/b9e1658bf9cc5a6c7e508d5507b989f0.webp) ============================================================================ ###### 3.2 **构建过程** 基础知识: 1、每个保留关键字(指令)都必须是大写字母; 2、执行从上到下顺序执行; 3、#表示注释 4、每一个指令都会创建提交一个新的镜像层,并提交。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/3f78e17f373fe3980c2a48cf380c1c4b.webp) ​ dockerfile是面向开发的,我们以后发布项目,做镜像,就需要编写dockerfile文件,逐渐成为企业交付的标准,必须要掌握。 \*\*步骤:\*\*开发、部署、运维...缺一不可 步骤1、DockerFile:构建文件,定义了一切的步骤,源代码; 步骤2、DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品; 步骤3、Docker容器:容器就是镜像运行起来提供服务器 ============================================================================ ###### 3.3 **常见构建命令** FROM # 1、基础镜像,一切从这里开始构建 MAINTAINER # 2、镜像是谁写的(告诉别人,是你创造的它),建议格式:姓名+邮箱 RUN # 3、镜像构建的时候需要运行的命令(在命令前面加上RUN,即你想要让它做什么用) ADD # 4、步骤:tomcat镜像,这个tomcat压缩包!添加内容(COPY文件,会自动解压的,往它内部放点东西) WORKDIR # 5、镜像的工作目录 VOLUME # 6、 挂载的目录 EXPOSE # 7、 暴露端口配置 CMD # 8、指定这个容器启动的时候要运行的命令,只有最后一个会生效, 可被替代 ENTRYPOINT # 9、指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 10、当构建一个被继承 DockerFile这个时候就会运行ONBUILD的指令,触发指令 COPY # 11、类似ADD,将文件拷贝到镜像中 ENV # 12、构建的时候设置环境变量 ============================================================================ ###### 3.4 实战 Docker Hub 中99%的镜像都是 从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建: ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/13a7b7700f7a7993fcb1f90009e4045c.webp) ##### 4、Docker网络 ###### 4.1 理解Docker0 **# 清除全部容器和镜像** \[root@localhost \~\]# docker rm -f $(docker ps -aq) \[root@localhost \~\]# docker rmi -f $(docker images -aq) **# 测试 得到一个eth0@if533** \[root@localhost \~\]# docker run -d -P --name tomcat01 tomcat \[root@localhost \~\]# docker exec -it tomcat01 ip addr ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/f1ceaae072de8f6512f878bd70f183ff.webp) \[root@localhost \~\]# ping 172.17.0.2 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/e1f2a5049de6b99cac4192257c932083.webp) 是可以ping的通的docker容器内部 **# 思考** 1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术! ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/cde1a3bed534780383c16eceb0416b94.webp) 结论: ​ tomcat01 和 tomcat02是公用的一个路由器,docker0,所有的容器在不指定网络的情况下,都是docker0路由的。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/5a1ef93f8d4d5c1863011864dc08c208.webp) Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件),只要容器删除,对应网桥一对就没有了。 ============================================================================ ###### 4.2 自定义网络 **网络模式:** bridge:桥接 docker(默认) none:不配置网络 host:和宿主机共享网络 container:容器网络连通(用的少,局限很大) **测试:** **# 我们直接启动的命令 --net bridge ,而这个就是我们的docker0** docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat01\*\* --net bridge\*\* tomcat # 我们可以自定义一个网络! # --driver bridge 默认桥接模式 # --subnet 192.168.0.0/16 子网 # --gateway 192.168.0.1 网关 \[root@localhost \~\]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/e42e22419c8ff5f4cc2eddfce303e39e.webp) 自己的网络建立好了: ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/4fa533ab9e7c4c3ac32bc8a1cdbc787f.webp) **测试:** \[root@localhost \~\]# docker run -d -P --name tomcat-net-01 --net mynet tomcat \[root@localhost \~\]# docker run -d -P --name tomcat-net-02 --net mynet tomcat ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/c71c49654d08c598f2c0b684455c54fc.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/3d88bed0e56123a1afcc61a189b9e04c.webp) \[root@localhost \~\]# docker exec -it tomcat-net-01 ping tomcat-net-02 可以ping的通 ============================================================================ ###### 4.3 网络连通 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/18daefcd5570ecffa7d9b3d6ec092ff4.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/94bd101b19bbe08ebee0a3408c781f39.webp) 当前 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/3e731270f45ec462a38d0e78931bead4.webp) **#测试 tomcat01(docke0网卡) ---\> mynet(自定义网卡mynet)** #连通之后就是将tomcat01 放到了mynet网络下? #一个容器2个ip地址 【阿里云 公网ip 私网ip】 \[root@localhost \~\]# docker network connect mynet tomcat01 然后,查询下 \[root@localhost \~\]# docker network inspect mynet ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/7c0b653ab101236c204b8a57292058d2.webp) ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/52c5da00c7382322fc9d4507175939e1.webp) 执行\[root@localhost \~\]# docker inspect tomcat01 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/cc3f39cd48b15822e91faf48fda030d8.webp) 测试通不通:\[root@localhost \~\]# docker exec -it tomcat01 ping tomcat-net-01 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/733d74382814b67beb04639e8123e810.webp) \[root@localhost redis_my_net\]# docker exec -it tomcat-net-01 ping tomcat01 ![在这里插入图片描述](https://file.jishuzhan.net/article/1768856505764810753/e29c6de4366f18f916d9d1850377d072.webp)

相关推荐
waving-black1 小时前
利用frp和腾讯云服务器将内网暴露至外网(内网穿透)
linux·服务器·腾讯云·frp·内网穿透
stormsha1 小时前
Linux中su与sudo命令的区别:权限管理的关键差异解析
linux·运维·服务器·鸿蒙系统·ux·batch命令
新加坡内哥谈技术2 小时前
Meta计划借助AI实现广告创作全自动化
运维·人工智能·自动化
zyjyyds1132 小时前
win11系统 Docker Desktop 突然提示Docker Engine stopped解决情况之一
运维·docker·容器
Altairr2 小时前
Docker基础(一)
运维·docker·容器·eureka
搬运Gong2 小时前
Dockerfile使用与最佳实践
docker·容器·虚悬镜像
筏.k2 小时前
grep、wc 与管道符快速上手指南
linux
文牧之2 小时前
PostgreSQL 的扩展pageinspect
运维·数据库·postgresql
Johny_Zhao2 小时前
华为MAAS、阿里云PAI、亚马逊AWS SageMaker、微软Azure ML各大模型深度分析对比
linux·人工智能·ai·信息安全·云计算·系统运维
CodeOfCC2 小时前
c语言 封装跨平台线程头文件
linux·c语言·windows