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)

相关推荐
yt948321 小时前
Docker-基础(数据卷、自定义镜像、Compose)
运维·docker·容器
Hfc.1 小时前
docker-daemon.json
docker·容器·json
和计算机搏斗的每一天1 小时前
k8s之探针
云原生·容器·kubernetes
水银嘻嘻3 小时前
web 自动化之 KDT 关键字驱动详解
运维·自动化
Vone_663 小时前
node.js 邮箱验证服务器搭建
运维·服务器·node.js
丢丢丢丢丢丢~4 小时前
apache2的默认html修改
linux·运维·服务器
wusam4 小时前
Linux系统管理与编程20:Apache
linux·运维·服务器·apache·shell编程
我不想当小卡拉米4 小时前
【Linux】操作系统入门:冯诺依曼体系结构
linux·开发语言·网络·c++
ChironW4 小时前
Ubuntu 24.04 LTS系统上配置国内时间同步
linux·运维·服务器·ubuntu
TPBoreas4 小时前
排查服务器内存空间预警思路
运维·服务器