开发者学堂课程【Docker 快速入门:Docker 容器数据卷用 DockerFile 添加】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/616/detail/9403
Docker 容器数据卷用 DockerFile 添加
1、用命令直接添加容器数据卷,就是-v,docker run -it v / 宿主机绝对路径目录:/容器内目录: ro 镜像名。
2、第二种方法 dockerfile 添加,是什么?
JavaEE Hello. Java--->Hello.class
Docker images====>DockerFile
类比相当于是对 images 镜像的一种源码集表述,如果连续改 class,想怎么做都可以。
3、查询 tomcat。
Supported tags and respective Dockerfile links
支持的标记和相关的 Dockerfile 连接,tomcat 从 789 都给,选择 8.5.32,点开。
FROM openjdk:8-jre
DockerFile 体系结构
FROM
MAINTAINER
RUN
EXPOSE
WORKDIR
ENV
ADD
COPy
VOLUME
CMD
ENTRYPOINT
ONBUILD
from 像 java 中的 extends 继承,extends object 一个镜像不可能独立的构建,
ENV CATALINA HOME /usr/local/tomcat
任何的 linux 都有个 user/local,docker 下的就是精简版小型化的精巧版的 linux系统,比如 200 多兆的 centos。
ENV PATH $CATALINA HOME/bin:$PATH
RUN mkdir -p "$CATALINA HOME "
运行 linux 命令
NORKDIR $CATALINA_HOME
\是连接符,一行写不下,转行,代表折行。
EXPOSE 8080
当前 DockerFile 决定了镜像是什么,最终暴露出的默认端口是 8080。
CHD["catalina . sh"run]
启动 tomcat。
回到 tomcat。
输入 https://hub.docker.com/ /redis/。
点击 4.0 版。
tomcat 暴露出的端口是 8080。
EXPOSE 6379
CMD [' "redis-server "]
images 是镜像模版的描述文件,DockerFile 有自己的语法规则,类似 linux 中的脚本编程,DockerFile 是 docker 编程。
4、利用 DockerFile 完成容器卷的管理。
(1)根目录下新建 mydoqker 文件夹并进入。
目前在主机,docker ps,后台没有运行任何容器实例,
mkdir /mydocker
cd /mydocker/
Ll
Pwd
mydocker
(2)可在 Dockerfile 中使用 VOLUME 指令来给镜像添加一个或多个数据卷。
假设可以一对多,一个笔记本上可以接两个活动硬盘,三个活动硬盘,主要有足够的 usb 接口,没有任何问题。VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
宿主机的 json 串,证明可以连多个,只支持容器内
说明:
出于可移植和分享的考虑,用 -v 主机目录,容器目录这种方法不能够直接在Dockerfile 中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。假设在用 Dockerfile 写 abc 目录,目前机器有,但是如果把Dockerfile 放到别的机器上,别的机器没有 abc 目录,迁移就会收到影响,所以不存在。
(3)File 构建
编写 Dockerfile,就是 Dockerfile 的构建。Vim Dockerfile
像 linux 编程一样,编写 Dockerfile。
# volume test
当前自己做的 Dockerfile 来自于父类的镜像 FROM centos,extends object 或者extends user service dio。
FROM centos
在当前的 centos 中,根目录下面新建两个容器卷,data1,data2
VOLUME["/dataVolumeContainer1"," /dataVolumeContainer2" ]
cmd 在 linux 世界里,centos 打出一句话,像 java 中 system out println,logo附件,日志
CMD echo "finished ,--------success1"
某个主机的目录
CMD /bin/bash
翻译成上一讲 docker 命令方法,host 不支持,因为有迁移性
docker run - it -V/host1: /dataVolmeContainer1 V/host2: /dataVolumeContainer2 centos /bin/bash
所以只能在当前 centos 上面生成 data1,data2。先编写可执行的 dockerfile 脚本。
(4)build 后生成镜像,获得一个新镜像 zzyy/centos
在 docker 架构图中有 docker build 命令,build 就是 dockerfile 文件,将它 bulid 成为一个新的镜像模版。
docker build -f /mydocker/ dockerfile2 -t zzyy/ centos.
f 是 file,指明 dockerfile 在哪,-t 命名空间,镜像名字,在当前目录下面。
如果名字是 dockerfile,可以不加 -f。
docker build -f /mydocker/ dockerfile -t zzyy/ centos.
一层一层执行相关的命令,构建以当前的模版,添加了两个新功能,添加了两个容器数据卷,构建更新的镜像文件运行。镜像像花卷,是一层套一层,就像同心圆,一圈一圈套着,只访问最外层。
第一层
FRCM . centos
第二层
VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"]
dockerfile 获得新的镜像 zzyy/centos,主要是为了和命名区别开。
发送上下文的 docker daemon,跟 docker 主进程沟通。
分成很多层。
Step 0 : FROM centos
--> 88ec626ba223
Step1:VOLUME/dataVolumeContainer1 /dataVolumeContainer2
-> Running in a0aebb14fd2b
--->146824fe5c32
Removing intermediate container a0aebb14 fd2b
Step 2 : CMD echo " finished, ·----·-- success1 "
---> Running ịn 5964 cbf2 fbce
---> f318b0dddb6a
Removing intermediate container 5964cbf2fbce
Step 3 : CMD /bin/bash
-> Running in 26ae67aee790
---> ee2a35672484
Removing intermediate container 26ae67aee790
最后一层一层叠加
Successfully built ee2a35672484
docker images
ee2a 开头,如果运行容器,直接就会在centos下面建两个容器卷,dataVolumeContainer1,dataVolumeContainer2
,一出场就挂了两个活动硬盘。
REPOSITORY |
IMAGE ID |
zzyy/ centos |
ee2a35672484 |
atguigu/ mytomcat |
4db6a44256b2 |
mongo |
ca96c146aa68 |
hello- world |
3535063d9957 |
tomcat |
d94da71c3a1f |
centos |
88ec626ba223 |
docker images zzyy/ centos 可以查出。
(5)run 容器
docker run - it zzyy/ centos
不写 bin/bash 也可以,容器卷会告诉执行是否成功,登陆到 cmd/bin/bash,抵消终端命令行登陆,
打出 CMD . echo . "finished, --------success1",说明容器卷运行到这一行。
image 是镜像,而现在 9cb93a45687d 是容器,pwd 进去之后,精简版 centos 中有根目录,如果运行阿里云的 centos,一开始没有容器卷,用自定义的有dataVolumeContainer1
dataVolumeContainer2
(6)通过上述步骤,容器内的卷目录地址已经知道对应的主机目录地址哪?
目前使用 dockerfile 形式在容器里面创建两个容器卷,容器卷要跟宿主机进行数据的交互和沟通,
Cd dataVolumeContainer1
Pwd
dataVolumeContainer1
touch containt01. txt
ll
在容器中创建一个,因为没有指定宿主机的绝对路径,docker 会给一个默认,打开终端,
Docker ps
Docker inspect 9cb93a45687d
/var/ lib/ docker/ Volumes/
406f208fdb961a3b471e67b95b9 d2fec4e18266c7506b3597aca22b3b8ed0244/ data
如果用 dockerfile 生成,没有指定宿主机,读写都是 true,dataVolumeContainer1 是容器内的容器卷,/var/ lib/ docker/
Volumes/406f208fdb961a3b471e67b95b9 d2fec4e18266c7506b3597aca22b3b8ed0244/ data
是本地机器宿主机的,再开一个终端,
Cd/var/ lib/ docker/ Volumes/
406f208fdb961a3b471e67b95b9 d2fec4e18266c7506b3597aca22b3b8ed0244/ data
Pwd
主机上
Ll
可以看到有 containt01.txt,变相的实现宿主机到容器,容器到宿主机的数据共享。
touch host. txt
Ll
主机上有了,在容器中 ll,也有了。
(7)主机对应默认地址,跟案例一样。
5、如果有机器出现问题,确认容器卷后,不能写,如果出现以下报错。
Docker 挂载主机目录 Docker 访问出现 cannot open directory : .Permission denied
解决办法:在挂载目录后多加一个--privileged=true 参数即可
docker run -it -v /myDataVolume : /dataVolumeContainer --privileged=true
镜像名
这就是用 dockerfile 添加数据卷。