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

相关推荐
AugustSkys35 分钟前
从 Docker 到 Containerd:Kubernetes 时代容器运行时完全指南
docker·容器·kubernetes·containerd
风哥2号1 小时前
数据库教程FGMT02‑生产环境Linux+Oracle19c安装配置与项目实战
linux·数据库·ffmpeg
wuminyu4 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
新时代牛马5 小时前
嵌入式网络完整篇:从LwIP/以太网驱动到 Linux netdev 与排障
linux·网络·php
猿与禅5 小时前
Linux(Ubuntu)入门到实战:系统管理、常用命令与权限体系完整指南
linux·ubuntu·apt·进程管理·系统运维·用户权限·vi/vim
前端世界5 小时前
Linux服务器实战:NTP时间同步、SELinux权限与rsyslog日志管理,一次搞懂三大运维问题
linux·运维·服务器
Android系统攻城狮5 小时前
Linux Gstreamer深度解析之gst_audio_converter_new调用流程与实战(二十)
linux·运维·服务器·gstreamer音视频·音视频进阶
莫陌尛.5 小时前
Docker MySQL 删表卡死、执行超时(MDL锁阻塞)问题复盘与根治方案
mysql·docker·容器
海宇服务5 小时前
零信任架构实战:基于海宇对外投资历史查询服务构建自动化供应商准入网关
运维·人工智能·架构·自动化
上海云盾-小余5 小时前
BGP 高防底层原理:TCP 异常流量识别与清洗机制
运维·网络·tcp/ip