docker高级之容器数据卷

容器数据卷

1、什么是数据卷

数据卷是在容器内的特殊目录,这个目录和宿主机里的某个目录有特殊的映射关系,类似于linux 中的mount行为

2、容器数据卷的作用
  • 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便
  • 对数据卷内数据的修改会立马生效,无论是容器内操作还是宿主机本地操作
  • 对数据卷的更新不会影响镜像,解耦开应用和数据
  • 数据卷会一直存在,直到没有容器使用,可以安全地卸载它

总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!

3、容器数据卷的使用
3.1、创建容器数据卷
  • 使用 docker volume 创建本地数据卷

Usage:  docker volume COMMAND

Manage volumes
Options:
Commands:
  create      Create a volume   -- 创建一个本地数据卷
  inspect     Display detailed information on one or more volumes   -- 查看数据卷详情
  ls          List volumes    -- 查看所有的数据卷
  prune       Remove all unused volumes   -- 删除所有没有使用的数据卷
  rm          Remove one or more volumes  -- 删除一个多个数据卷
3.2使用数据卷

用docker [container] run 命令的时候,可以使用–mount选项来使用数据卷。
–mount选项支持三种类型的数据卷,包括
bind:绑定数据卷,映射到主机指定路径下;
tmpfs:临时数据卷,只存在于内存中。
volume:普通数据卷,映射到主机/var/lib/docker/volumes路径下;

下面使用centos:7镜像创建一个centos容器,并创建一个数据卷挂载到容器的/test目录:
$ docker container run -dit --name centos  --mount  type=volume, source=testvolume, destination=/test  centos:7
$ docker container run -dit --name centos1  --mount  type=bind,source=/root/abc,destination=/test centos:7
上述type=bind的命令等同于下面的写法 :
# /root/abc主机内地址   /test docker  容器地址
$ docker container run -dit --name centos2  -v  /root/abc:/test/  centos:7


注意,本地目录的路径必须是绝对路径,容器内路径可以为相对路径。如果目录不存在,Docker会自动创建

当使用容器数据卷时,在容器内或者宿主机内操作共享的文件都会同步,即使是容器停止,在宿主机内操作共享文件,重启容器后,文件就会同步

3.3 、 数据卷实战 (mysql 安装)
#使用docker 下载镜像这里就不做介绍,下面主要说一下数据卷的使用

-d 后台运行
-p 指定端口号
-v 数据卷 (可以设置多个)
-e  指定mysql的账户密码
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql

如果将容器删除,本地的数据仍然不会丢失,这就是数据卷的作用

3.4 利用数据卷容器实现容器间数据共享

数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载

  1. 创建一个数据卷容器 dbdata,并让宿主机创建一个数据卷挂到centos 容器里/dbdata 目录下
docker run -it -v /dbdata --name dbdata centos
//这里没明确指定宿主机中的目录,会在/var/lib/docker/volumes下自动生成,名字随机
  1. 可以在其他容器中使用–volumes-from来挂载dbdata容器中的数据卷
    例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:
docker run -it --volumes-from dbdata --name db1 centos   
docker run -it --volumes-from dbdata --name db2 centos
  1. 此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录,三个容器任何一方在该目录下的写入,其他容器都可以看到。

如果删除了挂载的容器(包括dbdata、db1和db2 ),数据卷并不会被自动删除

3.5 数据备份

使用下面的命令来备份dbdata数据卷容器内的数据卷

docker  run --volumes-from dbdata -v  $(pwd):/backup --name worker centos:7  tar  cvPf  /backup/backup.tar  /dbdata

# 首先利用 centos:7镜像创建了一个容器worker
# 使用--volumes-from dbdata 参数来让worker容器挂载dbdata容器的数据卷(即dbdata 数据卷)
# 使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录
# worker容器启动后,使用tar cvPf /backup/backup.tar  /dbdata 命令将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar
3.6 数据恢复

如果要恢复数据到一个容器,可以按照下面的操作。
创建另一个新的容器,并使用untar解压备份文件到所挂载的容器卷中

