开发者学堂课程【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:
回车,点开 tomcat:
支持的标记和相关的 docker file 连接, tomcat 789 都列出来了,下面就选一个8.5.32,中规中矩,或者随便一个。点开:
红圈部分就是dockerfile,下面来写一下:
[root@atguigu桌面]#docker images
[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 命令。
中间这些复杂的东西太长,需要转行折行代表这是个连接符。
看到最后发现
Expose 当前的 dockerfile 决定镜像长什么样,最终对外暴露出的默认端口是8080。
CMD ["cataling.sh","run"],就是启动 tomcat。
回到 docker hub:
看 redis:
也有 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
这个 docker file 文件将 build 成为一个新的镜像模板。这个 build 怎么用呢?
[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
step2:CMDecho"finished--------success1”有这一行内容,说明容器卷已经运行到了这一行。
从 STEP0123 可以看出,它生成了很多层。
[root@atguigu mydocker]#
运行这个容器以后直接就会在容器里面的 centos 下面直接建两个容器卷,分别为date container volume1,date container volume2。相当于这个本子一出场就挂了两个活动硬盘,那么何以见得呢?
[root@atguigu mydocker]# docker images zzyy/centos
[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 模式添加数据卷的全部内容。