docker-02

容器数据卷

什么是容器数据卷

docker理念回顾:将应用和环境打包成一个镜像

提出问题 :如果把数据存放在容器里,比如mysql,如果你把容器删了,那mysql的数据也没有了,你删了容器就相当于你删库跑路,这是很危险的,如何解决这个问题?

提出需求 :容器如果删除,数据还在,数据需要同步在本地

容器卷技术:容器内产生数据,将数据同步到本地,将容器内目录挂载到Linux上

使用数据卷

方式一:直接使用命令挂载

docker run it -v 主机目录:容器内目录

简单的创建数据卷

#启动centos镜像 创建映射目录
docker run -it --name test-centos -v /home/test:/home/docker-test centos /bin/bash

这样的话,宿主机和容器就形成了映射关系,容器内/home/docker-test目录和宿主机/home/test形成映射关系,两个目录内的文件会共享,如果容器删除,宿主机的文件还在

测试Mysql同步数据

#拉取mysql镜像
docker pull mysql:5.7
#运行容器 注意mysql需要设置密码
#官方这样设置密码
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#创建容器映射目录
[root@VM-12-9-centos ~]# docker run -d -p 5706:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=testmysql mysql:5.7 
fdf396cd8f038026f5cdd7b6deb12ef6c7f1a1c8e73292b5d8171c35948b6293

这样的话我们的mysql容器就创建成功了,端口映射和文件映射也创建好了,我们来看下

[root@VM-12-9-centos ~]# cd /home/mysql ls
[root@VM-12-9-centos mysql]# cd /home/mysql 
[root@VM-12-9-centos mysql]# ls
conf  data
[root@VM-12-9-centos mysql]# cd data/
[root@VM-12-9-centos data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem

远程连接测试一下

[root@VM-12-9-centos data]# mysql -h 101.34.181.173 -u root -P 5706 -p123456
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.38 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

可以看到已经成功连接,并且创建了一个test数据库,接着建一个简单的表测试下

mysql> create table mytest( name char(10));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into mytest set name='mysql';
Query OK, 1 row affected (0.00 sec)

mysql> select *from mytest;
+-------+
| name  |
+-------+
| mysql |
+-------+
1 row in set (0.00 sec)

mysql> 

进入映射目录发现,刚才创建的东西已经同步

[root@VM-12-9-centos data]# cd /home/mysql/data/
[root@VM-12-9-centos data]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1              private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ib_logfile0  mysql               public_key.pem   sys
ca.pem      ib_buffer_pool   ib_logfile1  performance_schema  server-cert.pem  test

同样你删除容器数据是还在的

具名挂载和匿名挂载

#匿名挂载
docker run -d -P --name="nginx-01" -v /etc/nginx nginx
#具名挂载
docker run -d -P --name="nginx-02" -v mynginx:/etc/nginx nginx
#查看挂载情况
docker volume ls
#查看挂载路径
docker volume inspect 名字

大多数情况下我们使用具名挂载

#区分
-v  容器内路径 匿名挂载
-v  卷名:容器内路径 具名挂载
-v  /宿主机器路径:容器内路径 指定路径挂载
#只读和读写
docker run -d -P --name="nginx-03" -v mynginx:/etc/nginx:ro nginx
docker run -d -P --name="nginx-04" -v mynginx:/etc/nginx:rw nginx

初步认识Dockerfile

dockerfile是用来构建docker镜像的文件 是脚本命令,通过这个脚本可以=生成一个镜像,镜像是一层一层的,脚本的一个一个命令,每个命令就是一层

#创建一个简单的dockerfile

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "---end---"
CMD /bin/bash  
#启动
docker build -f dockerfile-01 -t demo-centos .

数据卷容器

多个mysql同步数据问题解决

--volumes-from

刚才我们使用dockerfile创建了我们自己的镜像, 并且映射出去了[“volume01”,“volume02”],我们依据demo-centos创建容器centos-01,centos-01就存在volume01","volume02,接着我们创建centos-02继承centos-01

docker run -it --name centos-02 --volumes-from centos-01 demo-centos /bin/bash

这样在centos-02也存在volume01","volume02,他们的数据是同步的,同理我们继续创建centos-03同理它们的的数据都是绑定的,都是同步的

Dockerfile

dockerfile介绍

dockerfile是用来构建docker镜像文件的命令参数脚本

构建步骤

  1. 编写dockerfile

  2. docker build构建一个镜像

  3. docker run 运行镜像

  4. docker push 发布镜像

官方构建方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woT9nxJ9-1652722075611)(file://C:\Users\Xu\AppData\Roaming\marktext\images\2022-05-16-20-57-38-image.png?msec=1652705858128)]

构建dockerfile

基础

  1. 每个保留关键字(命令)都必须大写

  2. 执行顺序由下到上

  3. #为注释

  4. 没一个指令都会创建一个新的镜像层并提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XBqo5ZRZ-1652722075613)(file://C:\Users\Xu\AppData\Roaming\marktext\images\2022-05-16-21-07-32-image.png?msec=1652706452032)]

dockerfile指令
FROM #基础镜像
MAINTAINER #镜像谁写的,维护者姓名+邮箱
RUN #构建镜像的时候必须的命令
ADD #步骤
WORKDIR #工作目录
VOLUME #挂载的目录
EXPOST #暴露的端口
CMD #指定这个容器启动时候要运行的命令 只有最后一个会生效 不会被替代
ENTRYPOINT #同上可被追加
ONBUILD #构建一个被继承的dockerfile 要用到
COPY #将文件拷贝到镜像中类似ADD
ENV #构建的时候设置环境变量

在这里插入图片描述

测试-构建centos

构建dockerfile

FROM centos:7
MAINTAINER Xu<768212312@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH

这里注意下 2022年centos8已经停止维护,无法连接网络需要手动配置

#构建镜像
docker build -f mydockerfile -t mycentos-01 .
#启动容器
docker run -it --name vimcentos mycentos-01 /bin.bash
测试-构建tomcat

首先要有jdk 和tomcat

FROM centos:7
MAINTAINER Xu<768212312@qq.com>
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.63.tar.gz /usr/local/
RUN yum -y install vim    
 
ENV MYPATH /usr/local     
WORKDIR $MYPATH
 
ENV JAVA_HOME /usr/local/jdk1.8.0_11    
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/toos.jar
 
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.63    
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.63
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 
EXPOSE 8080 

CMD /usr/local/apache-tomcat-9.0.63/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.63/bin/logs/catalina.out
#制作镜像
docker build -f tomcatdockerfile -t diytomcat .
#启动容器
docker run -it -p 5710:8080 --name tomcat9.0 
-v /home/reflect-tomcat:/usr/local/apache-tomcat-9.0.63/webapps
 -v /home/reflect-tomcat-log:
/usr/local/apache-tomcat-9.0.63/logs diytomcat /bin/bash
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小徐404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值