docker run --volumes-from dbdata -v $(pwd):/backup  centos  tar xvf  /backup/backup.tar -C /
4、具名和匿名挂载
# 匿名挂载
-v 容器内路径!  /etc/nginx 表示宿主机路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的volume的情况
➜  ~ docker volume ls    
DRIVER              VOLUME NAME
local               33ae588fae6d34f511a769948f0d3d123c9d45c442ac7728cb85599c2657e50d
local            
# 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路劲!

# 具名挂载   -- juming-nginx 名字
➜  ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
➜  ~ docker volume ls                  
DRIVER              VOLUME NAME
local               juming-nginx

# 通过 -v 卷名:容器内路径
# 查看一下这个卷

所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data下
如果指定了目录,docker volume ls 是查看不到的

5、 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径			#匿名挂载
-v 卷名:容器内路径		#具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的

拓展

# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx

# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

6、初识DockerFile

Dockerfile 就是用来构建docker镜像的构建文件!命令脚本!通过这个脚本可以生成镜像

6.1 dockerFile 的创建步骤
  1. 编写一个dockerFile文件
  2. docker build 构建成一个镜像
  3. docker run 运行一个镜像
  4. docker push 发布镜像 (DockerHub 阿里云镜像仓库)
6.2 dockerFile 指令语句的基础知识
  1. 每条保留字命令都必须为大写字母且后面要跟随至少一个参数。
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令的执行都会创建一个新的镜像层
6.3 dockerFile的基础指令
FEOM                       #基础镜像,一切从这里构建
MAINTAINER                 #镜像是谁写的   姓名+邮箱
RUN                        #镜像构建的时候需要运行的命令
ADD                        #步骤   添加内容,添加同目录,添加的文件可以是压缩文件,默认自动解压
WORKDIR                    # 镜像的工作目录
VOLUME                     # 挂载目录
EXPOSE                     #保留端口配置
CMD                        #指定这个容器启动的时候要执行的命令,只有最后一个会生效,可悲替代
ENTRYPONIT                 #指定这个容器启动的时候要执行的命令,可以追加命令
ONBUILD                    #当构建一个被继承DockerFile 这个时候就会运行ONBULID的指令,触发指令
COPY                       # 类似ADD,将我们文件拷贝到镜像中,不能解压文件,也不能访问网络资源
ENV                        #构建的时候设置环境变量
6.4构建dockerFile
  1. 进去/home 路径下创建 mydockerfile文件夹,在该文件夹下面创建dockerfile 文件
  2. 编辑dockerfile文件,输入 dockerFile 命令
[root@localhost mydockerfile]# vim dockerfile 

FROM centos
MAINTAINER jiangheng<jiangheng0223@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
VOLUME /home
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo"----end-----"
CMD /bin/bash
  1. 使用docker build 构建dockerFile
# 命令 docker build -f 文件路径 -t 镜像名:[tag] .
[root@localhost mydockerfile]# docker build -f dockerfile -t mycentos:1.0 .
  1. 创建成功
~ 
# 截取了一部分
"test.txt" [New] 1L, 18C written                      

 ---> 40ba0ae60979
Successfully built 40ba0ae60979
Successfully tagged mycentos:1.0
  1. 查看自己创建的镜像
Successfully tagged mycentos:1.0
[root@localhost mydockerfile]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mycentos              1.0                 40ba0ae60979        10 seconds ago      295MB
  1. 启动自己创建的镜像
[root@localhost mydockerfile]# docker run -it --name mycentos mycentos:1.0
  1. 查看安装的 vim 和 net-tools 和设置的工作区
