一、什么是容器

  容器是一种虚拟化的方案,但与传统的虚拟机不同,传统的虚拟机是通过中间层将一台或多台独立的机器虚拟运行于物理硬件之上,而容器是直接运行在操作系统内核之上的用户空间,因此容器虚拟化也被称为操作系统级别的虚拟化,由于依赖于操作系统的特点,因此容器只能运行相同或相似内核的操作系统。而Docker则依赖于Linux内核特性:Namespace和Cgroups(Control group)

 

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_docker

二、容器和虚拟机

虚拟机虽然带来了好处但是还是有点点局限性,我们会在物理机上装很多个VM,每个VM会部署很多个操作系统,操作系统会占用很大的资源。容器技术解决了此问题。(启动时间快,资源利用率高.快速部署应用;资源率高;高效性,易于扩展、伸缩;快速启动;一致性;可封装性;隔离性)

优点:1、磁盘战友空间

  1、磁盘占有空间更少

  使用虚拟机部署应用不但包含虚拟机,还需要包含版本操作系统。原本可能只有几十兆的应用却需用动用几个G的操作系统来支撑。而容器只需要包含应用和其依赖的库。这样资源就大大减少

  2、虚拟机需要模拟硬件的行为,对内存和CPU的损耗相当的大。所有同样的部署服务,使用容器能够比使用虚拟机能够提供更多的服务。

  一个容器中运行原生 Linux和共享主机与其它容器的内核。它运行一个独立的进程,不占用任何其他可执行文件的内存,使其轻量级。

相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序对主机资源进行虚拟访问。通常,VM提供的环境比大多数应用程序需要的资源更多

 疑问:那么容器这么多有点为什么现在又要使用Docker呢?

  容器技术的复杂性

  容器技术本身复杂,它依赖于Linux内核很多特性,而且不易安装和管理以及实现自动化。而Docker就是为了改变这一切而出现

三、什么是Docker?

  1、简介:

  Docker就是能够把开发的应用程序自动部署到容器的开源引擎。它使用Go语言进行编写

  Github地址:https://github.com/docker/docker

  由2013年初,由dotCloud公司发布,基于Apache2.0开源授权协议发行

  那么docker有什么特别之处呢?

  Docker在虚拟化的环境当中有个应用程序部署引擎,该引擎的目标就是为了提供一个轻量快速的环境,能够运行开发者环境,并且能将开发者环境快速高效的部署到测试环境,然后是生产环境

  2、Docker的目标

  1)、提供简单轻量的建模方式

  Docker非常容易上手,操作只需要几分钟就可以讲自己的应用程序docker化,统一个宿主机中由可以部署多个容器,能够是操作者尽可能的利用系统资源

  2)、职责的逻辑分离

  使用Docker,开发者只需要关心容器中的运行的程序,而运维只需要关心如何管理容器,从而加强了开发人员的开发环境与测试环境的一致性

  3)、快速高效的开发生命周期

  其目标之一就是缩短代码从开发到测试部署上线运行 的周期,让整个应用具有一致性,避免了额外的调试和开销,有效的缩短了产品的生命周期

  4)、鼓励使用面向服务的架构

  docker推荐使用单个容器只运行一个程序或进程,这样就形成了一个分布式 的应用程序模型,做到了高内聚低耦合,出现问题也能快速的定位到问题的所在

  3、Docker的使用场景

  1)、使用Docker容器开发、测试、部署服务

  2)、创建隔离的运行环境

  使用Docker可以非常容易创建不同的环境来部署服务

  3)、搭建测试环境

  由于docker的轻量化,开发人员能够很容易在本地搭建测试环境,用来测试程序在不同系统的兼容性,甚至是集群部署

  4)、构建多用户的平台即服务(PaaS)基础设施

  5)、提供软件即服务(SaaS)应用程序

  6)、高性能、超大规模的宿主机部署

四、 Docker架构

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_centos_02

  docker架构分为Client、Daemon和Registry

  1) Docker daemon:

  用于管理docker的生命周期与管理,而Client是调用Docker daemon的API,如创建容器删除容器等,其实就是命令的发起,而Docker daemon是命令的操作者,Registry是Docker的仓库

  处理Docker API请求

  管理Docker对象:如镜像、容器、网络等

  2) Docker client 

  Docker client使用 Docker API跟Docker daemon进行交互

  可以跟多个不同的Docker Daemon进行通讯

  3) Docker registries

  存储Docker镜像

  公有和私有Docker Registry

 五、Docker安装

  1、yum install -y epei-release

  2、yum  install -y docker-io

  3、安装后的配置文件:/etc/sysconfig/docker

  4、启动docker后台服务:systemctl  start docker //启动Docker daemon   

  5、docker version 验证

六、获得镜像加速器地址连接

1、先访问阿里云,通过第三方(如淘宝)登录注册

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_docker_03

2、找到容器镜像服务,选择指定的centos版本号配置阿里镜像加速器

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_centos_04

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_Docker_05

七、镜像命令

  1、docker images [OPTIONS] 列出本地主机上的镜像

    -a:列出本地所有的镜像(含中间映像层)

    -q:只显示镜像ID

      -digests:显示镜像的摘要信息

      -no-trunc:显示完整的镜像信息

  2、docker search某个XX镜像名字

  3、docker pull 某个xx镜像名字

  4、docker rmi 某个xx镜像名字ID

         删除单个:docker rmi -f 镜像ID

           删除多个:docker rmi -f 镜像名1:TAG 镜像名2:?TAG

         删除全部:docker rmi -f $(docker images -qa)

八、容器命令

1、新建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG..]

 --name="容器新名字":为容器指定一个名称

 -d:后台运行容器,并返回容器ID,并返回容器ID,也即启动守护式容器

 -i :以交互式模式运行容器,通常与-t同时使用

 -P:随机端口映射:

 -p:指定端口映射

