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

测试:

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

2.3 具名和匿名挂载

# 匿名挂载

-v 容器内路径

root@localhost /# docker run -d -P --name nginx01 -v /etc/nginx nginx

查看所有的volume的情况

root@localhost /# docker volume ls

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

# 具名挂载

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

root@localhost /# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

5ed2d5cbdef110d9484b1fa0017fc83f5ae2d08b84f4628b38d0f383e890ae47

root@localhost /# docker volume ls

root@localhost /# docker volume inspect juming-nginx

可以看到,所有的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

build

root@localhost docker_test_volume# docker build -f dockefile1 -t cheristhuan/centos:1.0 .

运行刚刚镜像

root@localhost docker_test_volume# docker run -it c9e468f74ddf /bin/bash

3、Dockerfile
3.1 介绍

构建步骤:

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run 运行镜像

4、docker push 发布镜像(DockerHub、阿里云镜像仓库)

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

3.2 构建过程

基础知识:

1、每个保留关键字(指令)都必须是大写字母;

2、执行从上到下顺序执行;

3、#表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交。

​ 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,然后配置需要的软件和配置来进行构建:

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

root@localhost \~# ping 172.17.0.2

是可以ping的通的docker容器内部

# 思考

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

结论:

​ tomcat01 和 tomcat02是公用的一个路由器,docker0,所有的容器在不指定网络的情况下,都是docker0路由的。

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

自己的网络建立好了:

测试:

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

root@localhost \~# docker exec -it tomcat-net-01 ping tomcat-net-02

可以ping的通

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

4.3 网络连通

当前

#测试 tomcat01(docke0网卡) ---> mynet(自定义网卡mynet)

#连通之后就是将tomcat01 放到了mynet网络下?

#一个容器2个ip地址 【阿里云 公网ip 私网ip】

root@localhost \~# docker network connect mynet tomcat01

然后,查询下

root@localhost \~# docker network inspect mynet

执行root@localhost \~# docker inspect tomcat01

测试通不通:root@localhost \~# docker exec -it tomcat01 ping tomcat-net-01

root@localhost redis_my_net# docker exec -it tomcat-net-01 ping tomcat01

相关推荐
“码”力全开19 小时前
解耦异构算力与多协议接入:基于Docker与源码交付的开源企业级GB28181/RTSP边缘计算AI视频管理平台架构深度解析
人工智能·docker·开源
xiaoye-duck19 小时前
《Linux系统编程》Linux 进程间通信之管道基础解析:从匿名管道原理到基于管道的进程池实现
linux
z2005093019 小时前
【Linux学习】Linux中的进程程序替换
linux·服务器·学习
bush419 小时前
嵌入式linux学习记录四
linux·运维·学习
maomao大哥闯天下20 小时前
K8s如何实现滚动更新、健康检查与探测机制
docker·容器·kubernetes
kaisun6420 小时前
Docker 构建网络问题排查
网络·docker·eureka
lihao lihao20 小时前
软硬链接
linux·运维·服务器
TOWE technology20 小时前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
楼田莉子20 小时前
Docker学习:Docker介绍及其架构介绍
运维·后端·学习·docker·容器·架构