Docker 容器数据卷用 dockerfile 添加|学习笔记

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 快速学习 Docker 容器数据卷用 dockerfile 添加

开发者学堂课程【Docker 快速入门Docker 容器数据卷用 dockerfile 添加】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/850/detail/14043


Docker 容器数据卷用 dockerfile 添加  


内容介绍

一.Dockerfile 是什么

二.Docker 容器数据卷用 dockerfile 添加  


一.Dockerfile 是什么

JavaEE Hello.java ----> Hello.class  

Docker  images ----> DockerFile

类比之后它相当于说是对 Hello.class 这个镜像的一种源码级的描述,如果能去改Hello.class ,言下之意,镜像想怎么做都可以。  

DockerFile 体系结构:

-FROM

-MAINTAINER  

-RUN -EXPOSE  

-WORKDIR  

-ENV -ADD

-COPY

-VOLUME

-CMD

-ENTRYPOINT  

-ONBUILD  

在 docker hub 查一下常用的 tomcat:

image.png

回车,点开 tomcat:

image.png

image.png

支持的标记和相关的 docker file 连接, tomcat 789 都列出来了,下面就选一个8.5.32,中规中矩,或者随便一个。点开:

image.png

红圈部分就是dockerfile,下面来写一下:  

[root@atguigu桌面]#docker images

image.png

[root@atquiqu 桌面]#  

1 FROM openjdk:8-jre

以前提过一个问题,为什么 tomcat 是400多 MB?这个是 tomcat 镜像,言下之意tomcat8 这个镜像里面默认包了一层 jdk。 不装 jdk tomcat 没法跑起来,现在能直接跑说明 jdk 已经装好了,比方说买方便面,打开那个盖子,里面默认自带调料包和叉子。 from 有点像 Java 里面的 extence 继承,Java 里面的代码默认是不写,大家都应该知道。Extence object 以及镜像不可能孤立的构建总要有个源头。这个镜像又来自哪儿?  

3 ENV CATLINA_HOME/user/local/tomcat

假设现在让你去看一个源代码,需要有这个技术的探索和研发能力,就是配CATLINA HOME 在 Linux 环境下面有 usr local。

[root@atguigu桌面]#cd/usr/local/  

[root@atguigu local]# pwd  usr/local

[root@atguigu local]#

Docker 下面下载的东西就是精简版的小型 linux 系统。  

5 RUN mkdir -p "$CATALINA HOME"

RUN 是运行 linux 命令。  

image.png

中间这些复杂的东西太长,需要转行折行代表这是个连接符。

image.png

看到最后发现

Expose 当前的 dockerfile 决定镜像长什么样,最终对外暴露出的默认端口是8080。

CMD ["cataling.sh","run"],就是启动 tomcat。  

回到 docker hub:

看 redis:

image.png

也有 from,结尾和刚才一样。只不过 tomcat 暴露出的端口是8080,redis 是6379,最后 redis server。

所以就懂得 Docker  images ----> DockerFile

是镜像这个模板的描述文件。


二.Dockerfile 完成容器卷的管理

Dockerfile 添加:

根目录下新建 mydocker 文件夹并进入

[root@atguigu:/] docker ps

[root@atguigu /]#mkdir /mydocker  

[root@atguigu/]# cd/mydocker/  

docker run -it 镜像名

docker run -it -v/myDataVolume:/dataVolumeContainer 镜像名  

docker run -it -v/宿主机绝对路径目录:/容器内目录:ro镜像名

docker run -it -v/myDataVolume:/dataVolumeContainer:ro 镜像名  

是什么

JavaEE Hello.java ----> Hello.class  

Docker images ====> DockerFile  

也就是一个笔记本上可以接两个活动硬盘,三个活动硬盘,只要有足够的 usb 接口,就没有任何问题。  

可在 Dockerfile 中使用 VOLUME 指令来给镜像添加一个或多个数据卷 VOLUME["/dataVolumeContainer","/dataVolumeContainer2""/dataVolumeContainer3"]  

// volume 的语法规则是 json 串,说明可以连多个。上节课讲的是宿主机的加容器内的,而这个只支持容器内。

说明: 出于可移植和分享的考虑,用 -v 主机目录:容器目录这种方法不能够直接在 Dockerfile 中实现。

由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。  

假如现在写死了一个假设,用 dockerfile 去写,要 ABC 中的一个目录,这台机器上是有的,那么如果把 dockerfile 放在别的机器上,可能那个机器上是没有 ABC 这个目录的,它迁移性受到影响,所以说它不存在这个。那么接下来要做的是的File构建。