[root@bogon ~]# sudo systemctl restart docker
[root@bogon ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/tomcat    latest              48dd385504b1        7 days ago          475 MB
[root@bogon ~]# docker pull centos
[root@bogon ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/tomcat    latest              48dd385504b1        7 days ago          475 MB
docker.io/centos    latest              1e1148e4cc2c        10 days ago         202 MB
[root@bogon ~]# docker run -it 1e1148e4cc2c     #it:交互并返回命令行终端
[root@c32df2fe1a20 /]# ls         #注意:c32df2fe1a20是容器id,1e1148e4cc2c是镜像id,run命令是在本地新建容器
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@c32df2fe1a20 /]# pwd / [root@c32df2fe1a20 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 01:27 ? 00:00:00 /bin/bash root 14 1 0 01:27 ? 00:00:00 ps -ef

2、查看运行的容器  

 docker ps [OPTION]

 -a:列出当前所有正在运行的容器+历史上运行过的

 -l:显示最近创建的容器

 -n:显示最近n个创建的容器

 -q:静态模式,只显示容器编号

  --no-trunc:不截断输出 

[root@c32df2fe1a20 /]# exit
exit
[root@bogon ~]# docker ps -l   #查看运行过的容器(现在退出了)
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
c32df2fe1a20        1e1148e4cc2c        "/bin/bash"         17 minutes ago      Exited (127) About a minute ago                       epic_morse
[root@bogon ~]# docker ps -a  #查看所有的容器(正在运行和已经退出的)
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
53f4814ea7f8        tomcat              "catalina.sh run"   39 seconds ago      Exited (130) 12 seconds ago                       amazing_kare
c32df2fe1a20        1e1148e4cc2c        "/bin/bash"         19 minutes ago      Exited (127) 3 minutes ago                        epic_morse
[root@bogon ~]# docker ps -n 1  #查看最新运行过的第一个容器
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                        PORTS               NAMES
53f4814ea7f8        tomcat              "catalina.sh run"   About a minute ago   Exited (130) 51 seconds ago                       amazing_kare

3、退出容器

  方式一:exit  容器停止退出

  方式二:ctr+P+Q 容器不停止退出

[root@c32df2fe1a20 /]# exit
exit
[root@bogon ~]#

4、启动容器 docker start 容器ID获取容器名

 5、重启容器  docker restart 容器ID获取容器名

 6、容器停住  docker stop 容器ID获取容器名

7、强制停止容器 docker kill  容器ID获取容器名

8、删除容器 docker rm 容器ID获取容器名(删除镜像为rmi)

9、一次性删除多个容器 docker rm -f $(dokcer ps -a -q)

10、启动守护式容器 docker run -d 容器名(注意:启动交互式容器为docker run -it (创建并返回一个交互式命令行终端,当前显示的是运行容器环境,不是本机,除非exit))

[root@bogon ~]# docker run -d centos
58dc943fa1b27f787bfcea2f54c9591659366cc97ed63c65367d9a4255fc657d
[root@bogon ~]# pwd   #显示的还是本机,非运行的容器,只是后台在运行,当然容器的操作也是操作的后台运行的容器
/root

  使用镜像centos:latest以后台模式启动一个容器

  docker run -d centos

  问题:然后docker ps -a进行查看,会发现容器已经退出

  很重要的说明的一点:Docker容器后台运行,就必须有一个前台进程

  容器运行的命令如果不是那些一直挂起的命令(比如top,tail),就是会自动退出的

  这是docker的机制问题,比如你的web容器,我们以nginx为列,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start

  但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用

  这样的容器后台启动后,会立即自杀因为他觉得他没事可做了

  所以,最佳解决方案是,将你要运行的程序以前台进程的形式运行

11、查看容器日志 docker logs -f -t -tail 容器ID 

        -t 是加入时间戳

        -f 跟随最新的日志打印

        -tail 数字显示最后多少条

[root@bogon ~]# docker run -d centos
58dc943fa1b27f787bfcea2f54c9591659366cc97ed63c65367d9a4255fc657d
[root@bogon ~]# docker ps    #基于没有前台进程会自动关闭
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@bogon ~]# docker run -d centos /bin/sh -c "while true;do echo hello jiaxianseng;sleep 2;done"  #shell脚本,每2秒循环打印
ec941b4967dc8b16078e0bc298961d566776f0d733f0bb5a4037e6d6d3fd8110
[root@bogon ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
ec941b4967dc        centos              "/bin/sh -c 'while..."   3 seconds ago       Up 3 seconds                            peaceful_hawking
[root@bogon ~]# docker logs -t -f --tail 3 ec941b4967dc
2018-12-16T02:23:08.947011000Z hello jiaxianseng
2018-12-16T02:23:10.951727000Z hello jiaxianseng
2018-12-16T02:23:12.955306000Z hello jiaxianseng

12、查看容器内运行的进程 docker top 容器ID

[root@bogon ~]# docker top ec941b4967dc
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                6373                6359                0                   10:21               ?                   00:00:00            /bin/sh -c while true;do echo hello jiaxianseng;sleep 2;done
root                7078                6373                0                   10:31               ?                   00:00:00            sleep 2

13、查看容器内部细节 docker inspect 容器ID

14、进入正在运行的容器并以命令行交互

  docker exec -it 容器ID bashShell

  重新进入docker attach 容器ID

  上述两个区别:attach直接进入容器启动命令的终端,不会启动新的进程

           exec是在容器中打开新的终端,并且可以启动新的进程

[root@bogon ~]# docker run -it centos
[root@f0d4c7ebe19c /]# [root@bogon ~]#     #CTR+P+Q 退出但不关闭
[root@bogon ~]# docker ps  
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f0d4c7ebe19c        centos              "/bin/bash"         2 minutes ago       Up 2 minutes
[root@bogon ~]# docker attach f0d4c7ebe19c #可以再次进入退出后的容器的,先进再执行操作
[root@f0d4c7ebe19c /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@f0d4c7ebe19c /]# exit
exit
[root@bogon ~]# docker run -it centos
[root@3761c230b0fd /]# [root@bogon ~]#   #CTR+P+Q 退出但不关闭
[root@bogon ~]# docker exec -t 3761c230b0fd ls -l /tmp   #可以再次进入退出后的容器,直接一次性操作
total 4
-rwx------. 1 root root 836 Dec  5 01:37 ks-script-h2MyUP
-rw-------. 1 root root   0 Dec  5 01:36 yum.lo

15、从容器内拷贝文件到主机上 docker cp 容器ID:容器内路径 目的主机路径

[root@bogon ~]# docker cp 3761c230b0fd:/anaconda-post.log /usr/java
[root@bogon java]# pwd
/usr/java
[root@bogon java]# ls -l
总用量 20
-rw-r--r--.  1 root   root   12076 12月  5 09:37 anaconda-post.log

九、Docker 自定义镜像

  Docker自定义镜像有两种方式:commit命令和Dockerfile

  1、Docker镜像commit操作

  docker commit 提交容器副本使之成为一个新的镜像

  docker commit -m=“提交的描述信息”-a ="作者" 容器ID 要创建的目标镜像名:[标签名]

1)、启动tomcat

