首页 > 其他分享 >Docker镜像原理

Docker镜像原理

时间:2024-03-27 21:12:28浏览次数:25  
标签:home sail mysql 原理 镜像 Docker root docker

Docker镜像原理

Docker 10 镜像原理

联合文件系统

联合文件系统(UnionFS)是 Docker 的核心,也是 Docker 得以极致精简的保证。

以拉取 redis 镜像为例

先拉取最新版镜像

[root@sail ~]# docker pull redis
Using default tag: latest # 默认最新版标签
latest: Pulling from library/redis
e5ae68f74026: Pull complete # 分层下载,docker image的核心:联合文件系统
37c4354629da: Pull complete 
b065b1b1fa0f: Pull complete 
6954d19bb2e5: Pull complete 
6333f8baaf7c: Pull complete 
f9772c8a44e7: Pull complete 
Digest: sha256:2f502d27c3e9b54295f1c591b3970340d02f8a5824402c8179dcd20d4076b796 #防伪签名
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest # 真实地址,docker pull redis 等价于 docker pull docker.io/library/redis:latest

再拉取指定版镜像

[root@sail ~]# docker pull redis
Using default tag: latest # 默认最新版标签
latest: Pulling from library/redis
e5ae68f74026: Pull complete # 分层下载,docker image的核心:联合文件系统
37c4354629da: Pull complete 
b065b1b1fa0f: Pull complete 
6954d19bb2e5: Pull complete 
6333f8baaf7c: Pull complete 
f9772c8a44e7: Pull complete 
Digest: sha256:2f502d27c3e9b54295f1c591b3970340d02f8a5824402c8179dcd20d4076b796 #防伪签名
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest # 真实地址,docker pull redis 等价于 docker pull docker.io/library/redis:latest

由此可见,redis 镜像一共 6 层,由于之前拉取了默认的最新版 redis 镜像,再拉取 redis:5.0 时,有 3 层是可以复用的,所以只下载了不能复用的 3 层。

这样既能提高下载速度,也能极大节省磁盘占用和资源消耗。

分层镜像

Docker 使用联合文件系统对镜像做了分层,如下图所示:

Untitled

  • bootfs(boot file system):启动文件系统。
  • rootfs:root file system:基础文件系统。

Untitled

Untitled

Untitled

Docker 镜像都是只读的,当容器启动时,一个新的可写层被加到镜像的顶部。

这一层就是我们通常说的容器层,容器层之下的都叫镜像层

Untitled

我们自己也是可以制作镜像并提交的,使用 docker commit 命令。

Docker自定义镜像

提交镜像

docker commit

语法

docker commit [参数] 容器 [仓库[:标签]]

参数

  • a:作者信息。一般为 作者名字<邮箱>
  • c:将 Dockerfile 指令应用于创建的映像。
  • m:注释信息。
  • p:提交期间暂停容器(默认)。

将这个容器创建为一个自定义的镜像并提交到仓库中。

[root@sail ~]# docker commit -a="sail<[email protected]>" -m="diy tomcat by sail" fe247e0ef80d tomcat4sail:1.0
sha256:187a99503046ef1a4316221d174add0fbc92391ac534fb1926e535474491f9d2

