乐趣区

关于docker:docker教程系列五

导航

  • docker 概念
  • 手动从镜像运行一个容器
  • 应用 dockerfile 打包镜像
  • 应用 compose 部署多容器利用
  • 给 docker 加上数据长久
  • docker 在服务器部署
  • docker 继续集成和部署

给 docker 加上数据长久

数据券介绍

咱们能够在概念上把 docker 看做虚拟机, 当容器被删除的时候,容器里所有数据都会被删除, 两个不同容器之间无奈互通
能够把数据卷了解为虚拟机的虚构磁盘,他是独立于容器的文件. 在容器中他被挂载为一个目录的模式.
对于容器中的利用来说,数据卷是通明的,无奈感知它的存在,他就是一个一般的文件夹
因为数据卷独立于容器而存在,因而删除容器的时候数据卷也不会受影响。数据卷有以下长处:

  1. 多容器能够通过挂载同一个数据卷来共享数据
  2. 数据卷能够不便地备份,存储数据

数据卷的相干命令操作

    # 创立一个 volume
    docker volume create testvolume

    # 列出所有数据卷
    docker volume ls

    # 删除一个数据卷
    docker volume rm testvolume

在容器中应用数据卷

    # 先创立数据卷
    docker volume create web

    # 在运行容器的时候,应用参数 --mount 如下
    # 上面的参数含意是把数据卷 (web) 挂载到容器的 /volume 目录下面
    # 这里的 webimage 镜像能够用我后面文章写得 Dockerfile 生成
    # 这样就运行了一个带有数据卷的容器,这个容器的 /volume 目录中的内容在容器被删除之后依然存在.
    # 因为它实际上是存在 Docker 数据卷中。docker run -d --name demovolume --mount source=web,target=/volume webimage

以下例子用于演示数据卷保留数据的个性

    # 执行命令在容器的 /b.txt 写入工夫内容并查看
    docker exec demovolume sh -c 'date > /b.txt'
    docker exec demovolume sh -c 'cat /b.txt'

    # 删除容器后重新启动一个同名容器在查看,之前容器的内容曾经没有了
    docker rm -f demovolume
    docker run -d --name demovolume --mount source=web,target=/volume webimage
    docker exec demovolume sh -c 'cat /b.txt'

    # 保留在数据卷上的文件,即便容器被删除依然存在
    docker exec demovolume sh -c 'date > /volume/b.txt'
    docker rm -f demovolume
    docker run -d --name demovolume --mount source=web,target=/volume webimage
    docker exec demovolume sh -c 'cat /volume/b.txt'

共享目录

除了挂载数据卷以外,docker 还能够挂载共享目录(这一点和虚拟机一样),共享目录的劣势是使用方便,易于了解,能够在某些场景下方便使用
(比方开发是在宿主机中批改源代码 docker 中实时失效省却 build 镜像的过程)
上面用一个具体的例子来演示挂载共享目录的用法:

  1. 在当前目录下创立 index.html

    <!DOCTYPE html>
    <html>
     <head>
         <meta charset="utf-8">
         <title>volume</title>
     </head>
     <body>
         <h1> 这是一个在宿主机的 index.html 文件。</h1>
     </body>
    </html>
  2. 关上终端输出

     # 上面的命令会从 nginx 镜像运行一个名为 nginx1 的容器
     # 并且设置了 8080:80 的端口映射
     # --mount 参数的 type=bind 表明要挂载的共享目录
     # 把宿主机的当前目录映射为容器的 /usr/share/nginx/html (这是 nginx 容器的动态页面文件寄存门路)
     # 这样在宿主机中拜访 localhost:8080 会主动拜访宿主机当前目录下的 index.html 文件(这是 nginx 的默认动态文件首页)docker run -p 8080:80 --name nginx1 --mount type=bind,source="${PWD}",target=/usr/share/nginx/html/ nginx
    
     # 须要留神的是 source 参数必须应用绝对路径
     # 所以这里应用 "${PWD}" 的形式来在 Mac/Linux/Windows 中获取当前目录门路
     # 这是一个能够在多平台通用的获取当前目录门路的办法 (windows 下必须应用 PowerShell)
     # 加引号是因为门路中可能含有空格等特殊符号,如果门路有空格而未加引号,会产生谬误
  3. 关上浏览器输出: localhost:8080

其余挂载模式

除了挂载整个目录,还能够独自挂载一个文件。如果要挂载单个文件,肯定要要保障宿主机文件存在,否则整个门路会被认为是一个目录挂载

  1. 创立 index.html, 轻易写点货色
  2. 关上终端输出以下命令

    docker run -p 8081:80 \
     --name nginx2 \
     --mount type=bind,source="${PWD}"/index.html,target=/usr/share/nginx/html/test.html \
     nginx
    
     #  这时候咱们拜访 http://localhost:8081 返回的是 nginx 的默认首页
     #  而拜访 http:/localhost:8081/test.html 返回的是挂载的单个文件

    留神:能够创立多文件挂载

     docker run -p 8082:80 \
         --name nginx3 \
         --mount type=bind,source="${PWD}"/index.html,target=/usr/share/nginx/test.html/ \
         --mount type=bind,source="${PWD}"/test.html,target=/usr/share/nginx/test2.html/ \
         nginx
退出移动版