Docker之数据卷与Dockerfile

一、docker基本运行

将容器后台运行并进入容器: 

docker run -itd -name 名字 centos

强制删除所有容器:

docker rm -f $(docker ps -a)

docker rm -f $(docker ps -aq)

二、数据卷、目录挂载

docker在容器中管理数据主要有两种方式:

- 数据卷(Volumes)
- 挂载主机目录(Bind mounts)

1、数据卷的含义

为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
        数据卷 可以在容器之间共享和重用
        对 数据卷 的修改会立马生效
        对 数据卷 的更新,不会影响镜像
        数据卷 默认会一直存在,即使容器被删除

2、数据卷的基本使用

创建数据卷: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命令创建启动容器后,再挂载数据卷相当麻烦,要修改很多配置文件,但并非不可以

开启一个后台运行容器挂载数据卷,虚拟机访问需要到跟目录底下对应的目录:

在数据卷中增加数据:

 

进入容器访问数据卷:

 

不停止服务退出:先后按住Ctrl+p,Ctrl+q

&&表示两条语句一起执行:

 

加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车:

 

如果数据卷不存在,docker会自动创建
如果容器上目录不存在, docker会自动创建 

查看数据卷的具体信息:docker inspect name

挂载目录

        docker run -itd \
        --name 容器名字 \
        --mount type=bind,source=宿主机目录,target=容器中的对应目录 \
        镜像名称

 

3、数据卷容器:

 含义:如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。 

创建数据卷容器:docker run -itd --name name -v dir centos

挂载数据卷容器:docker run -itd --name name --volumes-from db_data centos 

 

三、Dockerfile构建镜像 

Dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像,另外,使用Dockerfile去构建镜像好比使用pom去构建maven项目一样,有异曲同工之妙

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、基本结构

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

 

 如果仅仅是把本地的文件拷贝到容器镜像中,COPY 命令是最合适不过的。其命令的格式
为:COPY <src> <dest>
ADD 命令的格式和 COPY 命令相同,也是:ADD <src> <dest>
区别:ADD解压压缩文件并把它们添加到镜像中

3、准备工作

创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件:

将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"] 

4、创建镜像

编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像:

注1:-t jdk8:v1.0 给新构建的镜像取名为 jdk8, 并设定版本为 v1.0
注2注意最后有个点,代表使用当前路径的 Dockerfile 进行构建

docker build -t jdk8:v1.0 .

 

给jdk创建容器:pwd查找路径,

最后能够执行Java

 

 

本期内容结束~~~~~· 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值