Docker笔记三:Docker数据卷和DockerFile

参考资料

笔记二之后的Docker内容都参考哔哩哔哩的up主:狂神说Java的Docker视频,在此贴出他的主页,推荐去看看,讲的是真的好

狂神说Java

容器数据卷

什么是容器数据卷?先来看看目前Docker容器之间不方便的地方

不方便的数据共享和持久化

  1. Docker的容器和容器之间数据咋共享啊,我的前台和后台网站的图片和数据库都是共享的啊
  2. 容器中数据库的数据怎么同步到linux主机上

以上两个问题,很不方便,所以容器数据卷可以解决这些数据的问题

例如我的mysql也是使用docker容器运行的,那我的网站产生的数据都在mysql容器里面

万一某一天谁不小心把mysql这个容器删除了,那我的数据岂不是全没了????

真删容器跑路

所以数据这一块,基本都是数据库这里,我们需要使用容器数据卷,也就是把容器中的mysql之类的数据库,把数据地址挂载到linux主机上,实现数据的持久化,这样就安全多了

容器数据卷命令

使用-v来挂载,-p都知道吧暴露的主机端口:软件的默认端口,-v也是一样

#运行容器的时候直接使用数据卷挂载
docker run -v 主机目录:容器目录 .......

使用容器数据卷使Mysql数据挂载到主机

#mysql的配置文件
/etc/mysql/conf.d
#mysql的数据
/var/lib/mysql

使用的命令还是run的时候起效的

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql

已经启动的Mysql可以使用 待补充

具名挂载和匿名挂载

先回顾一下挂载, -v 主机目录:容器目录

具名挂载

具名挂载就是-v 主机目录:容器目录,这个是我们最常用的方式

匿名挂载

匿名挂载就是

  1. -v 容器目录
  2. -v 卷名:容器目录

第一种是没有直接指定我的主机目录,相当于让Docker自动给我分配了主机目录

第二种也是没有指定主机目录,但是我起了个名字,还是让Docker自动给我分配了主机目录

注意,起名字的时候不要带斜杠 vae是名字 /vae就是目录了

这就是匿名挂载

可以使用

docker volume ls #查看所有的挂载
docker volume inspect #查看挂载的具体信息

通过查看可以发现,在使用匿名挂载的情况下,Docker自动分配的主机目录都是在

/var/lib/docker/volumes/.....

下面的

数据卷的权限

docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d:ro
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d:rw

在容器目录后面加冒号加ro或者rw就是权限了

  1. ro : readonly只读
  2. rw : read write可读可写

数据卷实战一:tomcat webapps和log映射

拉取一个tomcat镜像,然后来使用数据卷映射一下webapps文件夹和logs文件夹,映射到我们的主机上的home目录下

这样我们以后发布的时候直接发布到linux主机上即可,容器内也会有这些文件

docker run -d -p 8080:8080 --name tomcat -v /home/tomcat/webapps/test:/usr/local/tomcat/webapps/test  -v /home/tomcat/logs/:/usr/local/tomcat/logs tomcat
  1. 主机上的/home/tomcat/webapps/test 映射容器的 /usr/local/tomcat/webapps/test
  2. 主机上的/home/tomcat/logs/ 映射容器的 /usr/local/tomcat/logs

我们新建一个web.xml和index.jsp在主机上的/home/tomcat/webapps/test

web.xml

 <?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
  </web-app>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>shuyunquan</title>
</head>
<body>
Hello World!<br/>
蜀云泉
    
<%
System.out.println("Hello,我是蜀云泉 !");
%>
</body>
</html>

然后直接运行 http://192.168.28.128:8080/test/ 换成你们自己的ip + 8080/test

可以看到访问成功

我们也可以进入到tomcat容器里面

docker exec -it tomcat bash

然后进入到webapps/test下面,创建一个文件啥的,你可以看到主机上的test文件夹也是有的,这两个地方通过我们的数据卷同步了

DockerFile文件

编写DockerFile

先熟记指令,必须是大写,不能写成小写

FROM            #指定基础镜像
MAINTAINER      #镜像的作者,一般是 姓名+邮箱
RUN             #运行镜像
ADD		#添加依赖内容,例如我这个镜像需要tomcat,就ADD一个tomcat
COPY		#类似ADD,讲文件内容拷贝到镜像中
WORKDIR 	#设置当前的工作目录
VOLUME		#挂载目录,和上面的工作目录不一样
EXPOSE		#暴露端口,不然run的时候你得-p指定暴露,这里写了就不需要-p
CMD		#指定容器运行时需要运行的命令,会被替换
ENTRYPOINT	#指定容器运行时需要运行的命令,会被追加
ONBUILD         #继承DockerFile的时候触发指令
ENV		#构建的时候设置环境变量

Docker build 构建镜像

docker build -t mycentos .

Docker run 运行镜像

docker run -d -p 80:80 --name xxx 镜像Id

Docker push 发布镜像

发布到DockerHub

首先得注册一个账号,然后

#登录,回车输密码
docker login -u vae
#发布镜像到Dockerhub,带上自己的名字和镜像加版本号
docker push vae/mytomcat:1.0

但是有一个问题,DockerHub毕竟在国外,速度可能有时候还是很慢,可以选择发布阿里云

发布到阿里云

注册一个阿里云账号,然后搜索容器镜像服务,点进来之后新建命名空间,注意,命名空间最多只能建立3个

然后建立镜像仓库,比如我建立的是redis镜像仓库

然后下一步,选择本地仓库即可

操作阿里云讲的很清楚,你点击创建的镜像仓库会有一些基础的文档,很详细了

$ sudo docker login --username= 
$ sudo docker tag [ImageId] //:[镜像版本号]
$ sudo docker push //:[镜像版本号]

DockerFile生成新的Centos镜像,包含vim,网络基础组件

Docker下载的默认的CentOS是精简版的,没有vim,没有ll,没有ifconfig

可以写一个DockerFile生成一个新的CentOs镜像,把这些都加进去,如下

FROM centos
MAINTAINER  Vae<shuyunquan@qq.com>

ENV MYPATH /user/local  #设置环境变量为/user/local
WORKDIR $MYPATH         #设置工作目录为/user/local

#安装vim和网络的基础组件,比如ifconfig
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

执行此DockerFile

docker build -t mycentos .

查看镜像生成的步骤

docker history 镜像Id
原文地址:https://www.cnblogs.com/yunquan/p/12953766.html