File构建

[root@atguigu mydocker]# pwd

/mydocker

[root@atguigu mydocker]# vim Dockerfile  

下面需要大家自学一下:

#volume test  

FROM centos VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"]

CMD echo "finished,--------success1"  

CMD /bin/bash

自学十秒钟。  

FROM centos 说明这个镜像,当前自己要做的 dockerfile 来自于一个父类的镜像相当于 extence usr service。也说明要在当前的 centos 根目录下面新建两个容器卷,date1,date2。  

CMD 在 linux 里面:  

docker run -it -v/host1:/dataVolumeContainer1-v/host2:/dataVolumeContainer2  centos/bin/bash

如果把第一段红色部分 dockerfile 翻译成上一讲讲的直接命令的方法,大致就是等于说明这段。但是由于不支持 host,因为他有迁移性。那么所以第一段红色部分只能在当前跑了以后,centos 径向下面生成一个 date1 和 date2。

build 后生成镜像 --获得一个新镜像 zzyy/centos  

image.png

这个 docker file 文件将 build 成为一个新的镜像模板。这个 build 怎么用呢?

image.png

[root@atguigumydocker]#pwd

/mydocker

[root@atguigumydocker]#vimDockerfile

[root@atguigumydocker]#ll

总用量4

-rW-r--r--1rootroot1347月1223:38Dockerfile

[root@atguigumydocker]#docker

build-f/mydocker/Dockerfile-tzzyy/centos

SendingbuildcontexttoDockerdaemon2.048kB

SendingbuildcontexttoDockerdaemon

step0:FROMcentos

--->88ec626ba223

Step1:VOLUME/dataVolumeContainer1/dataVolumeContainer2

--->Runningina0aebb14fd2b

--->146824fe5C32

Removingintermediatecontainera0aebb14fd2b

step2:CMDecho"finished--------success1”

--->Runningin5964cbf2fbce

--->f318b0dddb6a

Removingintermediatecontainer5964cbf2fbce

Step3:CMD/bin/bash

--->Runningin26ae67aee790

--->ee2a35672484

Removingintermediatecontainer26ae67aee790

Successfullybuiltee2a35672484

[root@atguigumydocker]#dockerimages

image.png

step2:CMDecho"finished--------success1”有这一行内容,说明容器卷已经运行到了这一行。

从 STEP0123 可以看出,它生成了很多层。  

[root@atguigu mydocker]#

运行这个容器以后直接就会在容器里面的 centos 下面直接建两个容器卷,分别为date container volume1,date container volume2。相当于这个本子一出场就挂了两个活动硬盘,那么何以见得呢?  

[root@atguigu mydocker]# docker images zzyy/centos

image.png

[root@atguigu mydocker]#  

run 容器

注意 image 是镜像,进去了以后,精简版的 centos 有根目录。如果运行阿里云的centos,一开始就有 date volume container 1,date volume container 2两个容器卷,或者是三个容器圈。现在用了自定义的ll,回车:

[root@9cb93a45687d/]#ll

total52

lrwxrwxrwx.1rootroot7May3118:02bin->usr/bin

drwxr-xr-x.2rootroot4096Jul1303:43dataVolumeContainer1

drwxr-xr-x.2rootroot4096Jul1303:43dataVolumeContainer2

drwxr-xr-x.5rootroot380Jul1303:43dev

drwxr-xr-x.47rootroot4096Jul1303:43etc

drwxr-xr-x.2rootroot4096Apr1104:59home

lrwxrwxrwx.1rootroot7May3118:02lib->usr/lib

lrwxrwxrwx.1rootroot9May3118:02lib64->usr/ib64

drwxr-xr-x.2rootroot4096Apr1104:59media

drwxr-xr-x.2rootroot4096Apr1104:59mnt

drwxr-xr-x.2rootroot4096Apr1104:59opt

dr-xr-xr-x295rootroot0Jul1303:43proc

dr-xr-x---.2rootroot4096May3118:03root

drwxr-xr-x.10rootroot4096May3118:03run

lrwxrwxrwx.1rootroot8May3118:02sbin->usr/sbin

drwxr-xr-x.2rootroot4096Apr1104:59srv

drwxr-xr-x13rootroot0Jul1301:45sys

drwxrwxrwt.7rootroot4096May3118:03tmp

drwxr-xr-x.13rootroot4096May3118:02usr

drwxr-xr-x.18rootroot4096May3118:02var

[root@9cb93a45687d/]#

