Docker进阶1

容器数据卷

数据都保存在容器中。如果删除容器,数据也会一并丢失
需求:数据持久化
数据卷:容器的持久化和同步操作
卷就是目录或文件,存在于一个或多个容器中,由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命令后:-lls -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使另一个容器连接

在这里插入图片描述
容器之间配置信息的传递
数据卷容器的生命同期持续到没有容器使用为止

                                                                    参考资料:遇见狂神说
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值