[root@bogon java]# docker run -it -p 8888:8080 tomcat   #-p(小写)指定端口映射

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_centos_06

[root@bogon java]# docker run -it -P tomcat #大写P是随机分配
[root@bogon ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
4800d7a88a67        tomcat              "catalina.sh run"   11 seconds ago      Up 11 seconds       0.0.0.0:32768->8080/tcp   compassionate_heyrovsky

 2、新建自定义容器

  demo1:自定义一个centos

[root@bogon ~]# docker images
docker.io/centos    latest              1e1148e4cc2c        2 weeks ago         202 MB
[root@0b57154731ca /]# cd /usr
[root@0b57154731ca usr]# mkdir temp
[root@0b57154731ca usr]# cd temp
[root@0b57154731ca temp]# touch a.txt
[root@0b57154731ca temp]# echo "Hello World" >> a.txt
[root@0b57154731ca usr]# exit 
exit
[root@bogon ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
0b57154731ca        centos              "bash"                   12 minutes ago      Exited (0) 23 seconds ago 
[root@bogon ~]# docker commit 0b57154731ca jia/centos:1.0
sha256:c306d0695abefd2e37859f7eaff92e9b20833e650b334ae4d1fa0d1de32f08ea
[root@bogon ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jia/centos          1.0                 c306d0695abe        12 seconds ago      325 MB
docker.io/centos    latest              1e1148e4cc2c        2 weeks ago         202 MB
[root@bogon ~]# docker run -it jia/centos:1.0 bash
[root@bd70e4830f19 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@bd70e4830f19 /]# cd usr
[root@bd70e4830f19 usr]# cd temp
[root@bd70e4830f19 temp]# cat a.txt
Hello World

  demo2:(以删除tomcat doc文档为列子)

  环境:先启动tomcat(阿里),通过attach命令进入内部容器,删除doc文件

[root@bogon ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
1b58d5c68b21        tomcat              "catalina.sh run"   11 seconds ago      Up 10 seconds       0.0.0.0:8888->8080/tcp   inspiring_easley
[root@bogon ~]# docker commit -a="jiaxianseng" -m="tomcat without docs" 1b58d5c68b21 bogon/usr/java:1.2  #提交容器副本使之成为一个新的镜像
sha256:3280223284dbf4b2e2bc60648116e9e5f6c22bb10b50c698f9467133f9806270
[root@bogon ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bogon/usr/java      1.2                 3280223284db        23 seconds ago      475 MB
docker.io/tomcat    latest              48dd385504b1        8 days ago          475 MB
docker.io/centos    latest              1e1148e4cc2c        10 days ago         202 MB
[root@bogon ~]# docker run -it -p 7777:8080  bogon/usr/java:1.2

2、Dockerfile形式创建镜像
  1.1) Dockerfile是之创建一个命名为Dockerfile文本,该文本定义了对自定义容器的操作,具体操作演示如下

[root@bogon temp]# pwd
/usr/java/temp
[root@bogon temp]# vim Dockerfile

  1.2)定义的内容如下

From centos:7
COPY test1.txt /usr/java/temp/
COPY test2.txt /usr/java/temp/

  1.3) 表示创建镜像并将宿主机的指定的目录内(根据创建镜像指定的路径下)的test1.txt与test2.txt拷贝到创建的镜像中

[root@bogon temp]# echo "Hello" >>test1.txt
[root@bogon temp]# echo "JIA" >>test2.txt
[root@bogon temp]# docker build -t jia/demo:1.1 .
[root@bogon temp]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jia/demo            1.1                 028625c703b5        6 seconds ago       202 MB
[root@bogon temp]# docker run -it jia/demo:1.1 bash
[root@364168cd4747 /]# cd /usr
[root@364168cd4747 usr]# cd java/temp
[root@364168cd4747 temp]# ll
total 8
-rw-r--r--. 1 root root 6 Dec 23 04:24 test1.txt
-rw-r--r--. 1 root root 4 Dec 23 04:24 test2.txt
[root@364168cd4747 temp]# more test1.txt
Hello

扩展:创建一个包含nginx的centos容器

FROM centos

MAINTAINER 2019-1-5 JIAXIANSENG
RUN  yum -y install gcc*  make pcre-devel zlib-devel
ADD nginx-1.6.0.tar.gz  /usr/src/
WORKDIR /usr/src/nginx-1.6.0/
RUN useradd -s /sbin/nologin -M nginx
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
EXPOSE 80
WORKDIR /
RUN nginx
CMD ["nginx", "-g", "daemon off;"]

前提是当前目录下不止有Dockerfile文件,还有一个nginx-1.6的压缩包

如果没有可以通过以下命令获得

wget http://mirrors.sohu.com/nginx/nginx-1.6.0.tar.gz

然后执行以下命令可以获得包含nginx的centos镜像

docker build -t="centos-nginx:1.1" .

2) Dockerfile命令

  2.1)COPY

  COPY指令从build上下文复制文件或者文件夹到容器文件系统

  2.2) ADD指令

  ADD指令不但可以复制文件到容器文件系统,而且可以从头internet下载文件并复制到容器

  ADD指令可以自动加压压缩文件

  通常用COPY指令,除非明确需要ADD指令

