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的玩法

完结撒花🌸🌸🌸🌸🌸🌸🌸👌

posted @ 2025-05-20 20:00  国家一级冲浪yzk  阅读(105)  评论(0)    收藏  举报