容器数据卷
什么是容器数据卷
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镜像文件的命令参数脚本
构建步骤
-
编写dockerfile
-
docker build构建一个镜像
-
docker run 运行镜像
-
docker push 发布镜像
官方构建方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-woT9nxJ9-1652722075611)(file://C:\Users\Xu\AppData\Roaming\marktext\images\2022-05-16-20-57-38-image.png?msec=1652705858128)]
构建dockerfile
基础
-
每个保留关键字(命令)都必须大写
-
执行顺序由下到上
-
#为注释
-
没一个指令都会创建一个新的镜像层并提交
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