2) Dockerf缓存

 没次Docker执行一次指令将创建新的镜像,如果下一次指令没有变化,Docker将使用现有的缓存

 使用Dockerfile创建镜像,如果第二次创建使用的Dockerfile没有变化,就会使用第一次创建的缓存

 如:

[root@bogon temp]# docker build -t jia/demo:1.4 .
Sending build context to Docker daemon 4.096 kB
Step 1/3 : FROM centos:7
 ---> 1e1148e4cc2c
Step 2/3 : COPY test1.txt /usr/java/temp/
 ---> Using cache
 ---> 8ca728ac64eb
Step 3/3 : COPY test2.txt /usr/java/temp/
 ---> Using cache
 ---> 6b77462c1a84
Successfully built 6b77462c1a84

3) docker缓存所带来的问题

  之前:

Before:
From centos:7
RUN yum update -y
RUN yum install -y git

  之后

After:
FROM centos:7
RUN yum update -y
RUM yum install -y git curl

  有可能第一次yum是老版本,第二次则会利用缓存,下载下的不是最新的git版本

  解决:

  3.1)  链式输入命令

FROM centos:7
RUN yum update -y && yum install -y git curl

  3.2) 指定-no-cache选项

docker build -t jia/centos . --no-cache=true

十、Docker 容器数据卷

1、介绍
  Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然就没有了,为了保存数据在docker中可以使用数据卷(相当于将数据持久化:宿主主机与容器之间的数据共享)

  卷就是目录或文件,存在与一个或多个容器中,由docker挂在到容器,但不属于联合文件系统,因此能绕过Union File System提供一些用于持续存储或共享数据的特性:

  卷设计目的就是数据持久化,完全独立于容器的生存周期,因此Docker不会再容器删除时删除其挂载的数据卷

  特点:

  1)、数据卷可以在容器之间共享或重用数据

  2)、卷中的更改可以直接生效

  3)、数据卷中的更改不会包含在镜像的更新中

  4)、数据卷的生命周期一直持续到没有容器使用它为止

2、直接命令添加

  1) docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

      意思是容器与宿主机各建立一个共享文件夹,双方数据能实现同步

[root@bogon java]# docker run -it -v /usr/java/data:/containerdata centos

  此时宿主机会出现data文件夹,容器根目录会出现containerdata文件夹,宿主机在data文件夹新建的文件container文件夹会即使响应(即使容器关闭),相反同理

  2) 待权限:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

[root@bogon java]# docker run -it -v /usr/java/data:/containerdata:ro centos

  此时宿主机新建的文件容器响应后只有读的权限

3、使用DockerFile添加数据卷

  步骤:

    1)、根目录下新建mydocker文件夹并进入

    2)、可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

    3)、File构建

    4)、build后生成镜像--获得一个新的镜像

    5)、run容器

  3.1)、现在宿主机根目录下新建mydocker文件夹,并在该目录下新建文夹Dockerfile,使用VLUME指令给镜像添加一个或多个数据卷

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success"
CMD /bin/bash

  3.2)、使用build生成镜像

[root@bogon mydocker]# docker build /mydocker/Dockerfile -t jia/centos . #注意:要加个“.”

  3.3)、运行镜像生成容器,在容器中新建的内容,可以用inspect命令查看到到它与宿主机映射同步的文件

4、数据卷容器

    定义:
  数据卷容器即命名的容器挂在数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器称之为数据卷容器,即容器键传递共享

  demo:新建容器1,利用上面build的环境镜像

[root@bogon mydocker]# docker run -it --name dc01 jia/centos
[root@125b3522bf1e /]# cd dataVolumeContainer2
[root@125b3522bf1e dataVolumeContainer2]# touch dc01_add.txt
[root@125b3522bf1e dataVolumeContainer2]# [root@bogon mydocker]#   #ctr+p+q 退出不关闭
[root@bogon mydocker]# docker run -it --name dc02 --volumes-from dc01 jia/centos   #创建dc02并集成dc01
[root@049997e2213a /]# cd dataVolumeContainer2
[root@049997e2213a dataVolumeContainer2]# ll
total 0
-rw-r--r--. 1 root root 0 Dec 16 12:55 dc01_add.txt                  #此时容器dc02也有dc01_add.txt

十一、安装mysql  

 1、拉取镜像

[root@bogon /]# docker pull mysql:5.6

 2、运行镜像

[root@bogon /]# docker run -p 3307:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

 3、客户端链接

 

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_docker_07

4、数据备份
   将mysql中创建的表格数据备份到宿主机上

[root@bogon ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
bac8a9ba01b7        mysql:5.6           "docker-entrypoint..."   2 minutes ago       Up 2 minutes        0.0.0.0:3307->3306/tcp   mysql
[root@bogon ~]# docker exec bac8a9ba01b7 sh -c 'exec mysqldump --all-databases -uroot -p"123456"' > /usr/java/all-databases.sql
Warning: Using a password on the command line interface can be insecure.
[root@bogon ~]# cd /usr/java
[root@bogon java]# ll
总用量 1
-rw-r--r--.  1 root   root   3321119 12月 16 21:52 all-databases.sql

 注意:--all-databases是备份所有库数据,如果是备份指定库的名字

十二、安装redis

  1、拉取 镜像

[root@bogon java]# docker pull redis

  2、运行镜像

[root@bogon java]# docker run -p 6379:6379 -v /usr/java/redisdata/data:/data -v /usr/java/redisdata/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes

  3、在宿主机的指定文件夹(这里是/usr/java/redisdata/conf/redis.conf)目录下,拷贝一份redis.conf于该目录,则通过 操作此配置文件来操作容器中的配置

   4、利用redis-cli命令启动

[root@bogon java]# docker exec -it fd0d53df30a3 redis-cli

十三、本地镜像推送至阿里云

  镜像的生成方法:1、DockerFile 2、从容器创建一个新的镜像 docker commit

  1、将指定镜像推送到本地

[root@bogon java]# docker run -it centos  #假如以centos为列子
[root@688ff3c3a696 /]# pwd
/
[root@688ff3c3a696 /]# [root@bogon java]# 
[root@bogon java]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
688ff3c3a696        centos              "/bin/bash"         15 seconds ago      Up 13 seconds                           competent_mahavira
[root@bogon java]# docker commit -a jiaxianseng -m "new centos" 688ff3c3a696 centos
sha256:9fcec34e52bb3c3092dbf5c43fa98bf19fc66a5e7216690ae75a03eb98e9bde5
[root@bogon java]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              9fcec34e52bb        6 seconds ago       202 MB
docker.io/redis     latest              ce25c7293564        2 days ago          95 MB
docker.io/tomcat    latest              48dd385504b1        8 days ago          475 MB
docker.io/centos    latest              1e1148e4cc2c        10 days ago         202 MB
docker.io/mysql     5.6                 a876cc5d29e4        4 weeks ago         256 MB

  2、在阿里云上创建镜像仓库

  1) 访问地址:阿里云

  2) 找到容器镜像服务,创建镜像仓库

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_Docker_08

  3、点击管理便可以看到操作的代码

