首页 > 其他分享 >docker镜像、容器数据卷

docker镜像、容器数据卷

时间:2022-10-09 15:05:35浏览次数:48  
标签:容器 tomcat 文件系统 挂载 镜像 docker


一、docker镜像

1、镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含 运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

2、docker镜像加载原理

2.1、 UnionFS (联合文件系统)

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统, 它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系 统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基 础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件 系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

2. 2、Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启 动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是 一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已 由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标 准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

docker镜像、容器数据卷_tomcat

平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?

对于一个精简的OS,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直 接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一 致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

3、分层管理

当我们pull一个镜像,是一层层下载(观察日志)

docker镜像、容器数据卷_tomcat_02

思考:为什么Docker镜像要采用这种分层的结构呢?

最大的好处,我觉得莫过于是资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机 只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服 务了,而且镜像的每一层都可以被共享

可以通过命令查看镜像分层方式


[root@kuangshen home]# docker image inspect redis:latest
[
// .....
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13",
"sha256:744315296a49be711c312dfa1b3a80516116f78c437367ff0bc678da1123e990",
"sha256:379ef5d5cb402a5538413d7285b21aa58a560882d15f1f553f7868dc4b66afa8",
"sha256:d00fd460effb7b066760f97447c071492d471c5176d05b8af1751806a1f905f8",
"sha256:4d0c196331523cfed7bf5bafd616ecb3855256838d850b6f3d5fba911f6c4123",
"sha256:98b4a6242af2536383425ba2d6de033a510e049d9ca07ff501b95052da76e894"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]


比如我们pull一个tomcat镜像,有6层镜像,pull下来之后,此时镜像都是只读的,当以此镜像新建容器启动时,一个新的可写层被加载到镜像的顶部!我们对此容器层进行一些操作(发布应用等)之后就形成了一个新的镜像,可以通过容器创建一个新的镜像进行发布

4、镜像提交

docker commit 从容器创建一个新的镜像。


docker commit 提交容器副本使之成为一个新的镜像! # 语法 docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]


测试


# 1、从Docker Hub 下载tomcat镜像到本地并运行 -it 交互终端 -p 端口映射
docker run -it -p 8080:8080 tomcat

# 2、进入tomcat容器
docker exec -it 容器id /bin/bash
# 注意:坑爹:docker启动官方tomcat镜像的容器,发现404是因为使用了加速器,而加速器里的
tomcat的webapps下没有root等文件!反而有个webapps.dist里有对应文件,cp -r
到webapps下!
root@aba865b53114:/usr/local/tomcat# cp -r webapps.dist/* webapps
此时访问已经有内容
curl localhost:8080

# 3、上面版本的tomcat和官网tomcat镜像已经有区别,我们使用它为模板commit一个
tomcat新镜像, tomcat02
docker ps -l # 查看容器的id
# 注意:commit的时候,容器的名字不能有大写,否则报错:invalid reference format
docker commit -a="lph" -m="no tomcat docs" 1e98a2f815b0 tomcat02:1.1
sha256:cdccd4674f93ad34bf73d9db577a20f027a6d03fd1944dc0e628ee4bf17ec748
[root@lph /]# docker images # 查看,我们自己提交的镜像已经OK了!

# 4、这个时候,我们的镜像都是可以使用的,大家可以启动原来的tomcat,和我们新的tomcat02来
测试看看!
[root@lph ~]# docker run -it -p 8080:8080 tomcat02:1.1
# 如果你想要保存你当前的状态,可以通过commit,来提交镜像,方便使用,类似于 VM 中的快照!

如何tomcat02发布到仓库让别人使用,学习后面dockerfile


二、容器数据卷

1、问题

我们将应用和应用运行环境一起打包成镜像,将此将此镜像提交并发布供他人使用,这个就是docker里面。别人pull这个镜像之后可以使用此镜像创建一个容器并运行,但是运行过程中产生的数据也是存在容器内的,但是如果容器删除之后,容器内的数据也被删除,如果解决这个问题?

2、容器卷技术

如何将容器内产生的数据同步到Liunx本地文件系统这种技术就是卷技术,通过此技术达到容器数据的持久化和双向同步,并且容器卷技术支持容器间数据共享

2.1、使用容器卷

方式一:容器中直接使用命令来添加


# 命令 docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名 # 测试 [root@lph ~]# docker run -it -v /home/ceshi:/home centos /bin/bash


