Docker笔记三:Docker数据卷和DockerFile
参考资料
笔记二之后的Docker内容都参考哔哩哔哩的up主:狂神说Java的Docker视频,在此贴出他的主页,推荐去看看,讲的是真的好
容器数据卷
什么是容器数据卷?先来看看目前Docker容器之间不方便的地方
不方便的数据共享和持久化
- Docker的容器和容器之间数据咋共享啊,我的前台和后台网站的图片和数据库都是共享的啊
- 容器中数据库的数据怎么同步到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 主机目录:容器目录,这个是我们最常用的方式
匿名挂载
匿名挂载就是
- -v 容器目录
- -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就是权限了
- ro : readonly只读
- 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
- 主机上的/home/tomcat/webapps/test 映射容器的 /usr/local/tomcat/webapps/test
- 主机上的/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