十四:Docker部署web应用

  1、环境前提:配置jdk环境与mvaven环境

[root@bogon mysql-spring-boot-todo]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[root@bogon mysql-spring-boot-todo]# mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/java/maven
Java version: 1.8.0_191, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.6.3.el7.x86_64", arch: "amd64", family: "unix"

  2、安装git

yum install -y git maven

  3、拉取代码

git clone https://github.com/yangzhares/mysql-spring-boot-todo.git

  4、 更新pom中的docker-maven-plugin

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_Docker_09

  该项目是基于Dockerfile构建镜像

  5、更新application.yml中的mysql配置

[root@bogon resources]# pwd
/usr/java/javademo/mysql-spring-boot-todo/src/main/resources
[root@bogon resources]# vim application.properties

  6、由于本人宿主机上下载的mysql是最新的,所以拷贝下的项目mysql驱动要高点

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_docker_10

  7、配置方言

[root@bogon mysql-spring-boot-todo]# more src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://192.168.174.128:3307/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect

    8、maven打包生成镜像

[root@bogon javademo]# ll
总用量 4
drwxr-xr-x. 6 root root 4096 12月 23 20:22 mysql-spring-boot-todo
[root@bogon javademo]# cd mysql-spring-boot-todo/
[root@bogon mysql-spring-boot-todo]# mvn clean package docker:build
[root@bogon mysql-spring-boot-todo]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jia/todo-demo       1.0.0               6a7e03e0ae46        12 seconds ago      712 MB

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_centos_11

如果看到BUILD SUCCESS,已经生成的自定义镜像说明打包成功

  9、运行mysql镜像

[root@bogon resources]# docker run -p 3307:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASSE=test -d mysql:5.6

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_Docker_12

  10、运行生成的镜像

root@bogon resources]# docker run --name todo -d -p 8080:8080 jia/todo-demo:1.0.0

   此时通过docker ps命令可以看到不久后该镜像会挂失

root@bogon resources]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ec224714ace6        mysql:5.6           "docker-entrypoint..."   7 minutes ago       Up 7 minutes        0.0.0.0:3306->3306/tcp   mysql01
[root@bogon resources]# docker logs todo

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_Docker_13

org.hibernate.service.spi.ServiceException: Unable to create requested service

  通过docker logs 镜像名可以看到mysql未连接上,但是配置文件配置了mysql连接相关信息,也启动了mysql,却连接不上,这涉及到docker之间通讯问题(这里只演示单机到之间的通讯,如果不同的主机涉及网络问题)

Docker容器之间的通讯

  1) 采用link命令(不推荐)

[root@bogon resources]# docker run --name todo -d -p 8080:8080 --link  mysql jia/todo-demo:1.0.0

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_Docker_14

 

此时如果访问http://虚拟机ip:8080,出现如下界面说明通讯成功

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_Docker_15

   2) 通过exec命令查看docker容器之间是怎样通讯的

[root@bogon ~]# docker exec -it todo bash
admin@e984359ddb98:/app$ cat /etc/hosts     //打印hosts文件
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    mysql 0815d7ef28b0      //会多一条连接mysql地址
172.17.0.3    e984359ddb98
admin@e984359ddb98:/app$ ping mysql   //当然通过ping命令也可以ping通
PING mysql (172.17.0.2): 56 data bytes 
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.235 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.140 ms

  3) 查看env可以查看环境变量

admin@e984359ddb98:/app$ env

虚拟化和容器化谁才是未来 容器虚拟化的优缺点_Docker_16

  从中可以看到环境变量中配置了mysql相关的参数

  4)使用连接的好处

  运行在同一主机的独立容器间可以相互通讯

  容器间建立一个安全通讯隧道而不需要暴露容器的任何端口

十五、使用Docker Compose管理多个容器

  使用官方不推荐link方式进行容器之间的通讯,因为要一个一个地启动容器,官方推进Docker Compose方式管理多个容器

  1、为什么需要docker Compose

  当多个容器相互之间需要通讯时,手动配置容器间连接变得非常复杂

  2、什么是Docker Compose

  Docker Compose是一个定义和管理多个Docker容器的工具

  它通过YAML文件定义Docker应用运行时信息,如端口,网络等

  使用Docker Compose,一个简单命令可以管理多个容器应用

   3、使用场景

    快速构建开发环境

    自动化测试环境

   单一主机部署

  4、简单演示之如何通过Docker Compose

    4.1) 定义Dockerfile

    4.2) 定义docker-compose.yml文件

    4.3) 通过docker-compose up启动docker-compose.yml所定义的Docker应用

        demo中包含docker-compose.yml文件,其中定义关于两个容器的参数配置

