docker 部署 - 容器部署汇总

目录

一、常用容器运行指令

Docker

Ubuntu 版

Centos 版

MySQL

MongoDB

Redis

RabbitMQ

ElasticSearch

kibana

Nacos

Sentinel

nginx

Minio

Prometheus、Grafana、Node-exporter


一、常用容器运行指令


Docker

Ubuntu 版

1)更新索引

sudo apt update

2)安装必备依赖

sudo apt install apt-transport-https ca-certificates curl software-properties-common

 3)添加密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4)添加稳定软件源

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

5)更新索引

sudo apt update

6)安装 docker

sudo apt install docker-ce

7)启动 docker 并设置开机自启动

sudo systemctl start docker
sudo systemctl enable docker

Centos 版

a)安装依赖环境

yum -y install yum-utils device-mapper-persistent-datalvm2

b)设置下载 Docker 的镜像源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

 c)缓存包信息,提高搜索安装软件速度

yum makecache fast

d)安装 docker

yum install docker-ce docker-ce-cli containerd.io

e)启动 docker 服务

systemctl start docker

f)设置开机自启动

systemctl enable docker

MySQL

这里直接使用 -v 去指定数据卷映射,会将容器内部本来存在的文件覆盖掉,因此这里我们先简单运行一个容器,然后将容器内本来有的 my.conf 文件拷贝出来,再指定 -v 重新启动容器.

a)先简单运行一个容器

docker run --name mysql \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=1111 \
-d mysql:8.0.33

b) 将容器内的 /etc/my.cnf 的文件拷贝到宿主机的 ~/env/mysql/conf/ 目录下

docker cp mysql:/etc/my.cnf ~/env/mysql/conf/

 c)启动容器

情况一:不携带 init.sql

docker run -d -p 3306:3306 \
--name mysql \
--restart=always \
-v ~/env/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v ~/env/mysql/data:/var/lib/mysql \
-v ~/env/mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=1111 \
-e LANG=C.UTF-8 \
-e TZ=Asia/Shanghai \
mysql:8.0.33

情况二:携带 init.sql

docker run -d -p 3306:3306 \
--name mysql \
--restart=always \
-v ~/env/mysql/conf:/etc/mysql \
-v ~/env/mysql/data:/var/lib/mysql \
-v ~/env/mysql/logs:/var/log/mysql \
-v ~/env/mysql/init:/docker-entrypoint-initdb.d \
-e MYSQL_ROOT_PASSWORD=1111 \
-e LANG=C.UTF-8 \
-e TZ=Asia/Shanghai \
mysql:8.0.33

注意:使用 init.sql 文件只有第一次 docker run 才会生效!!!后续修改 init.sql 文件,再 docker restart 是不会生效的!!

MongoDB

a)未持久化部署

docker run -d --name mongo -p 27017:27017 mongo:7.0.16

b)持久化部署

docker run -d --name mongo -p 27017:27017 \
--restart=always \
-v ~/env/mongo/data:/data/db \
-v ~/env/mongo/conf:/data/dataconfigdb \
mongo:7.0.16

Redis

a)未持久化部署:

docker run -itd -p 6379:6379 --name redis redis:7.4.0

b)持久化部署:

如果需要按照 redis.conf 配置运行 redis ,那么需要先下载 redis.conf 模板,地址如下

http://download.redis.io/releases/

找到对应的版本下载 

