0.Docker镜像透析
镜像加载原理
UnionFS联合文件系统
- UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级
目高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
-
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
-
人话:想象一下我有一本预言之书,每一页都是一张可以独立存在的篇章,但是当我把所有页按顺序叠在一起时,它们就形成了一个完整的预言日志。现在,如果我想在故事中间添加一个新的章节,我不用重写整个故事,我只需要在中间插入几张新的纸就可以了。而且,这些新页可以随时添加或移除,不会影响到原来的故事。
-
工作原理:
-
- 写时复制(Copy-on-Write) :当你想修改预言(也就是在Docker镜像中做修改)时,你不会直接在原来的页上写,而是复制那一页到一个新的页上,然后在新的页上进行修改。这样,原来的页保持不变,新的页包含了你的修改。
- 层叠效果:所有的层都叠加在一起,形成一个完整的视图。在Docker中,当你查看镜像时,你看到的是一个包含了所有层的统一文件系统,但实际上每个层都是独立的。
- 可复用性:因为每个层都是独立的,所以不同的镜像可以共享相同的底层。比如,很多不同的Docker镜像都可能使用同一个基础Ubuntu镜像作为它们的底层。
- Docker高效性:
-
- 可复用性:基础镜像层可以被多个容器共享,不需要每次都重新建造。
- 轻量级:每个镜像层只包含了必要的改动,而不是完整结构。
- 快速构建:创建新容器时,只需要添加或修改必要的镜像,而不是从头开始


1.Docker存储
1.1数据卷挂载(目录挂载)
书接上文,容器内可能不必备vi编辑器,这使得容器内对文件的编辑工作会很麻烦,需要一点魔法
- 目录挂载是指将本地主机上的文件或目录映射到容器内的过程。这样做的目的是为了让容器能够访问主机本地上的文件系统,实现数据持久化或者共享配置文件等功能。
- 人话: 好不容易辛苦的进入容器对各种配置信息进行修改,忽然有一天容器炸了或者手欠把容器删了,那么配置的各种容器信息和数据都将丢失,使用目录挂载可以将本地文件和容器中的文件进行神秘联动(量子纠缠),你对**本地文件的任何修改都会映射到容器的文件中,**哪怕把容器删除重装,映射关系也不会改变从而数据得到保存
数据卷(volume):是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
匿名挂载
- 语法: docker -v 数据卷名:容器目录
- 不指定本地目录,默认放在/var/lib/docker/volums/xxxx/_data
- 容器内路径: ro rw 改变读写权限,看到ro说明只能通过本地主机修改文件而非容器内修改

#查看帮助信息
docker volum --help
#创建数据卷
docker volume create
#查看所有数据卷
docker volume ls
#删除指定数据卷
docker volume rm
#查看某个数据卷的详情
docker volume inspect
#清除数据卷
docker volume prune
小试羊刀-匿名挂载:
-
直接运行并且匿名挂载
docker run -d -p 80:80 --name nginx -v html:/usr/share/nginx/html nginx

- 查看当前数据卷

- 查看数据卷信息

createdAt:创建时间
mountpoint:数据卷路径
- 切换到该工作目录下就可以看到对应文件信息

具名挂载(用得多)
- 语法: docker -v 本地目录:容器目录
- 目录必须以 / 开头,否则会被识别为数据卷
- (目录和: 之间不能有任何空格)

小试羊刀-具名挂载:
- 预备工作,确保容器正常运行

- 2.将Linux的IP地址粘到网页即可看到nginx的运行情况

- 3查看官方文档可以得知控制网页的html文件路径,进入容器,切换工作目录准备对其修改

- 4对页面进行修改刷新可得,容器内甚和至没有vi编辑器,编辑文件难受的一批


- 5删除容器重造,页面数据丢失


-
6那么现在挂载启动
docker run -d -p 80:80 --name nginx -v /refle/nghtml:/usr/share/nginx/html nginx

注意,本地不存在的目录会自动创建的,切换到该目录可以看到该文件

- 7进入该映射文件会发现没有任何内容,并且访问网页无如何内容


这是因为现在容器内文件的访问会以外面的映射文件为基准
- 8所以我们需要在外面的文件建立一个index.html去设置相应的配置信息,此时就可以正常显示


- 9现在我们删除容器,用相同的命令挂载启动会发现配置信息得到了保留


1.2制作镜像Dockerfile
- 镜像就是包含了应用程序,程序运行的系统函数库,运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

- 编写dockerfile常见指令
2.Docker网络
- 实现进入到某个容器内部去访问另一个容器
2.1利用机器ip+外部端口互相通讯
- 使用curl http://机器ip+外部端口可以互相访问
- curl 用于在命令行界面(CLI)中发出网络请求。
curl命令启动并解析提供的 URL,建立一个到 IP 地址119.45.45.4的网络连接,它使用 HTTP 协议在端口99上发送一个 GET 请求(从服务器检索 数据)到服务器,服务器接收到请求后,它会处理这个请求并返回一个响应,并将其输出到命令行界面

- 首先存储创建两个容器app1,app2,外部主机端口分别为88,99

- 进入app1容器并访问容器app2
问题未解决?

2.2利用容器ip+内部端口
- docker0是 Docker 在宿主机上创建的一个虚拟网络接口。它是 Docker 默认创建的桥接网络(bridge network)的一个组成部分,用于实现 Docker 容器之间 的网络通信以及容器与主机之间的网络通信。
- docker0为每个容器分配唯一的ip地址,容器之间就可以通过IP地址进行通信
- 使用curl http://容器ip+内部端口可以互相访问

- docker inspect container 可以查看容器ip地址