[root@bogon docker-compose]# pwd
/usr/java/javademo/mysql-spring-boot-todo/docker-compose
[root@bogon docker-compose]# ll
总用量 12
-rw-r--r--. 1 root root 667 12月 23 17:26 docker-compose.yml

    也定义两个Dockerfile文件

-rw-r--r--. 1 root root 195 12月 23 14:59 Dockerfile-mysql

    4.4) 安装docker-compose

[root@bogon docker-compose]# curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-'uname-s'-'uname -m' -o /usr/local/bin/docker-compose
[root@bogon docker-compose]# chmod +x /usr/local/bin/docker-compose

    4.5) 启动容器

[root@bogon docker-compose]# docker-componse up -d

  几个重要的Docker Compose命令

  docker-compose up:启动所有容器

  docker-compose ps:查看所有运行容器

  docker-compose logs:查看运行容器日志

  docker-compose stop:停止运行容器

  docker-compose rm:删除已停止容器

  docker-compose build:重新创建所有镜像

  注意:dokcer-compose只有在Docker镜像不存在时创建镜像

  更行Dockerfile后一定要执行dockerA-compose build重新创建镜像

Docker远程访问

1、环境准备

  第二台安装Docker的服务器

  修改Docker守护进程启动选项,区别服务器

  保证Client API与Server API版本一致

2、为每台服务器配置label标签并且绑定ip

  宿主机1:(服务端 )

[root@bogon docker]# whereis docker
docker: /usr/bin/docker /etc/docker /usr/libexec/docker /usr/share/man/man1/docker.1.gz
[root@bogon docker]# pwd
/etc/docker
[root@bogon docker]# vim daemon.json
unix:///var/run/docker/sock
tcp://host:prot
fd://socketfd

  重启:

[root@bogon docker]# systemctl restart docker

  宿主机2:

 配置label

{
  "registry-mirrors": ["https://1mz9i0xi.mirror.aliyuncs.com"],
  "labels": ["name=docker-server_2"]
}

  重启:并访问服务端

[root@bogon ~]# curl http://192.168.174.134:2375/info
{"ID":"3WZZ:XR6K:SPLT:PLKO:XIGT:QREM:2NQ4:ZXCX:2774:YX73:JSKV:NU75",
"Containers":1,"ContainersRunning":0,"ContainersPaused":0,"ContainersStopped":1,
"Images":5,"Driver":"overlay2","DriverStatus":[["Backing Filesystem","xfs"],
["Supports d_type","false"],["Native Overlay Diff","true"]],"SystemStatus":null,
"Plugins":{"Volume":["local"],"Network":["bridge","host","macvlan","null","overlay"],
"Authorization":null},"MemoryLimit":true,"SwapLimit":true,"KernelMemory":true,"CpuCfsPeriod":true,
"CpuCfsQuota":true,"CPUShares":true,"CPUSet":true,"IPv4Forwarding":true,"BridgeNfIptables":true,
"BridgeNfIp6tables":true,"Debug":false,"NFd":15,"OomKillDisable":true,"NGoroutines":22,
"SystemTime":"2019-01-01T20:45:12.853448729+08:00","LoggingDriver":"journald",
"CgroupDriver":"systemd","NEventsListener":0,"KernelVersion":"3.10.0-862.6.3.el7.x86_64",
"PkgVersion":"docker-1.13.1-88.git07f3374.el7.centos.x86_64","OperatingSystem":"CentOS Linux 7 (Core)",
"OSType":"linux","Architecture":"x86_64","IndexServerAddress":"https://index.docker.io/v1/",
"IndexServerName":"docker.io","RegistryConfig":{"InsecureRegistryCIDRs":["127.0.0.0/8"],
"IndexConfigs":{"docker.io":{"Name":"docker.io","Mirrors":["https://1mz9i0xi.mirror.aliyuncs.com"],
"Secure":true,"Official":true}},"Mirrors":["https://1mz9i0xi.mirror.aliyuncs.com"]},"NCPU":1,
"MemTotal":1910042624,"DockerRootDir":"/var/lib/docker","HttpProxy":"","HttpsProxy":"",
"NoProxy":"","Name":"bogon","Labels":["name=docker-server_1"],"ExperimentalBuild":false,
"ServerVersion":"1.13.1","ClusterStore":"","ClusterAdvertise":"",
"Runtimes":{"docker-runc":{"path":"/usr/libexec/docker/docker-runc-current"},
"runc":{"path":"docker-runc"}},"DefaultRuntime":"docker-runc",
"Swarm":{"NodeID":"","NodeAddr":"","LocalNodeState":"inactive","ControlAvailable":false,"Error":"","RemoteManagers":null,"Nodes":0,"Managers":0,
"Cluster":{"ID":"","Version":{},"CreatedAt":"0001-01-01T00:00:00Z","UpdatedAt":"0001-01-01T00:00:00Z","Spec":{"Orchestration":{},
"Raft":{"ElectionTick":0,"HeartbeatTick":0},"Dispatcher":{},"CAConfig":{},"TaskDefaults":{},"EncryptionConfig":{"AutoLockManagers":false}}}},
"LiveRestoreEnabled":false,"Isolation":"","InitBinary":"/usr/libexec/docker/docker-init-current",
"ContainerdCommit":{"ID":"","Expected":"aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1"},
"RuncCommit":{"ID":"N/A","Expected":"9df8b306d01f59d3a8029be411de015b7304dd8f"},
"InitCommit":{"ID":"fec3683b971d9c3ef73f284f176672c44b448662","Expected":"949e6facb77383876aeff8a6944dde66b3089574"},
"SecurityOptions":["name=seccomp,profile=/etc/docker/seccomp.json","name=selinux"],"Registries":[{"Name":"docker.io","Secure":true}]}

  利用客户端访问:docker -H命令

[root@bogon docker]# docker -H tcp://192.168.174.134:2375 info
Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 5
Server Version: 1.13.1
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: false
 Native Overlay Diff: true