<think> 我们正在分析使用Dockerfile和脚本文件部署Nginx后出现404错误的原因。404错误表示资源未找到,即Nginx无法找到请求的页面或文件。 根据提供的引用材料,我们可以从以下几个方面进行排查: 1. **Nginx配置文件问题**:检查Nginx配置文件(如nginx.conf)是否正确配置了根目录(root)和索引文件(index)。 2. **静态文件路径问题**:确保Dockerfile中复制静态文件的路径正确,且文件已成功复制到容器内Nginx的默认目录(通常是/usr/share/nginx/html)。 3. **端口映射问题**:检查运行容器时的端口映射是否正确,确保外部访问的端口正确映射到容器内Nginx监听的端口。 4. **环境变量替换问题**:如果使用了环境变量动态生成配置文件(如使用envsubst),需确认环境变量是否正确传递和替换。 5. **构建过程问题**:在多阶段构建中,确保从构建阶段复制产物的路径正确。 下面我们结合引用材料中的具体配置进行分析: 引用[2]中提供了一个多阶段构建的Dockerfile示例: ``` FROM node:latest AS builder ... RUN npm run build # 构建静态文件,生成在dist目录 FROM nginx:1.25-alpine COPY nginx.conf /etc/nginx/nginx.conf COPY --from=builder /app/dist /usr/share/nginx/html # 关键:将构建的dist目录复制到nginx的默认html目录 ``` 如果出现404错误,首先检查: - 构建阶段(builder)生成的静态文件路径是否与COPY指令中的源路径一致(即/app/dist)。 - Nginx配置文件(nginx.conf)中是否配置了正确的根目录。默认情况下,Nginx的根目录就是/usr/share/nginx/html,因此如果配置文件没有修改,则应该可以访问。 但是,如果Nginx配置文件中修改了根目录,则需要确保该配置正确指向了复制的目录。 另外,引用[1]中提到使用环境变量替换配置文件的方案。如果使用了这种方案,需要确保: -容器启动时通过`-e`传递了必要的环境变量(如NGINX_PORT, SERVER_NAME)。 - entrypoint.sh脚本正确执行了envsubst替换,且生成的nginx.conf文件内容正确。 步骤: 1. 进入容器检查配置文件:可以使用`docker exec -it <container_name> cat /etc/nginx/nginx.conf`查看生成的配置文件内容,确认server块中的配置(如监听的端口、server_name、root目录等)是否符合预期。 2. 检查容器内静态文件是否存在:使用`docker exec -it <container_name> ls /usr/share/nginx/html`查看是否有预期的文件(如index.html)。 如果发现配置文件中的根目录设置不正确,或者静态文件不存在,则需要进行调整。 另外,引用[3]中提到了启动容器命令: `docker run -d -p 8080:80 --name my-nginx-container my-nginx` 这里将宿主机的8080端口映射到容器的80端口。因此,访问应该是http://宿主机IP:8080。如果访问时端口错误,也会导致无法访问(但通常是连接失败,而不是404)。如果Nginx监听的不是80端口(比如通过环境变量替换改成了其他端口),那么容器内部的端口也要与映射的端口对应。 总结可能的原因: - **原因1**:静态文件未正确复制到容器内Nginx的根目录。 解决方案:检查Dockerfile中COPY指令的源路径和目标路径,确保构建后的文件被复制到Nginx的默认目录(/usr/share/nginx/html)或配置文件中指定的目录。 - **原因2**:Nginx配置文件中根目录设置错误。 解决方案:检查配置文件,确保`root`指令指向了正确的目录(如`root /usr/share/nginx/html;`)。如果是通过环境变量动态生成的,确保环境变量传递正确且替换成功。 - **原因3**:Nginx配置文件中未设置index指令或index指令指定的文件不存在。 解决方案:在配置文件中添加index指令,如`index index.html;`,并确保在根目录下存在index.html文件。 - **原因4**:容器启动时端口映射错误。 解决方案:检查`docker run`命令中的`-p`参数,确保宿主机端口映射到容器内Nginx实际监听的端口(通过配置文件中的`listen`指令确定)。 为了更具体地分析,我们可以假设一个场景:使用引用[2]的Dockerfile,但访问时出现404。 按照引用[2]的Dockerfile,Nginx的配置文件是通过`COPY nginx.conf /etc/nginx/nginx.conf`复制进去的。因此,我们需要检查这个nginx.conf文件的内容。 一个基本的nginx.conf配置示例(用于服务静态文件)应该是: ``` events {} http { server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; } } } ``` 如果配置中没有指定root和index,或者root路径错误,就会导致404。 如果问题仍然存在,建议按照以下步骤进行调试: 1. 构建镜像时确保没有错误,特别是COPY指令。 2. 运行容器,并进入容器内部检查文件: ```bash docker exec -it <container_name> sh ``` 然后检查: - /etc/nginx/nginx.conf 内容 - /usr/share/nginx/html 目录下的文件 3. 检查Nginx日志: ```bash docker logs <container_name> ``` 或者进入容器查看Nginx的错误日志(通常在/var/log/nginx/error.log)。 4. 如果使用了环境变量替换(如引用[1]),在容器启动后检查替换后的配置文件内容是否正确。 通过以上步骤,通常可以定位到404错误的原因。 </think>### 404错误原因分析及解决方案 根据提供的Docker部署配置,访问Nginx出现404错误可能由以下原因导致(按排查优先级排序): #### 1. **静态资源路径配置错误**(最常见原因)[^2] ```dockerfile COPY --from=builder /app/dist /usr/share/nginx/html ``` - **问题**:前端构建产物`/app/dist`未正确复制到Nginx默认资源目录 - **验证方法**: ```bash docker exec -it <容器名> ls /usr/share/nginx/html ``` - **解决方案**: 1. 确认构建阶段实际产出目录(如可能是`/app/build`而非`/app/dist`) 2. 调整Dockerfile的COPY路径: ```dockerfile COPY --from=builder /app/build /usr/share/nginx/html # 修改为实际目录 ``` #### 2. **Nginx配置文件错误**[^1][^5] ```nginx # nginx.conf 常见问题点 server { listen ${NGINX_PORT:-80}; # 动态端口需验证实际值 location / { root /usr/share/nginx/html; # 必须与COPY路径一致 index index.html; # 确保文件存在 } } ``` - **排查步骤**: 1. 进入容器检查配置: ```bash docker exec -it <容器名> cat /etc/nginx/nginx.conf ``` 2. 确认关键参数: - `root`路径是否匹配COPY目标路径 - `index`指定的文件是否存在于资源目录 - `listen`端口是否匹配容器暴露端口 #### 3. **环境变量替换失败**[^1] ```bash # entrypoint.sh envsubst < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf ``` - **可能问题**: - 未给容器传递必需环境变量(如`NGINX_PORT`) - 模板文件占位符格式错误(应为`${VAR}`) - **验证方法**: ```bash docker run -e NGINX_PORT=8080 ... # 确保传递变量 docker exec <容器名> env | grep NGINX_PORT # 检查容器内变量值 ``` #### 4. **端口映射错误**[^3] ```bash docker run -p 8080:80 ... # 宿主机8080 → 容器80 ``` - **排查点**: - 访问时是否使用正确端口:`http://宿主机IP:8080` - Nginx配置的`listen`指令是否与容器内部端口匹配 - 检查端口冲突:`netstat -tuln | grep 8080` #### 5. **构建产物缺失**[^2] ```dockerfile RUN npm run build # 可能构建失败 ``` - **验证方法**: 1. 检查构建阶段日志: ```bash docker build -t my-nginx . # 观察npm run build输出 ``` 2. 验证构建产物: ```bash # 临时运行构建阶段容器 docker run --rm -it <构建阶段镜像ID> ls /app/dist ``` #### 6. **权限问题**(Alpine镜像常见)[^5] ```dockerfile FROM nginx:1.25-alpine ``` - **解决方案**: ```dockerfile COPY --chown=nginx:nginx --from=builder /app/dist /usr/share/nginx/html ``` ### 快速验证流程 ```mermaid graph TD A[访问404] --> B[检查容器内文件路径] B --> C[确认 /usr/share/nginx/html 内容] C --> D{存在 index.html?} D -->|是| E[检查Nginx配置] D -->|否| F[修正COPY路径] E --> G[检查端口映射] G --> H{端口一致?} H -->|是| I[检查环境变量替换] H -->|否| J[修正-p参数] I --> K[查看生成后的nginx.conf] ``` ### 调试命令汇总 ```bash # 1. 检查容器内文件 docker exec -it nginx-container ls -l /usr/share/nginx/html # 2. 查看生效的Nginx配置 docker exec nginx-container cat /etc/nginx/nginx.conf # 3. 检查环境变量 docker exec nginx-container env # 4. 查看Nginx访问日志 docker exec nginx-container tail -f /var/log/nginx/access.log ``` 通过以上步骤排查,90%的404错误可定位到具体原因。重点优先检查**静态资源路径**和**Nginx配置中的root指令**是否匹配。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈亦康

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

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

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

打赏作者

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

抵扣说明:

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

余额充值