容器数据卷
数据都保存在容器中。如果删除容器,数据也会一并丢失
需求:数据持久化
数据卷:容器的持久化和同步操作
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性
一、-v挂载
docker run -it -v 主机目录:容器内目录 镜像名 /bin/bash …(主机目录一般是以 / 开头)
下图以把主机的 /home/ry 和容器内的 /home 做了绑定 为例:

测试1: 在容器内/home目录下新增文件,查看主机的/home/ry目录

测试2: 在主机的/home/ry目录下新增文件,查看容器内/home目录


即:即使容器停止运行或者容器删除,仍然可以实现数据同步,本地的数据卷不会丢失
安装mysql
docker run -d -p 1314:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql666 mysql:5.7

启动成功之后,可以在本地可以访问容器内部(Navicat连接到服务器的1314端口 这个端口和容器内的3306端口映射)

可以新建数据库测试:

删除mysql666容器测试:

挂载到本地的数据卷依旧没有丢失,实现了容器数据持久化功能
.
具名挂载 和 匿名挂载
匿名挂载:-v 容器内的路径
eg:docker run -d -p 1314:8080 --name nginx666 -v /etc/nginx nginx
具名挂载:-v 卷名:容器内的路径
eg:docker run -d -p 1315:8080 --name nginx999 -v juming-nginx:/etc/nginx nginx
一般的挂载是 指定路径挂载:-v 宿主机路径:容器内路径(区别:宿主机的路径一般以 / 开头)

拓展:
改变读写权限-v 容器内的路径:ro (read only只读) -v 容器内的路径:rw (read write可读写)
eg:docker run -d -p 1314:8080 --name nginx02 -v juming-nginx:/etc/nginx:ro nginx表明此路径只能通过宿主机来操作,容器里面无法操作
.
.
.
二、Dockerfile 构建镜像时直接挂载
相关概念:
DockerFile:用来构建镜像的文本文件,定义了一切的步骤,源代码
Dockerlmages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:镜像运行起来提供服务
官网上的镜像文件都是由Dockerfile构建的:

使用docker history 镜像id可以查看镜像变更历史(镜像是如何生成的)
.
.
构建步骤:
编写dockerfile
build将Dockefile构建成为一个镜像 docker build -f dockerfile文件路径 -t 镜像名:版本号 .
run运行镜像docker run -it 镜像id /bin/bash
push发布镜像
.
测试1 挂载数据卷


.
.
测试2 构建升级版centos(增加管理网络的工具和vim)
FROM centos:7
MAINTAINER ry<RENYuuu0603@163.com>
ENV MYPATH /usr/local #环境变量
WORKDIR $MYPATH #设置工作目录 进入docker就进入工作目录(默认为根目录)
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash
构建docker build -f dockerfile2 -t mycentos:1.0 .
运行docker run -it mycentos:1.0 /bin/bash
.
.
FROM # FROM必须是Dockerfile文件中的首条命令,启动构建流程后将会基于该镜像构建新镜像
MAINTAINER # 镜像是谁写的(一般为 姓名+邮箱)
RUN # 镜像构建的时候需要运行的命令
COPY # 复制文件到镜像中
ADD # 复制文件到镜像中(源路径可以是一个URL,Docker会下载这个链接的文件放到目标路径)
WORKDIR # 容器内的镜像工作目录
VOLUME # 挂载的目录
EXPOSE # 为构建的镜像设置监听端口,使容器在运行时监听
CMD # 指定这个容器启动时要执行的命令(如果Dockerfile存在多个CMD指令,则只有最后一个CMD有效)
ENTRYPOINT # 指定这个容器启动时要执行的命令(只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置)
ONBUILD # 当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发
ENV # 构建的时候设置环境变量
注:
1、每个保留关键字(指令)都是必须是大写字母
2、执行是从上到下顺序执行的
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层并提交
.
CMD和ENTRYPOINT区别:
都是让用户指定一个可执行程序, 在container启动后自动启动
在写Dockerfile时, ENTRYPOINT或者CMD命令会自动覆盖之前的ENTRYPOINT或者CMD命令(即只有最后一个生效)
如果Dockerfile既有CMD,又有ENTRYPOINT ,那么CMD将会被当做参数传递给ENTRYPOINT
在docker镜像运行时, 用户也可以在命令指定具体命令, 覆盖在Dockerfile里的命令。但是:
ENTRYPOINT中的参数始终会被使用,CMD中的额外参数可以在容器启动时动态替换掉
eg:Dockerfile中CMD和ENTRYPOINT都是[“ls”,“-a”]时,用docker run 镜像id -l启动,CMD报错(用-l代替了-a),ENTRYPOINT执行生效(追加的命令直接拼接在ENTRYPOINT命令后:-l和ls -a构成ls -al命令)
.
.
测试3 tomcat镜像
准备tomcat压缩包和jdk压缩包(tomcat基于java)


docker build -t diytomcat
FROM centos:7
MAINTAINER ry<RENYuuu0603@163.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u171-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.22.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASS_PATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar`
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.22/logs/cata lina.out
docker run -d -p 8081:8080 --name renyutomcat -v /home/ry/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/ry/build/tomcat/tomcatlog:/usr/local/apache-tomcat-9.0.22/logs diytomcat
遇到的问题:
- 这里我遇编写Dockerfile的时候日志路径写错了

- 造成我无法启动容器(run成功后直接退出 只有
ps -a才可以看到)

docker logs -f 容器ID打印最近的错误日志 得知错误位置 去Dockerfile里把/bin删掉

测试成功:

发布测试:
因为做了数据卷挂载,*不用在容器内发布。在本地编写项目发布即可

// web.xml:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
</web-app>
// index.xml:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
测试成功:

日志也可查看:

发布到DockerHub:


发布到华为云镜像服务:


.
.
.
三、容器之间的挂载 (容器之间的数据共享):把一个容器作为数据卷容器,通过--volumes-from使另一个容器连接

容器之间配置信息的传递
数据卷容器的生命同期持续到没有容器使用为止
参考资料:遇见狂神说

2463

被折叠的 条评论
为什么被折叠?