Logging Driver: journald
Cgroup Driver: systemd
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
Init Binary: /usr/libexec/docker/docker-init-current
containerd version:  (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1)
runc version: N/A (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f)
init version: fec3683b971d9c3ef73f284f176672c44b448662 (expected: 949e6facb77383876aeff8a6944dde66b3089574)
Security Options:
 seccomp
  WARNING: You're not using the default seccomp profile
  Profile: /etc/docker/seccomp.json
 selinux
Kernel Version: 3.10.0-862.6.3.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 1
Total Memory: 1.779 GiB
Name: bogon
ID: 3WZZ:XR6K:SPLT:PLKO:XIGT:QREM:2NQ4:ZXCX:2774:YX73:JSKV:NU75
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
 name=docker-server_1
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 https://1mz9i0xi.mirror.aliyuncs.com
Live Restore Enabled: false
Registries: docker.io (secure)

但是如果每次访问远程服务都需要调用docker -H命令会显得繁琐

可以配置环境变量 利用export命令

[root@bogon docker]# export DOCKER_HOST="tcp://192.168.174.134:2375"

此时利用docker info命令可以看到它默认连接上了远程服务端

Registry: https://index.docker.io/v1/
Labels:
 name=docker-server_1
Experimental: false

当然如果想默认连接本机可以利用export命令即Docker-HOST的内容置空,即空字符串

二、Dockerfile指令

  1、FROM <image> 表示来自哪个镜像

  2、MAINTAINER <name> 用于指定镜像的作者信息,包含镜像的所有者和联系信息

  3、RUN命令:在容器构建过程中运行:如安装nginx

     1) RUN <commad> (shell模式) 如:RUN echo hello    

       2) RUN ["executable","paam1","param2"] (exec模式) 如:RUN["/bin/bash","-c","echo hello"]

  4、EXPOSE <port> [<port>..]  指定运行该镜像的容器使用的端口号

  5、在容器运行时运行的,用于执行什么指令,如运行nginx,不过此命令会被docker run 启动命令覆盖

     1) CMD  ["executable","paam1","param2"] (exec模式)

     2) CMD command param1 param2(shell 模式)

  6 、ENTRPOINT :与CMD命令相似,只是=此命令不会被docker run 启动命令覆盖

    1) ENTRYPOINT   ["executable","paam1","param2"] (exec模式)

    2) ENTRYPOINT  command param1 param2(shell 模式)

  7、ADD 将宿主机文件复制到创建容器

    ADD <src>..<dest> 

    ADD ["src"..""<>dest](适用于文件路径中有空格的情况)

    COPY <src> .. <dest>

    COPY ["src"..""<>dest](适用于文件路径中有空格的情况)

     区别:

    ADD 包含类似tar的解压功能

    如果单纯复制文件,Docker推荐使用COPY

   8、VOLUME ["/data"] :用于为创建的容器创建数据卷,用于数据持久化

   9、WORKDIR /path/to/workdir :在容器内部设置工作目录,那么如cmd命令都会在指定的目录下进行

   10、ENV <key><value>

     ENV <key>=<value>..

   11、USER daemon 指定用户

     如 USER nginx

三、容器的互联

   1) 容器之间的互联访问

  如果在同一个局域网下,容器之间是通过虚拟网桥连接的,所以相互之间可以互联通信,但是每次重新启动一次容器,其ip地址会发生变化

  为了防止此变化可以通过link命令进行连接

[root@bogon ~]# docker run -it --name cct1 centos
[root@bogon ~]# docker run it --name cct2 --link=cct1:webtest centos  #ctr+P+q
[root@131b9fc5eea4 etc]# ping cct1
PING webtest (172.17.0.2) 56(84) bytes of data.
64 bytes from webtest (172.17.0.2): icmp_seq=1 ttl=64 time=0.157 ms
64 bytes from webtest (172.17.0.2): icmp_seq=2 ttl=64 time=0.135 ms

  2) 拒绝所有容器间互联(处于安全考虑)

  Docker守护进程的启动选项

  --icc=false

  此针对于centos7系统配置

[root@bogon docker]# pwd
/etc/docker
[root@bogon docker]# ll
总用量 20
drwxr-xr-x. 5 root root    72 12月 15 23:23 certs.d
-rw-r--r--. 1 root root   120 1月   2 21:15 daemon.json
-rw-------. 1 root root   244 12月 15 23:24 key.json
-rw-r--r--. 1 root root 10837 12月  7 23:42 seccomp.json
[root@bogon docker]# vim daemon.json
{
  "registry-mirrors": ["https://1mz9i0xi.mirror.aliyuncs.com"],
  "labels": ["name=docker-server_1"],
  "icc":false
}
[root@bogon docker]# systemctl restart docker
[root@bogon docker]# docker restart cct1 cct2
cct1
cct2
[root@bogon docker]# docker attach cct2
[root@131b9fc5eea4 /]# ping cct1
PING webtest (172.17.0.2) 56(84) bytes of data.  #程序进程被卡住
^C

  3) 允许特定容器间的连接 

  Docker守护进程的启动选项

  --icc=false   #设置拒绝所有访问

  --iptable=true  #配置iptables 此与上命令置于daemon.json

  --link      #利用link命令单独连接

  如:{ ... "icc": false, "iptables": true, ... }

四、Docker容器与外部网络的连接

  ip_forward

  iptables (centos7为firewalld)

  允许端口映射访问

  限制IP访问容器

  1、--ip-forward=true

  sysctl net.ipv4.conf.all.forwarding

  1) 查看ipv4的值

[root@bogon docker]# sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1     #该值为1

  2) 启动一个容器,其镜像是基于拥有nginx服务的镜像

[root@bogon ~]# docker run -it -p 80 --name cct5 cento
[root@de032d9b3734 /]#nginx
[root@de032d9b3734 /]# [root@bogon ~]#
[root@bogon ~]# docker port cct5
80/tcp -> 0.0.0.0:32768
[root@bogon ~]# curl 127.0.0.1:32768 #此时可以看到nginx首界面

  3) 在另外一台宿主机上启动docker,并尝试连接cct5的容器