通过上述步骤,容器内的卷目录地址已经知道对应的主机目录地址哪??

现在是用 dockerfile 这种形式,在容器里面建了两个容器卷 date volume container 1,date volume container 2。但是容器卷重要的是容器卷跟宿主机进行数据的交互和沟通。

[root@9cb93a45687d dataVolumeContainer1]#pwd

/dataVolumeContainer1

root09cb93a45687d dataVolumeContainer1#touch containt01txt [root@9cb93a45687d dataVolumeContainer1]#ll  

total 0

rw-r--r--. 1 root root 0 Jul 1303:44containtotxt

[root@9cb93a45687d dataVolumeContainer1]#

一个在容器里面建了,这个是在容器里面,主机上在哪看到呢?因为这一轮并没有像以前的命令这是不是指定宿主机的绝对路径,但是 docker 也想到了,它会给你一个默认,打开终端:

[root@atguigu桌面]# docker ps

[root@atguigu桌面]# docker inspect 9cb93a45687d

回车:

{截取部分}

"Volumes”:{ "/dataVolumeContainer1”:"/var/lib/docker/volumes/406f208fdb961a3b471e67b95b9 d2fec4e18266c7506b3597aca22b3b8ed0244/_data” "/dataVolumeContainer2”:"/var/ib/docker/volumes/b7242dec7fe468cc0e50d613C4c22b331cf97f06ceb1d95177a4b14bc9c1e1b7c/_data”  

"VolumesRW”:{

"/dataVolumeContainer1”: true”

/dataVolumeContainer2”:true

/dataVolumeContainer1是容器内的容器卷,

/var/lib/docker/volumes/406f208fdb961a3b471e67b95b9 d2fec4e18266c7506b3597aca22b3b8ed0244/_data

是本地机器宿主机上的。  再开一个终端:

[root@atquigu桌面]#cd/var/lib/docker/volume40f208fb96134767b95b9d2fec4e182266c7506b3597aca22b3b8ed0244/_data  [root@atguigu_data]# pwd var/lib/docker/volumes/406f208fdb961a3b471e67b95b9d2fec4e18266c7506b3597aca22b3b8ed0244/_data  

[root@atguigu _data]#ll

总用量0

-rw-r--r--.1 root root07月1223:44containt1txt

[root@atguigu _data]#

又变相的实现了宿主机到容器,容器到宿主机之间的数据共享。主机有的,容器里也一样。

主机对应默认地址

备注

这里要说的问题是我的机器上没有出现,但是有些同学的机器上出问题:在建了容器卷以后会莫名其妙的会发现怎么不能写。  

出现这样的报错: Docker 挂载主机目录 Docker 访问出现 cannot open directoryPermission denied

解决办法:在挂载目录后多加一个 -privileged=true 参数即可 以上就是用 dockerfile 模式添加数据卷的全部内容。

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
相关文章
|
1月前
|
缓存 JavaScript 前端开发
Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具
Dockerfile 是容器化开发中的关键工具。理解并掌握其使用方式,不仅能提高开发效率,还能让你的应用具备更强的可移植性和灵活性。通过优化配置和合理安排构建步骤,可以打造更轻量、更高效的容器镜像。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
3月前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用
118 27
|
3月前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用。掌握这些Docker基础概念和操作,可以显著提高开发和部署效率,确保应用程序的可移植性和可扩展性。
111 22
|
3月前
|
存储 Ubuntu 关系型数据库
《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例
《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例
88 13
|
5月前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
6022 12
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
6月前
|
Docker 容器
docker中查看已创建的数据卷
【10月更文挑战第16天】
127 3
|
6月前
|
存储 缓存 Docker
docker中挂载数据卷到容器
【10月更文挑战第16天】
186 2
|
6月前
|
Docker 容器
docker中创建命名数据卷
【10月更文挑战第16天】
47 2
|
6月前
|
存储 JSON 数据格式
docker中查看数据卷
【10月更文挑战第15天】
117 2
|
Ubuntu 关系型数据库 Docker
实例解析Docker数据卷+数据卷容器+flocker数据共享+DockerHub操作
Docker内部数据管理和Docker之间的数据共享为数据卷和数据卷容器,实例解析1.将本地的文件作为容器的数据卷,2.数据卷flocker插件实现容器集群(或者Docker Swarm)的数据共享3.数据卷容器作为其他容器的数据卷.降低磁盘开销.4.数据的备份,恢复和迁移.5.Docker hub的常用操作. 1.0.数据卷(Data volumes) Data vol
2319 0