容器数据卷
什么是容器数据卷
docker:将应用和环境打包成一个镜像。 但数据?若数据都在容器中,若容器删除,数据就会丢失! 需求:数据可持久化 MySQL容器,删了,删库跑路! 需求:MySQL数据可以存储本地 容器之间可以有一个数据共享的技术! Docker容器中产生的数据,同步到本地!
卷技术!目录的挂在,将容器内的目录,挂在到外部linux文件系统中
功能:容器的持久化和同步操作!容器间也可数据共享!
使用数据卷
1. 使用命令挂载-v [主机目录]:[容器目录]
docker run -it -v [主机目录]:[容器目录] -p ....
- 查看数据卷是否挂在成功
实战:MySQL
数据持久化问题?
docker pull mysql:5.7
#启动
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d \
-v /home/mysql/data:/var/lib/mysql \
--name shared_mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7 \
#测试
启动成功后,开启阿里云服务器安全组。
#进入mysql容器查看是否成功运行
docker exec -it [mysql容器id] /bin/bash
mysql -uroot -ppasswd
>service mysql status
>use mysql
>select host,user from user
- 本地登陆navicat,连接阿里云服务器的mysql容器
- 在navicat创建新的数据库,查看远端Linux本地文件系统与容器中的文件系统更新
显然同步成功
- 关闭并删除容器
发现阿里云linux本地文件系统仍在,故删除容器不会影响外部linux文件
具名和匿名挂载
# 匿名挂载 -v [容器内路径]
docker run -d -p --name nginx01 -v /etc/nginx nginx
# 无需指定容器外路径!
# docker inspect可查看具体映射信息
#具名挂载 -v [卷名]:[容器内路径]
docker run -d -p --name nginx01 -v juming-nginx:/etc/nginx nginx
docker volume ls
DRIVER VOLUME NAME
local juming-nginx
#查看卷
docker volumn inspect juming-nginx
docker inspect [volume_name]效果
设置权限
# -v [容器内路径]:ro 或 rw 改变读写权限
# ro readonly
# rw readwrite
数据卷容器
--volumes-from
1. 新建dockerfile
```dockerfile
dockerfile 1
FROM centos
VOLUME [“volumen01”]
CMD echo “———end———“ CMD /bin/bash
<a name="of7cL"></a>
#### 2. 生成镜像
`docker build -f [Dockerfile文件地址] -t [生成文件名]:[TAG] [镜像存放路径]`<br />`docker build -f ./dockerfile1 -t kylin/centos:0.1 .`
<a name="Ned08"></a>
#### 3. 运行镜像
可观察到volumen01是生成镜像时自动挂载的。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2728415/1628838291728-7c5ce661-2a33-482d-ba6b-69bc614fa9d3.png#align=left&display=inline&height=277&margin=%5Bobject%20Object%5D&name=image.png&originHeight=554&originWidth=802&size=68690&status=done&style=none&width=401)
<a name="7b6gs"></a>
#### 4. 查看数据卷volumen01[匿名挂载]
> docker inspect 查看
可查询到volumen01对应外部环境映射的位置<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2728415/1628838504025-bd1a52d2-594e-49c6-af3e-9590cf4c921a.png#align=left&display=inline&height=151&margin=%5Bobject%20Object%5D&name=image.png&originHeight=301&originWidth=1377&size=33434&status=done&style=none&width=688.5)
<a name="qpOzS"></a>
#### 5. 数据卷容器`--volumns-from`
> 多个mysql同步数据
![image.png](https://cdn.nlark.com/yuque/0/2021/png/2728415/1628838842942-ef0af8ba-bf43-4990-ae2c-d2a57ba5d728.png#align=left&display=inline&height=201&margin=%5Bobject%20Object%5D&name=image.png&originHeight=402&originWidth=831&size=24895&status=done&style=none&width=415.5)
<a name="x37KH"></a>
##### 实例代码
```bash
#运行父容器
[root@iZwz985opgs9ourwuevecmZ _data]# docker run -it --name docker01 kylin/centos:0.1
#运行子容器,继承父容器
[root@iZwz985opgs9ourwuevecmZ _data]# docker run -it \
--name docker02 \
--volumes-from docker01 \
kylin/centos:0.1 \
通过inspect 查询两个容器数据卷挂载信息 可以发现:
两个数据卷在外部Linux挂载环境的位置是相同的!
故数据是同步的!
注意:即使删除了主容器,只要有一个容器在,共享的卷就不会被删除【硬链接!】
结论
- 数据卷容器的生命周期一直持续到没有容器使用为止
- 若主容器挂载到外部环境中【即持久化到了本地】,所有容器均删除后,本地的数据也不会删除
DockerFile
构建步骤
- 编写dockerfile
- docker build
- docker run
- docker push(DockerHub,阿里云镜像库)
Dockerfile命令
CMD # 指定这个容器启动时运行的执行,只有最后一个会生效
ENTRYPOINT # 指定这个容器启动时运行的执行,可追加指令
ONBUILD # 当构建一个被继承的dockerfile时运行,触发指令。
COPY # 类似ADD.将文件拷贝的镜像中
ENV # 构建的时候设置环境变量
实战创建属于自己的centos
参考Docker Hub中centos的dockerfile
- scratch:
创建自己的centos
- 编写dockerfile ```dockerfile FROM centos MAINTAINER kylinmiaojsi@outlook.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
2. 构建及运行镜像
```bash
docker build -f ./myDockerfile -t my_centos:0.1 . #构建镜像
docker run -itd my_centos:0.1
docker attach [镜像id]
显然,镜像内容与我们构建相符
- 查看构建DockerFile
docker history
CMD
和ENTRYPOINT
区别
比较简单,自己查一下吧
- CMD:不可追加
docker run [镜像id] [完整命令]
ENTRYPOINT:
docker run [镜像id] [追加命令或参数]