一、 数据持久化
我们什么情况下要做数据持久化呢? 一定是在做容器之前先预判好哪些文件是要永久存储的,
而不会跟着它容器的一个生命周期而消失。
比如说配置文件、 日志文件、 缓存文件或者应用数据等等。 数据初始化有三种类型。 第一种
volumes, 这个是最推荐的, 也是最好的一种方式。 第二种是 bind—mount, 第三种是 tmpfs。
方式一: volumes
是官方比较推荐也是大型的集群比较常见的一种方式。 可以理解为在自己的宿主机或者云端或者在某一个区域创建一块磁盘专门去存放容器里的数据或文件。 把这个容器里边的数据或者文件还有目录等都规划好, 再去启动容器。 正常在老一些的版本里边首先必须要去创建 volumes,否则是没有办法创建成功的。 新版本好像不写命令也可以创建成功, 具体可以查询官方关于 volumes 的文档
使用:
docker volume create test1
docker run -itd -p 8800:80 -v test1:/usr/share/nginx/html nginx:v1
创建: docker volume create
删除某个卷: docker volume rm 卷名
删除所有未使用的卷: docker volume prune
列出所有卷: docker volume ls
查看某个卷的信息: docker volume inspect 卷名
挂载到容器: -v 或–volume。 如果是 Docker17.06 或更高: 推荐使用–mount。 (同 bind mount)
挂载类型: key 为 type, value 为 bind、 volume 或 tmpfs
挂载源: key 为 source 或 src, 对于命名卷, value 为卷名, 对于匿名卷, 则忽略
容器中的挂载点: key 为 destination、 dst 或 target, value 为容器中的路径
读写类型: value 为 readonly, 没有 key
volume-opt 选项, 可以出现多次。 比如 volume-driver=local,volume-opt=type=nfs,…
第一个域: 对于命名卷, 为卷名; 匿名卷, 则忽略, 此时会创建匿名卷
第二个域: 容器中的挂载点
第三个域: 可选参数, 由’ ,'隔开, 如 ro
-v 或—volume: 由 3 个域组成, ’ :’ 分隔
—mount: 由多个’ ,’ 隔开的键值对组成
方式二: bind—mount
将宿主机中的文件、 目录 mount 到容器上。 质上是宿主机、 container 之间共享宿主机文件系
统。 这种持久化方法更导致 container 与宿主机的耦合过于紧密, 所以不推荐使用。
使用:
docker run -itd -p 8801:80 -v /var/log/cont/apache1:/var/log/httpd/
apache:new2
挂载到容器: -v 或—volume。 如果是 Docker17.06 或更高: 推荐使用—mount。 (同 volume
s)
-v 或–volume: 由 3 个域组成, ’ :'分隔
第一个域: 对于命名卷, 为卷名; 匿名卷, 则忽略, 此时会创建匿名卷
第二个域: 容器中的挂载点
第三个域: 可选参数, 由’ ,'隔开, 如 ro
–mount: 由多个’ ,'隔开的键值对=组成:
挂载类型: key 为 type, value 为 bind、 volume 或 tmpfs
挂载源: key 为 source 或 src, value 为主机中文件或目录的路径
容器中的挂载点: key 为 destination、 dst 或 target, value 为容器中的路径
读写类型: value 为 readonly, 没有 key
bind-propagation 选项: key 为 bind-propagation, value 为 rprivate、 private、 rshared、shared、 rslave 或 slave
方式三: tmpfs
将数据存于宿主机内存中。 docker 可将用户名与密码等敏感数据保存在某个数据库中, 当启动需要访问这些敏感数据的 container 或者 service 时, docker 会在宿主机上创建一个 tmpfs,然后将敏感数据从数据库读出写到 tmpfs 中, 再将 tmpfs mount 到 container 中, 安样能保证数据安全。 当容器停止运行时, 则相应的 tmpfs 也从系统中删除。
docker run -itd --name tmptest --tmpfs /root nginx:latest
案例一
1、查看 busybox 镜像,确保是官方镜像
[root@template ~]# docker search busybox
2、拉取并查看镜像
[root@template ~]# docker pull busybox
[root@template ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 7cfbbec8963d 5 weeks ago 4.86MB
[root@template ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 7cfbbec8963d 5 weeks ago 4.86MB
3、给镜像创建一个软链接并改名 box:v1 并检查是否成功
[root@template ~]# docker tag busybox:latest box:v1
[root@template ~]# docker tag busybox:latest box:v2
[root@template ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
box v1 7cfbbec8963d 5 weeks ago 4.86MB
box v2 7cfbbec8963d 5 weeks ago 4.86MB
busybox latest 7cfbbec8963d 5 weeks ago 4.86MB
查看 ImageID,如果一样则软连接成功
4、删除 box:v2 镜像
[root@template ~]# docker rmi box:v2
至此, 第一个案例就此完成。
案例二
1、下载 centos:7 镜像。并用该镜像启动容器,命名为 centostest,暴露 6446
宿主机端口, 映射容器内 999 端口
[root@template ~]# docker run -it -d --name centostest -p 6449:999 centos:7
2、查看容器是否启动成功
[root@template ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 7cfbbec8963d 5 weeks ago 4.86MB
centos 7 eeb6ee3f44bd 19 months ago 204MB
[root@template ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d080931aaf96 centos:7 "/bin/bash" 28 seconds ago Up 27 seconds 0.0.0.0:6449->999/tcp, :::6449->999/tcp centostest
3、将宿主机/root/test.txt,复制到容器内/usr/local/
[root@template ~]# touch /root/test.txt
[root@template ~]# docker cp /root/test.txt centostest:/usr/local
4、进入容器查看是否cp过来
[root@template ~]# docker exec -it centostest /bin/bash
[root@d080931aaf96 /]# ll /usr/local/
5、再从该容器内的/root/study.txt 文件复制到宿主机/tmp
[root@d080931aaf96 /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv study.txt sys
[root@d080931aaf96 /]# exit
exit
[root@template ~]# docker cp centostest:/study.txt /tmp
Successfully copied 1.536kB to /tmp
[root@template ~]# ll /tmp/
total 0
-rw-r--r--. 1 root root 0 Apr 25 20:58 study.txt
6、删除该容器前先停止容器
[root@template ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d080931aaf96 centos:7 "/bin/bash" 11 minutes ago Up 11 minutes 0.0.0.0:6449->999/tcp, :::6449->999/tcp centostest
[root@template ~]# docker stop centostest
centostest
[root@template ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 7cfbbec8963d 5 weeks ago 4.86MB
centos 7 eeb6ee3f44bd 19 months ago 204MB
7、删除容器和镜像
[root@template ~]# docker rmi centos:7
[root@template ~]# docker images
[root@template ~]# docker ps -a
Dockerfile
1.概述
dockerfile 可以理解为一个制作镜像的脚本, 但远没有脚本复杂。 他根据某种格式自定义内容,就可以快速创建出需求的镜像。
docker 容器启动的时候在最上层挂载了一个可写层, 比如说我在容器里面创建一个文件, 这个文件是存放在可写层的, 这时候容器要是销毁了, 那么我们对容器的一些写入操作也就没了,我这个文件也会随着容器销毁而销毁了, 我们要是想要保存我们对容器的一些写入操作的话,可以使用 commit 命令然后将容器制作成一个镜像, 这样下次 run 起来该镜像的时候, 我们之前的写入操作就还存在了。
除了使用 commit 方式制作镜像, 还有一种方式就是编写 Dockerfile 然后使用 build 命令来制作镜像了。
2.Dockerfile 的规则
格式:
指令建议要大写, 内容小写
执行顺序:
docker 是按照 Dockerfile 指令顺序依次执行的, 也就是说从上到下
3.指令
1) FROM: 底层镜像(如系统)
这个 FROM 指令是 dockerfile 的第一个指令, 然后指定了基础镜像, 后面的所有指令都是运行在该基础镜像环境上的 MAINTAINER 该指令是描述的维护者信息。底层的系统镜像用的是什么, 使用 from 指定, 绝大部分情况都用的底层有个系统或者基础的环境用的是什么, 对 docker 不熟练使用 centos 镜像即可。
2) RUN: 构建时容器内运行的命令。
RUN 指令用于在容器中执行命令。 我们常用来安装基础软件。
镜像安装软件依赖包都可以放在 run 中。
3) COPY: 复制 docker 目录中的文件到镜像中。
COPY 指令类似 ADD 指令, 但是 ADD 指令范围更广些, ADD 能够自动解压文件, 能够访问网络资源, 而 COPY 指令做不到。
非目录需要重新指定, 放在目录中非常便利, 属于好的一种习惯, 值得推荐使用目录。
4) ADD: 复制 docker 目录中的文件到镜像中。 (过程可以解压)
ADD 指令是用来将宿主机某个文件或目录放到(复制) 容器某个目录下面。
官方不推荐 ADD,高级复制功能, 需求不精准, 推荐使用 COPY。
5) EXPOSE: 声明开放端口。
EXPOSE 指令用于暴露容器里的端口, 我们在 3.5 里面演示过了, nginx 暴露的端口是 80, 但是启动容器的时候需要指定宿主机端口来映射你暴露的端口。 需要暴露多个端口的话可以使用
多个 EXPOSE, 也可以一个 EXPOSE 指令后面跟多个端口, 端口之间用空格隔开。声明不是变更, 变更使用-p 构建容器时候使用。
6) ENV: 设置环境变量。
ENV 指令是用于设置环境变量的 。
底层环境变量需要需提前设置。
7) CMD: 容器启动时执行的命令, 最多只能执行一条。
CMD 指令是你在容器启动的时候帮你运行的命令, 而 RUN 这个指令是构建镜像的时候帮你运行的命令。
容器启动时执行命令, 最多执行一条。
8) WORKDIR: 声明工作目录。 类似 cd。
WORKDIR 是指下面的指令都在 WORKDIR 指定目录下面工作, 这个与 linux 里面的 cd 差不多。
切换目录使用 WORKDIR。
做容器轻量级最好, 比较小就很好, 使用一条命令就不要使用两天命令。
dockerfile案例
1、用 dockerfile 创建并启动一个 centos 的 apache 镜像。 指定自定义内容
[root@template ~]# mkdir dockerfile
[root@template ~]# cd dockerfile/
[root@template dockerfile]# mkdir apache
[root@template dockerfile]# cd apache/
[root@template apache]# vim dockerfile
[root@template apache]#
[root@template apache]# echo "test page ..." > index.html
[root@template apache]# cat dockerfile
FROM centos:7
RUN yum -y install httpd
EXPOSE 80
COPY index.html /usr/share/httpd/noindex/index.html
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
2、构建镜像
[root@template apache]# docker build -t apache:v1 .
3、测试
[root@template apache]# docker run -it -d --name web1 -p345:80 apache:v1
ee9f31c43a84190d3db5dd85d6d53e799c16224eab5ea18ecabc96c411cc4e71
[root@template apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ee9f31c43a84 apache:v1 "/usr/sbin/httpd -D …" 6 seconds ago Up 6 seconds 0.0.0.0:345->80/tcp, :::345->80/tcp web1
4、浏览器测试
5、用 dockerfile 创建并启动一个 centos7 的 nginx 镜像
[root@template apache]# cat dockerfile
FROM centos:7
RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum -y install nginx
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
[root@template apache]# docker build -t nginx:v1 .
[root@template apache]# docker run -itd --name web2 -p 789:80 nginx
构建过程
测试截图
最后放平心态, 为自己赚一个好未来,准备秋招,好好沉淀