Linux进阶 | Docker部署nginx的web服务,VOLUME的使用详解,实现数据持久化!

本文介绍了Docker部署nginx的过程,重点解析了数据持久化问题,通过volume实现容器数据的持久存储,避免容器重启或删除导致数据丢失。文章详细讲解了volume的概念、常用命令以及两种挂载volume的方法,还提供了实战练习题。

  创作不易,来了的客官点点关注,收藏,订阅一键三连❤😜  


前言

运维之基础——Linux。我是一个即将毕业的大学生,超超。如果你也在学习Linux,不妨跟着萌新超超一起学习Linux,拿下Linux,一起加油,共同努力,拿到理想offer!


系列文章

Linux进阶 | 2万字总结最详细的Docker的安装、底层隔离机制和简单使用!建议收藏,持续更新❤

Linux | 详解系统监控和常用命令(top free dstat)

Linux 超超讲解SSH的原理与SSH的实现!建议收藏❤

Linux 万字总结用户与组的权限那些事儿!建议收藏!


概述

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。本期内容为Docker第二期,通过本期内容将会掌握docker的如何创建容器、容器之间的网络连接、如何实现容器的数据持久化以及volume的使用。


目录

前言

概述

超超Docker学习思维导图

云服务(cloud server)

云计算(cloud computing)

nginx的初探

nginx的安装和web服务的部署

yum方式安装

使用docker启动nginx web服务

容器之间网络连接

容器的数据保存——数据持久化

容器的结构有什么问题?

容器的结构问题如何解决?

容器的数据如何保存?

正常停止容器,容器里的数据会丢失吗?

volume(数据卷)

volume是什么?

volume的常用命令

实现volume挂载的两种方法

方法一:-v

方法二:--mount

练习

练习一:volume练习题

练习二:创建centos和Ubuntu镜像的容器


超超Docker学习思维导图

Docker思维导图将持续更新,欢迎大家订阅Linux栏目!


云服务(cloud server)

Iass(基础设施即服务):给其他个人或企业提供虚拟机(cpu,内存,网卡等)。(卖云服务器)

Pass(平台即服务):云平台对外提供某个软件的服务,例如数据库平台,对外提供数据库服务(卖功能)

Saas(软件即服务):提供一种软件。(卖软件)

Baas:区块链服务


云计算(cloud computing)

云计算的好处:节约成本,集中力量做事情,集中调度

openstack :开源且免费的云计算软件,将多台服务器的资源整合,然后再分配,分配成一个个虚拟机。

公用云:公开给所有人(个人、企业、等)可以购买并使用的云。例如阿里云、谷歌云、腾讯云。

b2b:business to business 企业和企业之间做业务

b2c:business to sustomer 企业与个人做业务

私有云:只是自己使用,不对外公开的云。例如阿里云,腾讯云,华为云,ucloud,七牛云等。

混合云:一部分是公用云,另外一部分是私有云。不同业务使用不同的云,但是云之间有联系。

云原生:对于k8s而言,k8s是docker,集群容器的编排工具,K8s是用来管理不同机器上的docker容器。


nginx的初探

Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。


nginx的安装和web服务的部署

yum方式安装

1.yum命令安装

[root@docker ~]# yum install nginx -y

2.执行并查看nginx进程

[root@docker ~]# systemctl start nginx
[root@docker ~]# ps aux|grep nginx
root      347450  0.0  0.0  12324  1056 pts/0    S+   22:59   0:00 grep --color=auto nginx

3.关闭防火墙并设置开机不启动

[root@docker ~]# service firewalld stop

Redirecting to /bin/systemctl stop firewalld.service

[root@docker ~]# systemctl disable firewalld

Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

[root@docker ~]# getenforce

Enforcing

4.编辑一个网站,编辑好后直接在网站输入IP地址即可进入编辑好的页面

[root@docker ~]# cd /usr/share/nginx/html/

[root@docker html]# vim index.html

[root@docker html]# cat index.html

<html>

<head>

<title>chaochao</title>

</head>

<body>

<p>name:chaochao</p>

