挂载方式一、容器数据卷挂载
- 什么是容器数据卷
数据如果放在容器中,删除容器后,数据就会丢失
我们希望数据库等数据可以存放在本地,容器之间可以有一个数据共享技术,在docker容器中产生的数据同步到本地容器删除后数据不会丢失,这就是数据卷技术,即目录的挂载,将我们容器内的目录挂载到linux上。
总结:容器的持久化和同步操作,容器间也可以数据共享
使用数据卷挂载
docker run -it -v 主机目录:容器目录 容器 /bin/bash
docker run -it -v /home/ceshi:/home centos /bin/bash
查看是否挂载成功:
docker inspect 65f90fb9fda6
测试:
启动并挂载:
1. docker run -it -v /home/zhen:/home centos /bin/bash 启动并挂载
2. cd /home
3. ls
4. 发现容器 /home中没有文件
5.这时候 在本地linux中 cd /home 发现多了一个 文件 zhen
6.容器 touch test.java
7.本地linux:cd zhen 发现也同时创建了一个test.java 文件
mysql挂载实战-数据卷挂载:
注意:安装启动mysql的时候需要配置密码
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
参数:-e:环境配置
启动成功后可以在本地访问到容器中的 mysql
匿名卷:
- 挂载时指定了一个路径,这个路径是容器的路径
- 运行nginx
docker run -d -P --name nginx01 -v /etc/nginx nginx
查看所有的卷 docker volumn ls
发现没有名字,叫匿名卷,因为在 -v后面只加了容器路径- 具名卷:
nginx`docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx`
juming-nginx前面没有斜杠,不是路径,只是一个名字
docker volumn ls 可查看到具体名字,叫具名挂载
查看卷的详情命令:docker volumn inspect juming-nginx
没有指定目录的情况下,都是在/var/lib/docker/volumn/xxx/_data,通过具名挂载可以很快找到目录,建议使用具名挂载
区分匿名挂载,具名挂载和具体路径挂载
匿名挂载 -v 容器路径
具名挂载-v 名称:容器路径
具体路径挂载-v 本地linux路径:容器路径
本地路径以/开头
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
这两种写法是设置了权限的,分别是只读和读写权限,设置了只读权限的,不能通过容器修改内容,只能通过宿主机修改
挂载方式二、Dockerfile挂载
1.Dockerfile就是用了构建docker镜像的构建文件
2.创建过程
1.在/home文件下创建一个文件夹
cd /home
mkdir test-volumn
cd test-volumn 进入文件编辑脚本,通过脚本生成镜像,脚本是一个个命令
vim dockerfile1
2. 脚本:
FROM centos
VOLUME ["volume01","volume2"] //volumn1是挂载的目录
CMD echo "-----end----"
CMD /bin/bash
3.构建
docker build -f /home/test-volumn/dockerfile1 -t zhen/centos .
volume1和volume2是我挂载的目录,在colume1中的操作也会同步到本地linux上,
这个地址在/var/lib/docker/volumn/xxx/_data,可以通过 docker inspect 找到
多个数据卷容器之间如何同步,即 多个mysql数据之间的同步 --volumes-from
通过数据卷技术实现数据共享
1.启动自己写的镜像
docker run -it --name docker01 cb1dc142dbe7
2. docker01上面的数据同步到docker02上,docker01是父容器,叫数据卷容器
docker run -it --name docker02 --volumes-from docker01 cb1dc142dbe7
总结:数据共享,只要有一个容器在使用数据,就算删掉父容器,数据也还在,是拷贝
多个mysql数据的同步
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
Dockerfile
dockerfile 是用来构建docker镜像的文件,可以理解为命令参数脚本
构建步骤:1.写一个dockerfile文件 2.docker build构建 3.运行镜像 4.发布镜像(可以发布到dockerHub或者阿里云镜像仓库)
每个指令都是大写
每个指令都会创建提交一个新的镜像层
#表示注释
执行是从上往下顺序执行的
Dockerfile:构建文件,定义了一切步骤,源代码
DockerImages:通过dockerfile构建生成的镜像,最终发布和运行产品
Docker容器:容器就是镜像运行起来提供服务器
Dockerfile指令学习
- FROM 基础镜像 例:centos
- MAINTAINER 镜像是谁写的 姓名+邮箱
- RUN docker镜像构建的时候需要运行的命令
- ADD 步骤 比如加tomcat到centos中
- WORKDIR 镜像的工作目录
- VOLUME 挂载的目录
- EXPOSE 暴露端口配置
- CMD 指定容器启动的时候要运行的命令 只有最后一个会生效,可被代替
- ENTRYPOINT 指定容器启动的时候要运行的命令 可以追加命令
- ONBUILD 当构建一个被继承 Dockerfile
- COPY 将文件拷贝的镜像中
- ENV 构建的时候设置环境变量
dockerfile实战测试
Docker Hub中99%的镜像都是从这个基础镜像过来的 FROM scratch
,然后配置需要的软件和配置来进行构建
WORKDIR 我希望别人运行我的容器后默认进入的路径
1. mkdir zhen_centos
2. vim mydockerfile
FROM centos //在centos基础上 加vim命令 config命令。做增强版
MAINTAINER wyz<233434545@qq.com> 作者和邮箱
ENV MYPATH /usr/local
WORKDIR $MYPATH //指定工作目录
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80 //暴露端口
CMD echo $MYPATH
CMD echo "====end==="
CMD /bin/bash
3.docker build -f mydockerfile -t my_centos .
查询docker的历史命令docker history 镜像id
,所以平常拿到docker后看人家是怎么弄的
CMD和ENTRYPOINT区别