看数据卷是否挂载成功


docker inspect 容器id


docker镜像、容器数据卷_运维_03

测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!

测试容器停止退出后,主机修改数据是否会同步!

1. 停止容器

2. 在宿主机上修改文件,增加些内容

3. 启动刚才停止的容器 4. 然后查看对应的文件,发现数据依旧同步!ok

2.2、docker安装mysql及数据持久化操作


docker images -a
docker ps -a

docker search mysql --filter=stars=20000
docker pull mysql

#启动挂载
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:latest

#使用本地的navicat连接测试一下 3310
本地创建数据库可以看到数据同步到/home/mysq/data并且如果删除容器,然后发现远程连接失败!但是数据还是在本地


2.3、匿名和具名挂载

-v 容器路径      

 这种是匿名挂载,只指定了容器内路径 没有写外部路径


docker run -d -P --name nginx01 -v /etc/nginx nginx

#匿名挂载的缺点,就是不好维护,通常使用命令 docker volume维护
docker volume ls


-v 卷名:容器内路径

这种是具名挂载


docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx

查看挂载的路径
docker volume inspect nginxconfig
[
{
"CreatedAt": "2020-05-13T17:23:00+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginxconfig/_data",
"Name": "nginxconfig",
"Options": null,
"Scope": "local"
}
]

可以看到docker卷名挂载路径在/var/lib/docker/volumes下


-v /宿主主机路径::容器内路径

 是具名挂载 指定路径挂载,参考上面的mysql方式

 改变文件的读写权限


# ro: readonly  #只读权限
# rw: readwrite #可读可写
# 一旦设置了ro 说明这个路径只能通过宿主机操作,容器内无法操作
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx


3、通过Docker File 来添加(了解)

上面我们是通过commit提交镜像

DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本。 我们在这里,先体验下,后面我们会详细讲解 DockerFile !

标签:容器,tomcat,文件系统,挂载,镜像,docker
From: https://blog.51cto.com/u_11334685/5740467

相关文章

  • docker 下nginx 实现文件下载
     1、新建目录存放文件 2、将目录挂载到容器,新增配置如下  3、nginx配置文件新增配置location~*(.*.apk){#代理后缀为apk的文件add_h......
  • Docker File
    概述DockerFile是一个由一系列命令组成的脚本文件,该脚本文件用来构建镜像文件,比如官方的tomcat、ngnix都是通过dockerfile构建的镜像流程:开发应用=>DockerFile=>打包为镜像......
  • docker网络
    容器之间网络互通测试理解Docker0准备工作:清空所有的容器,清空所有的镜像dockerrm-f$(dockerps-a-q)#删除所有容器dockerrmi-f$(dockerimages-qa)#删除全部......
  • docker部署项目注意事项记录
    1.不同容器之前通信,如前端容器与后端容器,需要注意配置文件(如前端nginx的nginx.conf,后端的application.yml)里的ip地址要为宿主机的具体ip,如192.168.0.12,而不能为loca......
  • docker start a web container
    dockerstartawebcontainerStep1:SetupDefinetheapplicationdependencies.Createadirectoryfortheproject:mkdirwebcdwebCreateafilecalled......
  • docker常用命令
    镜像命令1.启动类命令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestartdocker查看docker状态:systemctlstatusd......
  • 重温 Docker 分享+相关讲解视频
     之前学过 Docker 相关的知识,只是长时间没用,基本都给忘了。这几天重温一下,好好学习一下虚拟化技术。docker k8s ## 分享一个不错的系统学习Docker 的视频 这是我......
  • 记录Linux下启动docker中Mysql,并进入mysql。
    1.启动dockersystemctlstartdocker  2.查看docker容器启动信息,并找到mysql容器  3.使用进程名启动mysql:dockerstartmysql-test;也可以使用进程id启动:docker......
  • docker jenkins升级以及失败处理
    一、概述jenkins是由docker安装的,目前的jenkins版本为2.356。然后jenkins右上角提示版本升级 点击了升级,升级完成后,需要重启一下。然后就芭比Q了,访问jenkins出现504......
  • 一份最好的Docker 安装教程
    ## 到开源的社区的怀抱中去 阿里云社区,给我们提供非常多的教程,都是最专业的人。 ## 不复制粘贴了,放一个安装教程的链接过来​​https://yq.aliyun.com/articles/110......