<p>sex:male<
<think>我们正在讨论如何使用`docker run`命令中的`-v`参数来挂载卷以运行Nginx容器。根据引用[1][2][3],用户提供了多个使用`-v`挂载卷的示例。现在,我将详细解释`-v`参数的使用方法。 ### 1. `-v`参数的基本作用 `-v`(或`--volume`)参数用于将主机上的目录(或文件)挂载到容器内部,或者使用Docker管理的卷(volume)挂载到容器内部。这样做的主要目的是: - **数据持久化**:容器内的数据在容器停止或删除后不会丢失,因为数据存储在主机上。 - **配置共享**:可以将主机上的配置文件挂载到容器中,方便修改配置而无需重新构建镜像。 - **日志收集**:将容器内的日志目录挂载到主机,便于查看和分析日志。 ### 2. `-v`参数语法格式 基本语法为: ```bash -v <主机路径>:<容器路径>[:<选项>] ``` - `<主机路径>`:主机上的绝对路径。 - `<容器路径>`:容器内的绝对路径。 - `<选项>`:可选,指定挂载方式,如`ro`(只读)、`rw`(读写)等,默认为`rw`。 ### 3. 使用示例(以Nginx容器为例) 参考引用[1]和[3]中的Nginx容器启动命令,我们来看几个挂载点: #### 示例1:挂载HTML目录(只读) ```bash -v /usr/local/nginx/html/:/usr/share/nginx/html:ro ``` - 将主机目录`/usr/local/nginx/html/`挂载到容器内的`/usr/share/nginx/html`。 - `ro`表示容器内对该目录只有只读权限,这样Nginx可以读取网页文件,但不会修改它们(增强安全性)[^1]。 #### 示例2:挂载配置文件(只读) ```bash -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf:ro ``` - 将主机上的`nginx.conf`配置文件挂载到容器内的对应位置。 - `ro`确保容器不能修改配置文件(但Nginx通常只需要读取配置)[^1]。 #### 示例3:挂载日志目录(读写) ```bash -v /usr/local/nginx/logs/:/var/log/nginx/:rw ``` - 将容器内的日志目录`/var/log/nginx/`挂载到主机的`/usr/local/nginx/logs/`目录。 - `rw`(默认)允许容器写入日志,这样日志文件会持久化到主机上[^1][^3]。 #### 示例4:挂载多个目录 引用[3]中的命令: ```bash docker run --privileged -it -d --name nginx -p 80:80 \ -v /lnmp/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /lnmp/nginx/conf/conf.d:/etc/nginx/conf.d \ -v /lnmp/nginx/html:/usr/share/nginx/html \ -v /lnmp/nginx/logs:/var/log/nginx nginx:1.18.0 ``` - 这里挂载了多个目录:配置文件目录(`conf.d`)、HTML目录、日志目录。 - 没有指定权限选项,默认为读写(`rw`)[^3]。 ### 4. 注意事项 1. **路径必须存在**:运行命令前,确保主机上的目录或文件已经存在(否则Docker会自动创建目录,但不会创建文件)。 2. **权限问题**:如果容器内的进程没有足够的权限访问挂载的目录,可能会导致启动失败。可以通过调整主机目录权限或使用`--privileged`参数(如引用[3])解决。 3. **只读挂载**:对于不需要修改的数据(如配置文件、静态网页),建议使用`ro`选项,提高安全性。 4. **卷(Volume)与绑定挂载(Bind Mount)**:`-v`既可以挂载主机目录(绑定挂载),也可以挂载Docker卷(如`-v my-volume:/data`)。卷由Docker管理,通常更安全且易于备份。 5. **覆盖容器内原有文件**:挂载时,容器内目标路径下的原有内容会被主机目录内容覆盖(如果主机目录为空,则容器内对应目录也会变空)。 ### 5. 完整命令示例 结合以上内容,一个典型的Nginx容器启动命令如下: ```bash docker run -d --name my-nginx \ -p 80:80 \ -v /host/path/html:/usr/share/nginx/html:ro \ -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /host/path/logs:/var/log/nginx \ nginx:latest ``` - `-d`:后台运行容器。 - `--name my-nginx`:为容器命名。 - `-p 80:80`:将容器的80端口映射到主机的80端口。 - 挂载了三个目录:HTML(只读)、配置文件(只读)、日志(读写)。 ### 6. 验证挂载 启动容器后,可以使用以下命令检查挂载是否成功: ```bash docker inspect my-nginx ``` 在输出的`Mounts`部分,可以看到挂载详情。 通过以上步骤,您可以灵活使用`-v`参数管理Nginx容器的数据[^1][^2][^3]。 §§相关问题§§ 1. 如何查看Docker容器中挂载的卷是否生效? 2. Docker数据卷(Volume)和绑定挂载(Bind Mount)有什么区别? 3. 如何备份和恢复Docker容器中挂载的数据?</think>### Docker 中 `-v` 参数的使用方法详解 `-v`(或 `--volume`)参数用于在 Docker 容器和主机之间挂载目录或文件,实现**数据持久化**和**配置共享**。以下是基于引用内容的完整使用方法: --- ### 一、基本语法 ```bash -v <主机路径>:<容器路径>[:权限] ``` - **主机路径**:物理机上的绝对路径(需提前创建) - **容器路径**:容器内部的绝对路径 - **权限**(可选): `ro`(容器只读)或 `rw`(读写,默认值) --- ### 二、核心使用场景(以 Nginx 为例) #### 1. 挂载配置文件(防止容器删除后配置丢失) ```bash # 将主机上的 nginx.conf 挂载到容器内 -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf:ro ``` - 容器路径 `/etc/nginx/nginx.conf` 是 Nginx 的主配置文件[^1][^3] - `ro` 表示容器内配置文件为**只读**(避免误修改) #### 2. 挂载网页文件目录 ```bash # 挂载 HTML 目录(容器可读写) -v /usr/local/nginx/html:/usr/share/nginx/html:rw ``` - 容器路径 `/usr/share/nginx/html` 是 Nginx 默认网站根目录[^1][^3] - `rw` 允许容器修改文件(如动态生成内容) #### 3. 挂载日志目录(持久化日志) ```bash # 将容器日志保存到主机 -v /usr/local/nginx/logs:/var/log/nginx ``` - 容器路径 `/var/log/nginx` 是 Nginx 的日志目录[^1][^3] - 主机可随时查看日志:`tail -f /usr/local/nginx/logs/access.log` #### 4. 挂载多个目录(完整示例) ```bash docker run -d --name my-nginx \ -p 80:80 \ -v /host/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /host/html:/usr/share/nginx/html:rw \ -v /host/logs:/var/log/nginx \ -v /host/ssl:/etc/nginx/ssl:ro \ nginx:latest ``` > ✅ 提示:主机目录需提前创建(如 `mkdir -p /host/{html,logs,ssl}`) --- ### 三、关键注意事项 1. **权限控制** - 敏感目录(如配置、证书)建议用 `:ro`(只读)[^1] - 日志或数据目录可用 `:rw`(读写) 2. **路径映射规则** - 主机路径不存在时:**自动创建目录**(但不会创建文件) - 容器路径非空时:**主机目录会覆盖容器内目录** 3. **目录权限问题** 若容器进程无写权限,需在主机调整目录权限: ```bash chmod -R a+rw /host/logs # 允许容器写入日志 ``` 4. **卷 vs 绑定挂载** - `-v` 属于**绑定挂载**(直接操作主机文件系统) - 替代方案 `--mount` 语法更明确(推荐生产环境使用): ```bash --mount type=bind,source=/host/html,target=/usr/share/nginx/html ``` --- ### 四、验证挂载是否成功 1. 进入容器检查文件: ```bash docker exec -it my-nginx ls /etc/nginx/nginx.conf ``` 2. 查看挂载详情: ```bash docker inspect my-nginx | grep Mounts -A 20 ``` 3. 测试配置修改: ```bash # 修改主机配置文件 echo "worker_processes 8;" >> /host/nginx.conf # 重启容器生效 docker restart my-nginx ``` > ⚠️ 警告:避免挂载系统关键路径(如 `/etc`),可能导致容器崩溃[^1]。 --- ### 五、典型错误解决方案 | 错误现象 | 原因 | 修复方法 | |---------|------|---------| | `Error: Config file not found` | 主机配置文件路径错误 | 检查主机路径是否存在 | | `Permission denied` | 容器用户无权访问目录 | 主机执行 `chmod o+rx /host/path` | | 容器启动后配置未更新 | 挂载权限为 `ro` 但主机修改了文件 | 重启容器:`docker restart 容器名` | 通过 `-v` 挂载,可实现配置与数据分离,确保容器重建时不丢失关键信息[^1][^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chaochao️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值