[root@bogon ~]# curl 192.168.174.128:32768 #此时能正常访问

  说明当我们建立端口映射时,iptables会加入一条规则允许外部容器的访问

  4) 可以通过iptables添加规则来阻止或指定特定容器的连接

    4.1) 先查询指定所要阻止的容器所在的ip,如这里是192.168.174.128

    4.2) 重新启动一个容器:此容器与阻止访问的容器不再同一个宿主机上

[root@bogon ~]# docker run -it -p 80 --name cct6 cento
[root@de032d9b3734 /]#nginx
[root@de032d9b3734 /]# [root@bogon ~]#
[root@bogon ~]# iptables -L -n
Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            172.17.0.3           tcp dpt:80    #此时iptables添加的容器映射

  4.3) 添加规则

[root@bogon ~]# iptables -I DOCKER -s 192.168.174.128 -d 172.17.0.3 -p TCP --dport 80 -j DROP

  4.4) 此时通过另台宿主机(192.168.174.128)容器访问172.17.0.3的容器,进程会卡主连接不上,说明阻止成功

五、Docker容器数据卷

  1、什么是数据卷

  数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用 *数据卷的使用,类似于 Linux 下对目录或文件进行 mount

  2、创建数据卷

[root@bogon df_test1]# docker run --privileged=true -it -v /usr/java/datas:/data centos /bin/bash #--privileged=true是允许运行的容器加特权拥有编辑操作等
[root@23533d8e59c6 /]# cd data
[root@23533d8e59c6 data]# touch a.txt
[root@23533d8e59c6 data]# echo "i am jiaxianseng" >>a.txt
[root@23533d8e59c6 data]# cat a.txt
i am jiaxianseng
[root@23533d8e59c6 data]# [root@bogon df_test1]# 
[root@bogon df_test1]# cd /usr/java/datas
[root@bogon datas]# ll
总用量 4
-rw-r--r--. 1 root root 17 1月   2 22:52 a.txt
[root@bogon datas]# cat a.txt
i am jiaxianseng

  3、添加权限之可读:

[root@bogon datas]# docker run -it -v /usr/java/datas:/data:ro --name cct8 centos /bin/bash
[root@91ee8587eba5 /]# cd /data
[root@91ee8587eba5 data]# ech "www.baidu.com" >> a.txt
bash: a.txt: Permission denied    #但是可以通过vi打开

  4、通过Dockerfile创建数据卷

FROM centos
VOLUME ["/usr/java/datas","/data"]
CMD /bin/bash

 六、数据卷容器

  1、什么是数据卷容器

  命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器叫做数据卷容器

  2、挂载数据卷容器的方法

  docker run --volumes-from [CONTAINER NAME]

[root@bogon datas]# ll   #当期那目录有a.txt文件
总用量 4
-rw-r--r--. 1 root root 17 1月   2 22:52 a.txt
[root@bogon datas]# pwd
/usr/java/datas
[root@bogon datas]# docker run -it -v /usr/java/datas:/dbdata --name dbdata centos    #创建数据卷容器
[root@da12a0d3bf2f /]# exit
exit
[root@bogon datas]# docker run -it --volumes-from dbdata --name db1 centos       #创建两个容器并挂载到dbdata容器中的数据卷
[root@ae1156049856 /]# [root@bogon datas]# 
[root@bogon datas]# docker run -it --volumes-from dbdata --name db2 centos
[root@4b857926f794 /]# ll
total 28
-rw-r--r--.   1 root root 12076 Dec  5 01:37 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Dec  5 01:36 bin -> usr/bin
drwxr-xr-x.   2 root root    18 Jan  2 14:52 dbdata
drwxr-xr-x.   5 root root   360 Jan  3 13:09 dev
drwxr-xr-x.   1 root root    62 Jan  3 13:09 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Dec  5 01:36 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Dec  5 01:36 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 228 root root     0 Jan  3 13:09 proc
dr-xr-x---.   2 root root  4096 Dec  5 01:37 root
drwxr-xr-x.   1 root root    20 Jan  3 13:09 run
lrwxrwxrwx.   1 root root     8 Dec  5 01:36 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Jan  3 12:42 sys
drwxrwxrwt.   7 root root  4096 Dec  5 01:37 tmp
drwxr-xr-x.  13 root root  4096 Dec  5 01:36 usr
drwxr-xr-x.  18 root root  4096 Dec  5 01:36 var
[root@4b857926f794 /]# cd /    
[root@4b857926f794 /]# cd dbdata 
[root@4b857926f794 dbdata]# ll                
total 4    
-rw-r--r--. 1 root root 17 Jan  2 14:52 a.txt
[root@4b857926f794 dbdata]# cat a.txt                              #此时在任意一个容器中编辑数据,其他容器都能看的到,这是数据卷容器中的a.txt文件                        
i am jiaxianseng

即使删了数据卷容器,挂载的容器数据依然存在

[root@bogon datas]# docker rm dbdata
dbdata
[root@bogon datas]# docker attach db1
[root@ae1156049856 /]# ll /
[root@ae1156049856 /]# cd dbdata
[root@ae1156049856 dbdata]# ll
total 4
-rw-r--r--. 1 root root 17 Jan  2 14:52 a.txt

七、数据卷的备份和还原

  1、数据卷备份方法

  docker run --volumes-from [container name] -v$(pwd):/backup centos

  tar cvf /backup/backup.tar [container data volum

[root@bogon datas]# docker run -it -v /usr/java/datas:/dbdata --name cct1 centos
[root@713cdcf2c026 /]# exit
exit
[root@bogon datas]# docker run --privileged=true --volumes-from cct1 -v /backup:/backup --name cct2 centos tar cvf /backup/cct1.tar /dbdata
/dbdata/
/dbdata/a.txt
tar: Removing leading `/' from member names
[root@bogon datas]# cd /backup
[root@bogon backup]# ll
总用量 12
-rw-r--r--. 1 root root 10240 1月   3 21:32 cct1.tar

  2、数据卷还原方法

  docker run --volumes-from [container name] -v $(pwd):/backup centos

  tar xvf /backup/backup.tar [container data volume]