一、 数据持久化

我们什么情况下要做数据持久化呢? 一定是在做容器之前先预判好哪些文件是要永久存储的,

而不会跟着它容器的一个生命周期而消失。

比如说配置文件、 日志文件、 缓存文件或者应用数据等等。 数据初始化有三种类型。 第一种

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

构建过程

测试截图

最后放平心态, 为自己赚一个好未来,准备秋招,好好沉淀

Docker的实际应用的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  10. 微服务与Docker介绍

    什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...

随机推荐

  1. CentOS 7(Linux)安装Docker

    CentOS 7(Linux)安装Docker 一.分别执行下列命令添加并更新yum源 yum update yum install epel-release -y yum clean all yum ...

  2. windows消息机制_PostMessage和SendMessage

    1.子线程中建立一个窗口 为了在后面比较这两个函数,先使用win32 windows程序中建立子线程,在子线程中建立一个窗口. (1)新建一个 win32 windows应用程序 (2)定义子窗口的窗 ...

  3. 优先使用C++的别名声明(using)来替换typedef

    C++98中,我们如果想用简写的方式表达一个类型,那么可以使用typedef关键字: typedef std::unique_ptr<std::unordered_map<std::str ...

  4. 第七章 狄克斯特拉算法 (Dijkstra's algorithm)

    步骤 找出最便宜的节点,即可在最短时间内前往的节点 对于该节点的的邻居,检查是否有前往他们的更短路径,如果有,就更新其开销 重复这个过程,知道对图中的每个节点都这样做了 计算最终路径 条件 只适用于有 ...

  5. C# .netCore 上传文件到ftps/ftp

    白码一号的博客园 最近由于项目安全需要,将之前的ftp上传文件的方式,改用ftps 因为不太了解这个东西便开始了踩坑之旅 首先,最近在ubuntu 上搭建了这个服务 流程可以参考这些博客(部署网上的资 ...

  6. JSP环境搭建及入门 和 虚拟路径和虚拟主机

    Jsp:是一个动态网页,而不是静态网页 html,css,js,Jquery:是静态网页 动态网页是随着,时间,地点,用户操作,而改变 静态不需要jsp 动态是需要的 BS 可以通过浏览器直接访问浏览 ...

  7. (Linux服务器)git添加SSH公钥后本地验证失败

    环境:腾讯云Ubuntu x86_64 问题说明: 在配置了公钥后,一直提示我git@github.com: Permission denied (publickey). 解决办法: 先查看root/ ...

  8. Ubantu12.04安装及离线安装网卡驱动

    一.用软通牒UltarISO写入硬盘映像,制作启动U盘 装机,ubantu安装很简单. 二.安装网卡驱动 1. 下载e1000e:https://downloadcenter.intel.com/De ...

  9. 随便记录一些使用IDEA在ssm阶段的踩过的坑

    重命名中括号问题:需要重命名模块+目录 Intellij idea 报错:Error : java 不支持发行版本5_灵颖桥人的博客-CSDN博客_不支持发行版本5 idea中的目标字节码版本总是自动 ...

  10. Serverless 遇到 FinOps: Economical Serverless

    Serverless 遇到 FinOps: Economical Serverless 摘要:本文基于 FunctionGraph 在 Serverless 领域的 FinOps 探索和实践,提出业界 ...