[root@sail ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat4sail           1.0       187a99503046   5 seconds ago   684MB
tomcat                latest    24207ccc9cce   4 days ago      680MB

可以看到,我们自定义的镜像已经在本地镜像库中了。

测试

停止原有容器。

[root@sail ~]# docker stop fe247e0ef80d
fe247e0ef80d

启动自定义镜像。

[root@sail ~]# docker run -d -p 8080:8080 --name="tomcat4sail" 187a99503046
602c3c576c1b6d13aa0d2508490220d479eaf8c52c9cfe116029c67437fac61b

由于自定义的镜像还没有提交到远程库,所以这里只能使用镜像 ID 启动。

如果使用镜像名启动,会从远程库中进行搜索,由于我们还没有提交,会因为搜索不到报错。

访问测试

Untitled

这里我们并没有改变容器中 webapps 下的内容,但依然可以直接访问,说明我们自定义的镜像是生效了的。

Docker数据卷 挂载

由来

Docker 是将应用和环境打包成一个镜像。

这样,数据就不应该保存在容器中,否则容器删除,数据就会丢失,有着非常大的风险。

为此,容器和主机之间需要有一个数据共享技术,使得在 Docker 容器中产生的数据能够同步到本地。

这就是数据卷技术。其本质上是一个目录挂载,将容器内的目录挂载到主机上。

使用

命令方式

语法

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

查看主机 /home 目录。

[root@sail ~]# ls /homeadmin  f2  f3  sail  test.java

以交互模式启动 centos 镜像。

[root@sail ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@ec95646b1a4c /]#

新开一个窗口查看容器详情。

Untitled

Mounts 下的 Source 即为设置的主机目录、Destination 即为设置的容器目录,他们已经绑定在了一起。

在主机中查看 /home。

[root@sail /]# cd /home
[root@sail home]# ls
admin  ceshi  f2  f3  sail  test.java

主机上的 /home 下已经有了 ceshi 目录。说明容器一经启动,就会在主机生成对应的挂载目录。

在容器中的 /home 下新建一个文件。

[root@ec95646b1a4c /]# cd /home
[root@ec95646b1a4c home]# ls
[root@ec95646b1a4c home]# touch test.java
[root@ec95646b1a4c home]# ls
test.java

查看主机的 ceshi 目录。

[root@sail home]# cd ceshi
[root@sail ceshi]# ls
test.java

此时主机中的 ceshi 目录下也有了这个文件。

关闭容器。

[root@ec95646b1a4c home]# exit
exit

修改主机中 /home/ceshi/test.java 文件的内容。

[root@sail ceshi]# vim test.java
# 此处编辑文件过程省略
[root@sail ceshi]# cat test.java
hello sail

重启容器。

[root@sail ~]# docker start ec95646b1a4c
ec95646b1a4c
[root@sail ~]# docker ps
CONTAINER ID   IMAGE          COMMAND             CREATED          STATUS         PORTS                    NAMES
ec95646b1a4c   centos         "/bin/bash"         19 minutes ago   Up 5 seconds                            charming_cartwright

查看 /home 下的文件。

[root@sail ~]# docker exec -it ec95646b1a4c /bin/bash
[root@ec95646b1a4c /]# cd /home
[root@ec95646b1a4c home]# ls
test.java
[root@ec95646b1a4c home]# cat test.java
hello sail

此时容器中的文件也更改了。

由此可见,数据卷技术实现的是双向同步。

权限设置

在使用命令方式设置卷时,还可以指定权限,以此保证数据安全。

参数

  • ro(readonly):只读。
  • rw(readwrite):可读可写。

以数据卷只读权限启动镜像。

[root@sail mysql]# docker run -it -v /home/sail:/home:ro centos /bin/bash

新建文件测试。

[root@02ef70c94920 home]# touch test.java
touch: cannot touch 'test.java': Read-only file system

容器内部该目录是没有写入权限的。

以数据卷可读可写的权限启动镜像。

[root@sail mysql]# docker run -it -v /home/sail:/home:rw centos /bin/bash
[root@48678e08f868 /]# cd /home
[root@48678e08f868 home]# touch test.java
[root@48678e08f868 home]# ls
apache-tomcat-9.0.55.tar.gz  jdk-8u301-linux-x64.rpm  test.java

新建文件测试。

[root@sail mysql]# docker run -it -v /home/sail:/home:rw centos /bin/bash
[root@48678e08f868 /]# cd /home
[root@48678e08f868 home]# touch test.java
[root@48678e08f868 home]# ls
apache-tomcat-9.0.55.tar.gz  jdk-8u301-linux-x64.rpm  test.java

容器内部该目录写入是没有问题的。

前面我们没有指定权限也可以写入,由此可见,数据卷默认是具有读写权限的。

具名挂载

启动镜像时只定义主机卷名称,不指定挂载目录。

[root@sail mysql]# docker run -it -v my-centos:/home centos /bin/bash
[root@3cf74e9e6973 /]#

查看目前挂载的卷。

# 使用 Ctrl + P + Q 不退出容器的情况下回到主机目录。
[root@sail mysql]# docker volume ls
DRIVER    VOLUME NAME
local     my-centos

查看卷的详情。

[root@sail mysql]# docker volume inspect my-centos
[
    {
        "CreatedAt": "2021-12-20T16:55:35+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/my-centos/_data",
        "Name": "my-centos",
        "Options": null,
        "Scope": "local"
    }
]

卷挂载在 /var/lib/docker/volumes/卷名/_data 目录下。

在没有指定主机挂载目录的情况下,会默认挂载到该目录。

由于指定了卷名,所以这种方式称为具名挂载。

匿名挂载

启动镜像时只指定容器目录。

[root@sail mysql]# docker run -it -v /home centos /bin/bash

查看目前挂载的卷。

[root@sail mysql]# docker volume ls
DRIVER    VOLUME NAME
local     159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940

查看卷的详情。

[root@sail mysql]# docker volume inspect 159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940
[
    {
        "CreatedAt": "2021-12-20T17:05:23+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940/_data",
        "Name": "159830cf55550c9a39e845c1d96aa04cc762005bc0c64d15d5066834b47df940",
        "Options": null,
        "Scope": "local"
    }
]

卷也是挂载在 /var/lib/docker/volumes/xxx/_data 目录下。

在没有指定主机挂载目录的情况下,会默认挂载到该目录。

由于没有指定卷名,所以这种方式称为匿名挂载。

只有指定主机目录的情况下会挂载到指定目录,否则都会挂载到默认目录。

实战

mysql数据同步

数据库中的数据极为重要,必须同步到主机,否则将会有非常大的数据丢失风险。

这里以 mysql 镜像为例演示数据同步的过程。

启动 mysql 镜像。

[root@sail ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
ffbb094f4f9e: Pull complete 
6c1cb25f7525: Pull complete 
Digest: sha256:d1cc87a3bd5dc07defc837bc9084f748a130606ff41923f46dec1986e0dc828d
Status: Downloaded newer image for mysql:5.7
a016e564d977550e475474556cfd033fb1c731002381bc9f9544c63fccb7f60c

其中 -e 为环境配置。安装启动 mysql 需要配置密码。

使用docker inspect查看挂载情况。

Untitled

已经生成了两个目录的挂载。

查看主机同步的目录。

[root@sail ~]# cd /home
[root@sail home]# ls
admin  ceshi  f2  f3  mysql  sail  test.java
[root@sail home]# cd mysql
[root@sail mysql]# ls
conf  data

主机已经同步了容器挂载的目录。

使用数据库管理工具连接测试(这里使用 IDEA 自带的数据库工具)。

标签:home,sail,mysql,原理,镜像,Docker,root,docker
From: https://www.cnblogs.com/fantasy-ke/p/18099032

相关文章

  • Docker基本命令
    Docker基本命令......
  • 十本你不容错过的Docker入门到精通书籍推荐
    前言:最近有许多小伙伴私信让我推荐几本关于Docker学习的书籍,今天花了一下午的时间在网上查阅了一些资料和结合自己平时工作中的一些学习参考资料书籍写下了这篇文章。注意以下书籍都是十分优秀的Docker学习书籍(因此排名不分先后),以下的每本书都有值得我们学习和钻研的地方,假如......
  • 什么是IP代理?工作原理又是怎样的呢?(代理中国)
    在互联网日常运营中,IP代理作为一种重要的网络隐私保护手段,越来越受到人们的关注。那么,什么是IP代理?它的工作原理又是怎样的呢?本文将为您揭开IP代理的神秘面纱。IP代理定义IP代理,也称为代理服务器,是一种网络服务,它允许用户通过代理服务器访问互联网。简单来说,IP代理......
  • ReentrantLock 原理
    (一)、非公平锁实现原理1、加锁解锁流程先从构造器开始看,默认为非公平锁实现publicReentrantLock(){sync=newNonfairSync();}NonfairSync继承自AQS没有竞争时加锁流程构造器构造,默认构造非公平锁(无竞争,第一个线程尝试加锁时)加锁,luck(),finalvoidlo......
  • [docker] 浅谈Docker:网络模式及从容器内部访问宿主机的IP地址
    0序本文系转载参考文献,属于非原创的笔记类博文。最新结论:从Docker容器内部访问宿主的IP地址的几种方法,推荐基于Bridge模式+--link访问别的服务+172.16.0.1(访问宿主机)。1Docker的网络模式docker是比较流行的容器技术,docker镜像方便程序员对应用统一的要求,打包部......
  • 精准化测试原理简介
    小时候大家应该都玩过一个游戏,游戏很简单,就是找不同,在规定时间内两幅图直接的差异点找到就算赢,越快越好,就像下面这样:上面这个不同点想找很简单,那么下面这样的呢?这个,确实有的人会说"我可以!"。比如在综艺节目"最强大脑"中,这群"变态"的非人类确实可以反正我不行,我也不信你们看到......
  • t检验原理
    t检验是一种常用的统计方法,用于比较两个样本均值是否有显著差异。它的基本原理是通过计算样本均值之间的差异,以及这种差异相对于样本误差的大小来判断差异是否显著。t检验的基本步骤如下:1.假设两个样本是独立、随机抽取的,并且符合正态分布。2.计算两个样本的均值和标准差......
  • 详细解析记忆泊车的顶层技术原理
    详细解析记忆泊车的顶层技术原理附赠自动驾驶学习资料和量产经验:链接相对于记忆行车而言,记忆泊车MPA(MemoryParkingAssist)可以看成是停车场区域内的一个自动驾驶功能,可帮助用户按记忆的路线自动巡航并泊入车位或自动从车位泊出并巡航至泊出点。如下图表示了记忆行车和记忆泊......
  • 使用Docker搭建测试用例管理平台TestLink:简易指南
    简介Testlink是一款免费开源的测试管理软件,基于WEB的测试用例管理系统,主要功能是:测试项目管理、产品需求管理、测试用例管理、测试计划管理、测试用例的创建、管理和执行,并且还提供了统计功能。为了方便快速部署TestLink,并且保持环境的一致性,我们可以使用Docker进行搭建。本文将......
  • 如何理解CDN?说说实现原理?
    一、是什么CDN(全称ContentDeliveryNetwork),即内容分发网络构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN 的关键技术主要有内......