Docker进阶

134 阅读5分钟

一、容器数据卷

容器的持久化和同步操作

将容器内的数据同步至主机中,故而即便容器的数据库被删除,也不会出现数据丢失的现象

可以理解为一种同步机制,将容器内部的数据同步到容器外的指定位置,亦可以在容器间进行同步操作

方式一:直接使用命令挂载 -v docker run -it -v 主机目录:容器内目录

例如在主机home目录下的test文件用来接收容器内的home目录下的内容 docker run -it -v /home/test:/home centos /bin/bash 查看容器内的详细内容 docker inspect [id] 'Source'为主机地址,'Destination'为容器内的地址 image.png

当在容器内的home目录下创建一个文件,主机内对应的位置也会出现该文件

image.png

image.png

注:即便容器关闭,在主机对应的地址修改数据,依旧会被同步

同步操作,双向绑定

优点:以后需要修改时只需在服务器修改即可,不必进入容器中

二、实战:安装MySQL

拉取mysql

docker search mysql
docker pull mysql:5.7

官方测试的设置密码

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

运行 映射端口 挂载mysql中conf的内容 挂载数据 设置密码 设置别名

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
-d      后台运行
-p      端口映射
-v      数据卷挂载
-e      环境配置(配置了密码)
--name  容器名字

运行起来后,可以在本地尝试连接该数据库,注意端口和ip 注:容器即便是被删掉,同步至本地的数据依旧还存在。这便是容器数据库持久化功能 匿名挂载:在使用 -v 时,只写了容器内的路径,没有写主机的路径

例:docker run -d --name nginx01 -v /etc/nginx nginx

docker valume ls

image.png

具名挂载

image.png

如何区别 匿名、具名、指定路径挂载

image.png

容器的读写

image.png

三、初识dockerfile

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

通过脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令也是一层一层的

创建一个文件里面写脚本 vim dockerfile01

# 脚本指令
FROM centos

VOLUME ["volume01","volume02"]   挂载卷(-v的全称),容器内的路径为引号内的内容

CMD echo "===end==="             完成后输出

CMD /bin/bash                    默认走bash控制台

手动创建一个镜像(songxh/centos),生成镜像会自动挂载(因为脚本) docker build -f dockerfile01 -t songxh/centos .

进入该镜像,发现脚本中声明的数据卷目录便在该镜像中

image.png image.png

image.png

进入卷目录,创建一个文件

image.png

在容器外查看容器详细信息, Source对应的便是容器外挂载的目录(匿名挂载) docker inspect 3186757120c7

image.png

可以发现,在容器外挂载的目录下也会同步的出现一个文件

image.png

四、多个mysql实现数据同步

创建父容器,并创建子容器绑定到父容器上

docker run -it --name docker01 f7c768c60e10

docker run -it --name docker02 --volumes-from docker01 f7c768c60e10  绑定docker01

docker run -it --name docker03 --volumes-from docker01 f7c768c60e10

此时在docker01中创建一个文件,会发现在docker02中也对出现对应的文件

image.png

image.png

可以发现,只要以该种方式在同一个镜像下创建的多个容器,它们的数据是同步的

注:即便是父容器被删除,子容器中的数据依旧存在。只要还有一个容器在使用该数据,数据就不会被丢失

image.png

实现多个数据库间的数据同步

image.png

结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止;一旦数据持久化至本地,本地的数据是不会被删除了

五、构建docker镜像

初步了解指令

大致步骤

image.png

dockerfile创建过程

image.png

image.png

dockerfile的指令

FROM         基础镜像,一切从这里构建
MAINTAINER   镜像是谁写的(姓名+邮箱)
RUN          docker镜像构建时需要运行的命令
ADD          添加内容,例 加tomcat、jdk等
WORKDIR      镜像的工作目录,例:/bin/bash
VOLUME       挂载卷的目录
EXPOSE       暴露端口配置,类似 -p
CMD          指定容器启动时要运行的命令,只有最后一个会生效,且可被替代
ENTRYPOINT   指定容器启动时要运行的命令,可以直接追加命令
ONBUILD      当构建一个被继承 dockerfile 这个时候就会运行该指令。触发指令
COPY         类似add,将文件拷贝到镜像中
ENV          构建时设置环境变量

实战:构建一个centos

编写dockerfile文件

image.png 当进入该镜像后,便会直接在MYPATH工作路径下

通过文件构建一个镜像

docker build -f mydockerfilecentos -t mycentos:0.1 .
构建一个名叫  mycentos:0.1 的镜像

出现success即完成

image.png

测试运行 docker run -it ccb329f3ca19

image.png

这是官方的centos镜像可以对比

image.png

实战:构建一个tomcat镜像

准备镜像文件 tomcat压缩包、jdk压缩包

image.png

编写dockerfile文件,官方命名:Dockerfile,build时会自动寻找这个文件,就不需要-f来指定了

image.png 注:22年后,需要将FROM centos 改为 FROM centos:7;jdk版本应该和压缩包对应,图中就有错误,正确的应该是 jdk1.8.0_171

构建镜像 docker build -t diytomcat .

注:因为‘Dockerfile’是很官方的名字,所有不需要 -f

运行该镜像创建一个容器,并进行挂载

docker run -d -p 9090:8080 --name songxhtomcat -v /home/songxh/tomcat/test:/usr/local/apache-tomcat-7.0.57/webapps/test -v /home/songxh/tomcat/tomcatlogs/:/usr/local/apache-tomcat-7.0.57/logs diytomcat

在容器外查看是否成功(出现html代码即可)

curl localhost:9090

因为挂载,此时写项目就可以在容器外的test文件下写

创建WEB-INF,配置web.xml

image.png

image.png 失败了,跳过。。。

六、总结

image.png