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:UsersXuAppDataRoamingmarktextimages2022-05-16-20-57-38-image.png?msec=1652705858128)]
构建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



