目录
1. Docker数据管理
1.1 数据卷
1.2 挂载目录
1.3 数据卷容器
2. Dockerfile构建镜像
2.1 构建基础镜像
2.2 基本结构
2.3 准备工作
2.4 创建镜像
1. Docker数据管理
docker在容器中管理数据主要有两种方式:
- 数据卷(Volumes)
- 挂载主机目录(Bind mounts)
1.1 数据卷
为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认的联合 文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷 可以在容器之间共享和重用
- 对 数据卷 的修改会立马生效
- 对 数据卷 的更新,不会影响镜像
- 数据卷 默认会一直存在,即使容器被删除
1. 创建数据卷
docker volume create my-vol
2. 查看所有数据卷
docker volume ls
3. 查看数据卷信息
docker volume inspect my-vol
4. 删除一个volume
docker volume rm my-vol
数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动 删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷 可能会占据很多空间,所以要及时删除.
5. 挂载数据卷
在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷 。
docker run -itd \
--name 容器名字 \
--mount source=数据卷名称,target=容器中的对应目录 \
镜像名称
最好是通过run而非create/start创建启动容器,create/start命令创建启动容器后,再挂载数据卷 相当麻烦,要修改很多配置文件,但并非不可以
加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行 输入,直到读到结束符,如回车
如果数据卷不存在,docker会自动创建
如果容器上目录不存在, docker会自动创建
6. 查看挂载在数据卷的容器具体信息
docker inspect name
1.2 挂载目录
docker run -itd \
--name 容器名字 \
--mount type=bind,source=宿主机目录,target=容器中的对应目录 \
镜像名称
1.3 数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。 数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
1. 创建数据卷容器
docker run -itd --name name01 -v dir centos
2. 挂载数据卷容器
docker run -itd --name name02 --volumes-from name01 centos
3. 备份数据卷容器
先创建一个数据卷容器,进入容器中添加一个数据
docker run -it -v /opt --name test_1 centos:7 /bin/bash
echo "123321" > /opt/1.txt
在容器中创建完成之后,先退出容器,进行备份操作
docker run -it --volumes-from test_1 -v /mnt:/mnt centos:7 tar cvf /mnt/opt.tar /opt
#--volumes-from test_1 :指定数据卷容器所在
#-v /mnt:/mnt :共享该容器中mnt目录到主机的mnt
#tar cvf /mnt/opt.tar /opt :这个较为绕,mnt是该容器跟主机之间共享的一个目录。所以将备份后的数据放到这个文件中,好备份之后直接导到主机。
#而后面跟随的备份目标路径,则是该容器与数据卷容器之间的共享目录,因为要对数据卷容器进行备份,所以则是需要备份该目录
备份完成之后,直接到主机的mnt目录下查看即可。因为我们上面共享的就是mnt目录
ls /mnt/
opt.tar
tar xvf opt.tar
#将备份好的数据解压,并且查看文件内的数据
cat ./opt/1.txt
123321
#这个数据就是我们之前写进去的
4. 还原数据卷容器
恢复备份就很简单了,将上面的操作在继续做一遍就可以了,将压缩换成解压
例如,下面我们模拟,需要再创建一个新的数据卷容器,并且需要导入上面这个数据卷容器的数据
#创建数据卷容器,并且共享opt目录
docker run -it -v /opt --name test_2 nginx:1.12 /bin/bash
#创建一个容器,作用是从主机中获取文件,并且将该文件传输给数据卷容器
docker run -itd --volumes-from test_2 -v /mnt:/mnt nginx:1.12 tar xvf /mnt/opt.tar -C /opt/
#到数据卷容器中查看结果
cd opt/ && ls
opt #因为我们之前直接压缩的就是opt目录,所以解压也是这个目录
cat ./opt/1.txt
123321
#结果正确
数据卷与数据卷容器都是可以实现容器与主机或者容器与容器之间的一对一或者一对多的一种资源共享。可以方便的将本地主机上面的资源导入/上传到容器,容器中的也能到主机中。方便对于容器的管理。
而且备份功能,可以将一个容器中的主要的并且不方便封装进镜像中的资源,进行打包,存放在本地。等到需要的时候,再导入到新的容器中或者恢复到原来的容器,是一个较为重要的方面
2. Dockerfile构建镜像
Dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像,另外,使 用Dockerfile去构建镜像好比使用pom去构建maven项目一样,有异曲同工之妙
2.1 构建基础镜像
- centos
- alpine
1. 空间大小差异,alpine默认5M左右,centos等都在200M左右。
2. 默认软件包差异,alpine选用busybox,centos等则是bash+coreutils几件套。
3. alpine中,国际化组件被优化掉了。
4. 还有一点,alpine中选用的都是“最简依赖”,这点和archlinux比较像,举个例子, openssh包不会自带pam插件,于是他也就不支持ldap。这点我给alpinelinux官方提过 issue。和php不一样,php可以做成php-pdo,php-dom的包,然后动态加载共享库。 openssh不行,“没带就是没写”。
5. glibc差异,alpine选用musl,centos等选用glibc,其他的倒还好,libc的差异对开发很重 要。
2.2 基本结构
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
2.3 准备工作
- 创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件
- 编写 Dockerfile 文件
#1.指定基础镜像,并且必须是第一条指令
FROM centos:latest
#2.指明该镜像的作者和其电子邮件
MAINTAINER xx "xx@qq.com"
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/java
#4.一个复制命令,把jdk安装文件复制到镜像中,注意:jdk*.tar.gz使用的是相对路径
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/
#5.配置环境变量
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_221
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
#容器启动时需要执行的命令
#CMD ["java","-version"]
如果仅仅是把本地的文件拷贝到容器镜像中,COPY 命令是最合适不过的。其命令的格式 为:COPY ADD 命令的格式和 COPY 命令相同,也是:ADD 区别:ADD解压压缩文件并把它们添加到镜像中
2.4 创建镜像
编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像。
docker build -t jdk:1.0 .
- 注1:-t jdk8:v1.0 给新构建的镜像取名为 jdk8, 并设定版本为 v1.0
- 注2:注意最后有个点,代表使用当前路径的 Dockerfile 进行构建