day104 dockerfile重点参数--volume
day104 dockerfile重点参数--volume
day104的任务
1. 回顾dockerfile 构建镜像的流程,关键字volume,enterpoint,cmd,expose的作用。
2.构建nginx + centos镜像
3.构建python镜像
4.学习supervisor进程管理工具
5,dockerfile 多阶段的搭建java容器
6,harbor部署
7.容器应用化的案例
volume
volume 定义匿名数据卷,在启动容器时忘记挂载数据卷,会自动的挂载到匿名卷上。
无状态的容器,为了有状态的部署/var/lib/mysql
作用:
避免重要的数据,因容器的重启丢失,这是要丢工作的。
为了避免容器的不断变大,产生大量的数据,容器最终要提交为镜像的模式。
也可以加上 -v的参数,主动的修改。
-v 宿主机:容器
centos+nginx 的dockerfile练习这些参数
- 配置文件
- dockerfile本身
镜像1,没有volume的玩法
1.准备好nginx所需要的配置文件,如yum源的设置,
如nginx.conf
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
2.准备好一个Dockerfile
# 和dockerfile同级的配置文件,ADD添加到容器内。
FROM centos:7.9.2009
RUN rm -rf /etc/yum.repos.d/*
ADD ./*.repo /etc/yum.repos.d/
RUN yum clean all && yum install epel-release -y && yum makecache fast \
&& yum install nginx -y \
&& yum clean all
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
# 检查构建的镜像
docker build -t t1-nginx .
[root@docker-100 yum.repos.d]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
t1-nginx latest da393b8f6de8 25 seconds ago 262MB
# 然后我们启动这个镜像
docker run -d -p t1-nginx
[root@docker-100 yum.repos.d]# docker run -d -p 88:80 t1-nginx
bfb0d42fc57ac8d5a2b148b06466693e21de4f060c6f1caf8aae97f03b16a6cf

我们发现时没权限访问
# 我们来解决这个问题
我们先进容器来看看
docker exec -t -i bfb bash
[root@bfb0d42fc57a /]# cd /usr/share/nginx/html/
[root@bfb0d42fc57a html]# echo "666" > index.html
bash: index.html: No such file or directory
#到这里我们发现这是软连接,他是希望读取。
# 那我就全删掉,自己创建一个index.html
[root@bfb0d42fc57a html]# echo "hello my name is yzk" > index.html

查看容器的存储卷是否有
有卷的话,就会映射在宿主机的xx目录下
保证,容器无状态的变化,容器可以随意地删除,数据都被保留到外
[root@docker-100 ~]# docker inspect bfb | grep -i volumes
"VolumesFrom": null,
"Volumes": null,
# 该方式,数据都在容器里出不来
# 想办法,进入到容器内,把日志都读出来,写道外部的程序,
# 运行容器,添加参数卷在参数 -v
# 这种没有volume参数的镜像,必须手动制定-v才能实现数据外
[root@docker-100 ~]# mkdir /test-nginx/logs
[root@docker-100 ~]# docker run -d -P -v /test-nginx/logs/:/var/logs/nginx/ t1-nginx
87a8a7111c16428dc1a769bb4c0ee1652292d1918a908941fb8fcd1011f1c80c
# 查看该容器的,外部数据挂在信息

这就表示容器内的数据就映射到宿主机上。
给镜像加上存储卷,防止运行时,忘记-v挂载参数
镜像都是分层存储的。
是为了省空间
# VOLUME 这个挂载参数
挂载的是 容器内的目录(重点记下来)
在之前的Dockerfile中加上
VOLUME /var/log/nginx
VOLUME /etc/nginx
[root@docker-100 test-nginx]# cat Dockerfile
FROM centos:7.9.2009
RUN rm -rf /etc/yum.repos.d/*
ADD *.repo /etc/yum.repos.d/
RUN yum clean all && yum install epel-release -y && yum makecache fast \
&& yum install nginx -y \
&& yum clean all
EXPOSE 80
VOLUME /var/log/nginx
VOLUME /etc/nginx
CMD ["nginx","-g","daemon off;"]
## 生成镜像
[root@docker-100 test-nginx]# docker build -t t2-nginx .
## 使用该镜像
[root@docker-100 test-nginx]# docker run -d -P t2-nginx
7256c333b18e6017f222e774f6f03bebd287a9de28cbc9accc8d40a90a31f44e
## 查看挂载情况
[root@docker-100 test-nginx]# docker inspect 725 | jq

# 容器卷的信息,会自动的挂载到宿主机的匿名的目录下,
# 显示,容器内的卷的目录,和宿主机的一个文件夹 ,做的映射关系
"Mounts": [
{
"Type": "volume",
"Name": "4e993e3b004dabb7c0b5d15464439425b242f2164b5396ed241ac9d279de1834",
"Source": "/var/lib/docker/volumes/4e993e3b004dabb7c0b5d15464439425b242f2164b5396ed241ac9d279de1834/_data",
"Destination": "/etc/nginx",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
# 清理,没有容器再用的,废物卷
#清理了30M
[root@docker-200 /var/lib/docker/volumes]#docker volume prune
[root@docker-100 volumes]# ls
25cfdddf6f83f83bb8021361900ce83efdb9313b3e5b1a09ea1e758bd8b9c821
4e993e3b004dabb7c0b5d15464439425b242f2164b5396ed241ac9d279de1834
backingFsBlockDev
f9b0f0aa6530fa0845b9dcc29b23c6c45e431e42c8acf5f831d3faa3fc4d3699
metadata.db
卷的作用,容器内的数据》卷的目录
为了保证数据的持久化


使用卷,他会站空间,所以我们要评估,可以删除的卷
# 查看卷
[root@docker-100 volumes]# docker volume ls
DRIVER VOLUME NAME
local 4e993e3b004dabb7c0b5d15464439425b242f2164b5396ed241ac9d279de1834
local 25cfdddf6f83f83bb8021361900ce83efdb9313b3e5b1a09ea1e758bd8b9c821
local f9b0f0aa6530fa0845b9dcc29b23c6c45e431e42c8acf5f831d3faa3fc4d3699
# 删除废物卷,没用的卷
docker volume prune
# 如果要改为,读写html静态文件资源如何。
1.如果有状态(容器内产生的数据,需要被保留下来)
2.如果时状态(容器内的数据,随便丢)
只需要重建一个容器就好 ,读取之前配置文件,日志,html
# 改配置文件
[root@docker-200 /var/lib/docker/volumes/d3c7e215d2d98deb27809c3d1dc0a0cc5c4538cec2b2f69422e626843e5a03ab/_data]#grep 10011 nginx.conf
listen 10011;
# 日志,1000条
[root@docker-200 /var/lib/docker/volumes/842410bd248397ba59789a1db58ff1e3354b106ac1ab5773fcdbe5f44a8e93ca/_data]#for i in `seq 1000` ;do curl -s 127.0.0.1:49156 -o /dev/null;done
[root@docker-200 /var/lib/docker/volumes/842410bd248397ba59789a1db58ff1e3354b106ac1ab5773fcdbe5f44a8e93ca/_data]#wc -l access.log
1016 access.log
# html也是准备好的
[root@docker-200 /test_nginx/html]#cat index.html
<meta charset=utf8> <h1>一分耕耘一分收获,我宿主机改不了吗</h1>
看看新跑一个容器,能用这些数据吗
# 启动新的容器
docker run --name my-all-nginx -d -p 10011:10011 \
-v /var/lib/docker/volumes/842410bd248397ba59789a1db58ff1e3354b106ac1ab5773fcdbe5f44a8e93ca/_data:/var/log/nginx/ \
-v /var/lib/docker/volumes/d3c7e215d2d98deb27809c3d1dc0a0cc5c4538cec2b2f69422e626843e5a03ab/_data:/etc/nginx/ \
-v /test_nginx/html:/usr/share/nginx/html t2-nginx
这就是存储卷 VOLUME 和 -v的玩法
完结撒花🌸🌸🌸🌸🌸🌸🌸👌
浙公网安备 33010602011771号