docker
在容器中管理数据主要有两种方式:
数据卷(
Volumes
)
挂载主机目录(
Bind mounts
)
数据卷
为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认联合文件系统,而以正常的文件或者目录的形式存在于宿主机上,又被称作数据卷。
数据卷
是一个可供一个或多个容器使用的特殊目录,它绕过
UFS
,可以提供很多有用的特性:
1.数据卷
可以在容器之间共享和重用
2.对
数据卷
的修改会立马生效
3.对
数据卷
的更新,不会影响镜像
4.数据卷
默认会一直存在,即使容器被删除
创建数据卷: docker volume create my-vol
查看所有数据卷:
docker volume ls
查看数据卷信息: docker volume inspect my-vol
删除一个volume:
docker volume rm my-vol
数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,
Docker
不会在容器被删除后自动
删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷
可能会占据很多空间,所以要及时删除
.
挂载数据卷:
在用
docker run
命令的时候,使用
--
mount
标记来将
数据卷
挂载到容器里。在一次
docker
run
中可以挂载多个
数据卷
。
docker run -itd \--name 容器名字 \--mount source= 数据卷名称 ,target= 容器中的对应目录 \镜像名称
最好是通过
run
而非
create/start
创建启动容器,
create/start
命令创建启动容器后,再挂载数据卷
相当麻烦,要修改很多配置文件,但并非不可以
加了
“\”
意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车
如果数据卷不存在,
docker
会自动创建
如果容器上目录不存在,
docker
会自动创建
查看数据卷的具体信息 docker inspect 容器名称
挂载目录:
docker run -itd \--name 容器名字 \--mount type=bind,source= 宿主机目录 ,target= 容器中的对应目录 \镜像名称
数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
创建数据卷容: docker run -itd --name name -v dir centos
挂载数据卷容器:docker run -itd --name name --volumes-from db_data centos
Dockerfile构建镜像
Dockerfile
是一个文本格式的配置文件, 用户可以使用
Dockerfile
来快速创建自定义的镜像,另外,使用Dockerfile
去构建镜像好比使用
pom
去构建
maven
项目一样,有异曲同工之妙
构建基础镜像
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的差异对开发很重
要。
基本结构
Dockerfile
由一行行命令语句组成,并且支持以
#
开头的注释行。
一般的,
Dockerfile
分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

准备工作
1.创建文件夹上传
jdk
的安装包
,
和在同级目录下编写
Dockerfile
文件
2.编写
Dockerfile
文件
#1.指定基础镜像,并且必须是第一条指令FROM centos:latest#2.指明该镜像的作者和其电子邮件MAINTAINER xx "xx@qq.com"#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录WORKDIR /usr/local/java#4.一个复制命令,把jdk安装文件复制到镜像中,注意:jdk*.tar.gz使用的是相对路径,则与 #Dockerfile文件同级ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/#5.配置环境变量ENV JAVA_HOME=/usr/local/java/jdk1.8.0_221ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV PATH=$JAVA_HOME/bin:$PATH#容器启动时需要执行的命令#CMD ["java","-version"]
如果仅仅是把本地的文件拷贝到容器镜像中,
COPY
命令是最合适不过的。
其命令的格式为:COPY
<src> <dest>
ADD
命令的格式和
COPY
命令相同,也是:
ADD <src> <dest>
区别:
ADD
解压压缩文件并把它们添加到镜像中
创建镜像
编写完成
Dockerfile
之后,可以通过
docker build
命令来创建镜像。
docker build -t jdk8:v1.0 .
注1:-t jdk8:v1.0 给新构建的镜像取名为 jdk8, 并设定版本为 v1.0
注2:注意最后有个点,代表使用当前路径的 Dockerfile 进行构建