[root@db25ce71000e local]# pwd
/usr/local                   #  这里是工作目录
[root@db25ce71000e local]# vim test.txt     # 表示vim 可以用
[root@db25ce71000e local]# cat test.txt 
ceshi  dockerfile
[root@db25ce71000e local]# ifconfig        # net-tools 工具可以用
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 15  bytes 1226 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
6.5 使用dicker history 查看 docker镜像的变更记录
[root@localhost /]# docker history 40ba0ae60979
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
40ba0ae60979        17 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
c54e3f43f9ab        17 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
fb54f8461a40        17 minutes ago      /bin/sh -c #(nop)  EXPOSE 80                    0B                  
f3056a8498d9        17 minutes ago      /bin/sh -c yum -y install net-tools             22.8MB              
9c3a70d33838        17 minutes ago      /bin/sh -c yum -y install vim                   57.3MB              
b62a1ee9e4af        18 minutes ago      /bin/sh -c #(nop)  VOLUME [/home]               0B                  
5b8195d42a01        18 minutes ago      /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
9acc4893c6f9        18 minutes ago      /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
757b5a3a87a2        18 minutes ago      /bin/sh -c #(nop)  MAINTAINER jiangheng<jian…   0B                  
0d120b6ccaa8        6 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           6 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           6 weeks ago         /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d…   215MB       
7、CMD 和 ENTRYPOINT 命令区别
7.1 CMD
# 编写dockerfile文件
$ vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"]
# 构建镜像
$ docker build  -f dockerfile-test-cmd -t cmd-test:0.1 .
# 运行镜像
$ docker run cmd-test:0.1
.
..
.dockerenv
bin
dev

# 想追加一个命令  -l 成为ls -al
$ docker run cmd-test:0.1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
 executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 
# cmd的情况下 -l 替换了CMD["ls","-l"]。 -l  不是命令所有报错

7.2 ENTRYPOINT
# 编写dockerfile文件
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...
# 我们的命令,是直接拼接在我们得ENTRYPOINT命令后面的
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x   1 root root 4096 May 16 06:32 .
drwxr-xr-x   1 root root 4096 May 16 06:32 ..
-rwxr-xr-x   1 root root    0 May 16 06:32 .dockerenv
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  340 May 16 06:32 dev
drwxr-xr-x   1 root root 4096 May 16 06:32 etc
drwxr-xr-x   2 root root 4096 May 11  2019 home
lrwxrwxrwx   1 root root    7 May 11  2019 lib -> usr/lib
lrwxrwxrwx   1 root root    9 May 11  2019 lib64 -> usr/lib64 ....

从上面两个例子中可以发现,CMD 是不能追加命令,而ENTRYPOINT 是可以追加命令

8.实战(构建tomcat镜像)

tomcat jdk 安装包连接
链接:https://pan.baidu.com/s/1ZIeK7mihBZlpCTiRBUbAJg
提取码:m7xi

  1. 准备镜像文件 tomcat 和 jdk压缩包 放到 自定义的 mytomcat 文件夹中
  2. 在mytomcat 文件夹中定义dock而file文件
FROM centos  
复制这段内容后打开百度网盘手机App,操作更方便哦
MAINTAINER jiangheng<jiangheng0223@qq.com>
ADD jdk-8u144-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.59.tar.gz /usr/local/
RUN yum -y install vim
 #设置环境变量
ENV MYPATH /usr/local 
#设置工作目录
WORKDIR $MYPATH  
ENV JAVA_HOME /usr/local/jdk1.8.0_144
ENV TOMCAT_HOME /usr/local/apache-tomcat-8.5.59
ENV PATH $PATH:$JAVA_HOME/bin:$TOMCAT_HOME/lib # 分隔符:
#端口号默认为8080
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.59/bin/startup.sh && tail -F 
#设置默认命令
/usr/local/apache-tomcat-8.5.59/logs/catalina.out  

3.构建镜像

#注: 如果你定义的文件名叫 dockerfile 可以不用写 -f dockerfile
docker build -f dockerfile -t mytomcat:1.0 .
  1. 验证是否构建成功
使用 docker images  命令查看是否有刚刚创建的镜像

在这里插入图片描述

  1. run 镜像
# 使用 -v 进行 文件挂载当容器启动的时候,tomcat 就已经启动了,以为在dockerfile文件中指定了启动tomcat的配置

docker run -p 8080:8080 --name tomcat1 -v /home/mytomcat:/usr/local/apache-tomcat-8.5.59/webapps/test -v/home/mytomcat/:/usr/local/apache-tomcat-8.5.59/logs mytomcat:1.0
  1. 访问测试

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值