我们什么情况下要做数据持久化呢? 一定是在做容器之前先预判好哪些文件是要永久存储的,
而不会跟着它容器的一个生命周期而消失。
比如说配置文件、 日志文件、 缓存文件或者应用数据等等。 数据初始化有三种类型。 第一种
volumes, 这个是最推荐的, 也是最好的一种方式。 第二种是 bind—mount, 第三种是 tmpfs。
是官方比较推荐也是大型的集群比较常见的一种方式。 可以理解为在自己的宿主机或者云端或者在某一个区域创建一块磁盘专门去存放容器里的数据或文件。 把这个容器里边的数据或者文件还有目录等都规划好, 再去启动容器。 正常在老一些的版本里边首先必须要去创建 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: 由多个’ ,’ 隔开的键值对组成
将宿主机中的文件、 目录 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
将数据存于宿主机内存中。 docker 可将用户名与密码等敏感数据保存在某个数据库中, 当启动需要访问这些敏感数据的 container 或者 service 时, docker 会在宿主机上创建一个 tmpfs,然后将敏感数据从数据库读出写到 tmpfs 中, 再将 tmpfs mount 到 container 中, 安样能保证数据安全。 当容器停止运行时, 则相应的 tmpfs 也从系统中删除。
docker run -itd --name tmptest --tmpfs /root nginx:latest
[root@template ~]# docker search busybox
[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
[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
[root@template ~]# docker rmi box:v2
宿主机端口, 映射容器内 999 端口
[root@template ~]# docker run -it -d --name centostest -p 6449:999 centos:7
[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
[root@template ~]# touch /root/test.txt [root@template ~]# docker cp /root/test.txt centostest:/usr/local
[root@template ~]# docker exec -it centostest /bin/bash [root@d080931aaf96 /]# ll /usr/local/
[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
[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
[root@template ~]# docker rmi centos:7 [root@template ~]# docker images [root@template ~]# docker ps -a
dockerfile 可以理解为一个制作镜像的脚本, 但远没有脚本复杂。 他根据某种格式自定义内容,就可以快速创建出需求的镜像。
docker 容器启动的时候在最上层挂载了一个可写层, 比如说我在容器里面创建一个文件, 这个文件是存放在可写层的, 这时候容器要是销毁了, 那么我们对容器的一些写入操作也就没了,我这个文件也会随着容器销毁而销毁了, 我们要是想要保存我们对容器的一些写入操作的话,可以使用 commit 命令然后将容器制作成一个镜像, 这样下次 run 起来该镜像的时候, 我们之前的写入操作就还存在了。
除了使用 commit 方式制作镜像, 还有一种方式就是编写 Dockerfile 然后使用 build 命令来制作镜像了。
格式:
指令建议要大写, 内容小写
执行顺序:
docker 是按照 Dockerfile 指令顺序依次执行的, 也就是说从上到下
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。
做容器轻量级最好, 比较小就很好, 使用一条命令就不要使用两天命令。
[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"]
[root@template apache]# docker build -t apache:v1 .
[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
[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
最后放平心态, 为自己赚一个好未来,准备秋招,好好沉淀