Docker
快速入门
卸载旧版
首先如果系统中已经存在旧的 Docker
,则先卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
配置 Docker 的 yum 库
首先要安装一个 yum
工具
yum install -y yum-utils
安装成功后,执行命令,配置 Docker
的 yum
源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker
最后,执行命令,安装 Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动和校验
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
配置镜像加速
这里以阿里云镜像加速为例。
注册阿里云账号
首先访问阿里云网站:
注册一个账号。
开通镜像服务
在首页的产品中,找到阿里云的 容器镜像服务:
点击后进入控制台:
首次可能需要选择立刻开通,然后进入控制台。
配置镜像加速
找到镜像工具下的镜像 加速器:
页面向下滚动,即可找到配置的文档说明:
具体命令如下:
# 创建目录
mkdir -p /etc/docker
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
配置 Docker 自启动
默认情况下,每次重启虚拟机我们都需要手动启动 Docker
和 Docker
中的容器。通过如下命令可以实现开机自启:
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
创建容器
部署MySQL
首先,我们利用 Docker
来安装一个 MySQL
软件,大家可以对比一下之前传统的安装方式,看看哪个效率更高一些。
如果是利用传统方式部署 MySQL
,大概的步骤有:
- 搜索并下载
MySQL
安装包 - 上传至
Linux
环境 - 编译和配置环境
- 安装
而使用 Docker
安装,仅仅需要一步即可,在命令行输入下面的命令(建议采用CV大法):
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
运行效果如图:
MySQL
安装完毕!通过任意客户端工具即可连接到 MySQL
.
命令解读
利用 Docker
快速的安装了 MySQL
,非常的方便,不过我们执行的命令到底是什么意思呢?
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
解读:
docker run -d
:创建并运行一个容器,-d
则是让容器以后台进程运行--name mysql
: 给容器起个名字叫mysql
,你可以叫别的-p 3306:3306
: 设置端口映射。- 容器是隔离环境,外界不可访问。但是可以将宿主机的端口映射到容器内的端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
- 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
- 格式:
-p 宿主机端口:容器内端口
,示例中就是将宿主机的3306映射到容器内的3306端口
-e TZ=Asia/Shanghai
: 配置容器内进程运行时的一些参数- 格式:
-e KEY=VALUE
,KEY和VALUE都由容器内进程决定 - 案例中,
TZ=Asia/Shanghai
是设置时区;MYSQL_ROOT_PASSWORD=123
是设置MySQL默认密码
- 格式:
mysql
: 设置镜像名称,Docker会根据这个名字搜索并下载镜像- 格式:
REPOSITORY:TAG
,例如mysql:8.0
,其中REPOSITORY
可以理解为镜像名,TAG
是版本号 - 在未指定
TAG
的情况下,默认是最新版本,也就是mysql:latest
- 格式:
镜像的名称不是随意的,而是要到 Docker镜像仓库 中寻找
镜像运行时的配置也不是随意的,要参考镜像的帮助文档,这些在镜像仓库或者软件的官方网站中都能找到。
如果我们要安装其它软件,也可以到镜像cang'k中寻找对应的镜像名称和版本,阅读相关配置即可。
镜像
下载镜像
# 下载最新版本
docker pull mysql
# 下载指定版本
docker pull mysql:8.0.27
如果镜像后面不加版本号,则为 letest
表示最新版本
构建镜像
docker build -t 镜像名称 .
# 如果Dockerfile在上一级目录中
docker build -t 镜像名称 -f ../Dockerfile .
-t
表示指定镜像名称
-f
表示指定 Dockerfile
路径,如果在当前目录中可以省略 -f
删除镜像
docker rmi 镜像名称
保存镜像
将镜像保存到本地:方便备份、离线使用、共享和节省下载时间
# docker save -o 镜像包名 镜像名称
docker save -o mysql.tar mysql
# 也可以将镜像保存到指定位置
docker save -o /root/images/mysql.tar mysql
导入镜像
# docker load --input 镜像名
docker load --input mysql.tar
查看镜像
查看宿主机中下载的所有镜像
docker images
提交镜像
用于将镜像推送到 Docker
官方仓库中
docker push
清理镜像
一键清理这些没有打标签的镜像:docker image prune -a
root@iZ2ze29609wbuhm5sfl1yqZ:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
thrive-blog latest 93db21024f24 11 days ago 1.72GB
<none> <none> 0d4dcf860f31 12 days ago 1.72GB
<none> <none> 99483d7c6634 12 days ago 1.72GB
<none> <none> 7dfb389e9b0f 13 days ago 1.72GB
<none> <none> f2cec4b759e9 13 days ago 1.72GB
<none> <none> 031ec4192cc0 2 weeks ago 1.72GB
<none> <none> c4c06bafdf76 4 weeks ago 1.72GB
<none> <none> 74c03be684a3 4 weeks ago 1.55GB
<none> <none> ff7c7ee472a6 5 weeks ago 1.55GB
<none> <none> d70fd618b14d 5 weeks ago 1.55GB
<none> <none> fdc350f27a75 5 weeks ago 1.55GB
<none> <none> e9e50e71370f 5 weeks ago 1.58GB
<none> <none> 86d46b004bfa 5 weeks ago 1.58GB
<none> <none> 5290edf031f7 5 weeks ago 1.58GB
<none> <none> bf6da9e495a4 5 weeks ago 1.33GB
<none> <none> 0126528c7c4e 5 weeks ago 1.58GB
<none> <none> 5c63ec3adb6d 5 weeks ago 1.58GB
nginx latest 7f553e8bbc89 7 weeks ago 192MB
清理镜像缓存
docker builder prune
容器
运行并创建容器
# docker run -d --name 容器名称 -p 宿主机端口:容器端口 镜像名称
docker run -d --name nginx -p 80:80 nginx
docker run -d --name thrivex-blog -p 9001:9001 -e NEXT_PUBLIC_PROJECT_API=https://api.liuyuyang.net/api thrivex-blog
查看容器
查看所有容器
docker ps -a
查看运行中的容器
docker ps
启动容器
docker start 容器名称
停止容器
docker stop 容器名称
重启容器
docker restart 容器名称
删除容器
删除停止状态的容器
docker rm 容器名称或ID
强制删除正在运行的容器
docker rm -f 容器名称或ID
进入容器
docker exec -it <容器ID或容器名称> bash
查看容器日志
docker logs 容器名称
查看容器信息
docker container inspect 容器名称
不过一般使用以下命令查看容器的详细信息,因为该方法不仅可以查看容器的,并且还能查看镜像的详细信息
docker inspect 容器名称
如果容器与镜像重名,那么默认优先查看的是容器详细信息
执行容器内的命令
在指定容器执行对应的命令
docker exec 容器名 对应的命令
示例: 查看 thrive
容器内的文件列表
docker exec thrive ls
拷贝容器内的文件
docker cp 容器名:容器文件路径 本地文件路径
示例: 拷贝 mysql
容器内的 thrive_backup.sql
文件到本地 ./ThriveX.sql
docker cp mysql:./thrive_backup.sql ./ThriveX.sql
网络
在 Docker 中使用网络是为了实现容器之间的通信和与外部网络的连接。网络在 Docker 中的应用场景非常广泛,比如容器间通信、多主机通信、与外部网络的连接
默认情况下每个容器都有一个虚拟的网络IP,但值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,从而导致连接失败。所以可以借助 Docker
网络来解决这个问题,只要在一个网络中,多个容器之间就能互相访问。下面是网络的常用命令
创建网络
docker network create 网络名称
删除网络
docker network rm 网络名称
清除网络
清除所有未使用的网络
docker network prune
连接网络
docker network connect 网络名称 容器名称
# 也可以通过--alias给网络取个别名
docker network connect 网络名称 容器名称 --alias 网络别名
断开网络
docker network disconnect 网络名称 容器名称
查看网络信息
docker network inspect 网络名称
查看所有网络
docker network ls
多容器互相访问
只要多个容器在同一个网络中就能实现互相访问,比如 MySQL
与 Thrive
容器的网络都为 lyy
,那么他们都可以连接 lyy
这个网络
# 直接通过虚拟机IP连接
SQLALCHEMY_DATABASE_URI = 'mysql://root:123@192.168.92.140:3306/thrive'
# 通过lyy网络的IP连接
SQLALCHEMY_DATABASE_URI = 'mysql://root:123@172.18.0.1:3306/thrive'
# 通过容器的IP连接
SQLALCHEMY_DATABASE_URI = 'mysql://root:123@172.18.0.2:3306/thrive'
# 通过容器名连接(推荐)
SQLALCHEMY_DATABASE_URI = 'mysql://root:123@Mysql:3306/thrive'
上面四种方式我们更推荐使用容器名连接,因为这样的话我们不需要知道网络的IP多少,不管他怎么变,都是这个容器的IP
数据卷
为什么要使用数据卷?
使用数据卷可以实现容器和宿主机之间的数据共享和持久化,并且方便在宿主机上修改容器中的数据,提高开发和部署的便利性。
典型应用场景
- 修改容器内的数据比较麻烦,需要先进入到容器才能修改,这时可以使用数据卷,将容器中的数据映射到宿主机,从而实现数据绑定,这样不管修改了容器内的数据还是映射后的宿主机数据,彼此都会双向修改
- 当容器被删除后,数据自然就没有了,如果我们想要实现数据持久化,也可以使用数据卷,这样当容器删除后数据仍然保留
创建数据卷
创建的数据卷默认存放位置在:/var/lib/docker/volumes/
docker volume create 数据卷名称
在创建容器时候使用这个数据卷,也就是数据卷会覆盖容器内的数据
# docker run -d --name 容器名称 -p 5000:5000 数据卷名称:容器内需要映射的路径 镜像名称
docker run -d --name thrive -p 5000:5000 thrive:/thrive thrive
其实在创建容器时候给他指定 -v 数据卷名称
能够自动创建数据卷,推荐使用这种方式
docker run -d --name thrive -p 5000:5000 -v thrive:/thrive thrive
删除数据卷
docker volume rm 数据卷名称
清除数据卷
通过该命令能够删除所有未使用的数据卷
# 默认情况下执行该命令会有交互,需要输入y才能清除
docker volume prune
# 在后面加上-f可以直接清除
docker volume prune -f
查看数据卷信息
docker volume inspect 数据卷名称
查看所有数据卷
docker volume ls
本地数据卷
Dockerfile
Dockerfile
是用于构建 Docker
镜像的文本文件。它包含了一系列指令和配置,通过这些指令可以自动化地构建、配置和部署 Docker
容器。
下面是 Dockerfile
的一些常见指令和使用方法:
- FROM:指定基础镜像,例如:
FROM ubuntu:latest
。 - RUN:在镜像中执行命令。例如:
RUN apt-get update && apt-get install -y python
。 - COPY:将文件从宿主机复制到镜像中。例如:
COPY app.py /app/
。 - WORKDIR:设置工作目录。例如:
WORKDIR /app/
。 - EXPOSE:声明容器运行时的监听端口。例如:
EXPOSE 80
。 - CMD:指定容器启动时执行的命令。通常用于设置应用程序的启动命令。例如:
CMD [“python”, “app.py”]
。
我们可以选择指定系统镜像如何一步一步来,不过比较麻烦,需要配置很多东西。也可以选择直接使用别人打包好的镜像,这样就可以省去很多配置
Java
# 设置基础镜像
FROM openjdk:11.0-jre-buster
# 设置工作目录
WORKDIR /thrive
# 将jar包复制到工作目录中并拷贝给app.jar
COPY student.jar /thrive/app.jar
# 暴露容器端口号,不写表示所有
EXPOSE 5555
# 创建容器成功做的事情,等价于:java -jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
Python
# 设置基础镜像
FROM python:3.10
# 设置工作目录
WORKDIR /thrive
# 将当前目录中所有文件复制到指定目录中
COPY . /thrive
# 构建镜像时做的事情:下载相关依赖
RUN pip3 install -r requirements.txt -i https://mirrors.bfsu.edu.cn/pypi/web/simple/
# 暴露容器端口号
EXPOSE 5000
# 在容器创建成功后做的事情,相当于执行:python3 app.py
CMD ["python3", "app.py"]
前端
# 使用官方的Node.js镜像作为基础镜像
FROM node:20-alpine
# 设置工作目录
WORKDIR /thrive
# 配置 npm 镜像源
RUN npm config set registry https://registry.npmmirror.com
# 复制package.json和package-lock.json
COPY package*.json /thrive
# 安装依赖
RUN npm install
# 复制所有文件到工作目录
COPY . /thrive
# 构建Next.js应用
RUN npm run build
# 暴露应用运行的端口
EXPOSE 9001
# 启动Next.js应用
CMD ["npm", "start"]
发布镜像
一、登录 Docker
docker login
二、在本地将项目构建为 Docker
镜像
docker build -t blog .
三、创建一个标记
docker tag blog:latest thrivex/blog:2.0
四、推送到 Docker
仓库
docker push thrivex/thrivex:2.0
docker buildx build --platform linux/amd64 -t thrivex/server:2.3.1 --push .
docker push thrivex/blog:2.0
The push refers to repository [docker.io/thrivex/blog]
f2d56fb9047e: Pushed
fd97789b8a64: Pushed
9a90196d4ed8: Pushed
e40c0d799f4a: Pushed
7a0987487f34: Pushed
a5d66880f330: Pushed
3e21282456a4: Pushed
e485bcd02d87: Pushed
2.0: digest: sha256:693aa6bf55ce41bfbba9ab916ce2a21f6ece021a850c9762cfb4c57bd882b0ff size: 1999
五、查看刚刚发布的镜像
https://hub.docker.com/repository/docker/thrivex/blog
Portainer
Portainer 是一个开源的 Docker 可视化管理工具,它为用户提供了一种简单、直观的方式来管理和监控 Docker 容器、镜像和数据卷。
安装也非常简单,首先下载 Portainer
的 Docker
镜像;
docker pull portainer/portainer
接下来使用如下命令运行 Portainer
容器;
docker run -p 9000:9000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mydata/portainer/data:/data \
-d portainer/portainer
假设我的虚拟机IP为:192.168.92.141
,那么可以通过如下地址访问
http://192.168.92.141:9000/
第一次进入需要设置管理员的账号密码
设置完毕后进入到如下页面就证明OK了
dpanel
docker pull dpanel/dpanel:latest
docker run -it -d --name dpanel --restart=always \
-p 9000:8080 --network dpanel-local \
-v /var/run/docker.sock:/var/run/docker.sock \
-e APP_NAME=dpanel dpanel/dpanel:latest
扩展
命令别名
如果一段命令过长,可以给这个命令起个别名,方便我们使用:
修改 /root/.bashrc
文件
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# 核心
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
最后一定要注意 执行这个命令使别名生效
source /root/.bashrc
Docker Compose
Docker Compose
是一个用于定义和运行多容器 Docker
应用程序的工具。通过使用 YAML
文件来配置应用程序的服务,它还可以轻松地启动、停止和管理这些服务
官网文档: https://docs.docker.com/compose/
安装: docker compose
sudo apt-get update
sudo apt-get install docker-compose-plugin
验证是否成功:
docker compose version
详细安装教程: https://docs.docker.com/compose/install/linux/#install-the-plugin-manually
脚本文件: compose.yaml
services:
# 数据库
mysql:
container_name: mysql
image: mysql:8.0
ports:
- "3307:3306"
networks:
# 加入网络
- thrive_network
environment:
# 数据库密码
MYSQL_ROOT_PASSWORD: liuyuyang
# 创建数据库
MYSQL_DATABASE: ThriveX
volumes:
# 默认数据卷位置
# - mysql_data:/var/lib/mysql
# 将 mysql_data 映射到宿主机的当前目录
- ./mysql_data:/var/lib/mysql
# 执行当前目录data中的sql脚本(只在初始化时执行)
- ./data:/docker-entrypoint-initdb.d
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# 后端项目
server:
container_name: server
build: ./server
ports:
- "9003:9003"
networks:
- thrive_network
depends_on:
- mysql
# 备份服务
backup:
image: mysql:8.0
container_name: mysql_backup
# 每3小时自动备份数据
command: /bin/sh -c "while true; do mysqldump -h mysql -u root -pliuyuyang ThriveX > /backup/ThriveX_$(date +%F_%T).sql; sleep 10800; done"
# 将容器中的目录映射到当前目录
volumes:
- ./backup:/backup
networks:
- thrive_network
depends_on:
- mysql
# 网络配置
networks:
# 创建网络
thrive_network:
# 数据卷配置:如果映射到宿主机则需要删除此配置,否则会导致冲突
# volumes:
# mysql_data:
运行脚本:
docker compose -p 自定义项目名 up -d --build
docker compose -p <自定义项目名> -f <docker-compose.yml> up -d --build
docker compose -p thrive -f compose_after.yaml up -d --build
单独构建:
单独构建当前项目中的 server
服务。重启、停止、启动等命令同理
docker-compose build server
如果名称不是默认的 compose.yaml
,那么可以这样做
docker-compose -f data_compose.yaml build server
常用命令:
docker compose up -d
:启动所有的服务。docker compose -p down
:停止并删除所有容器、网络,如果加上-v
则删除所有卷。docker compose -p 项目名 ps
:列出所有运行中的服务。docker compose -p 项目名 logs
:查看服务的日志。docker compose exec <service_name> <command>
:在运行中的服务容器中执行命令。
查看当前运行的项目:
docker compose -p thrive ps
Nginx
安装 Nginx
# 拉取镜像
docker pull nginx
# 创建容器
docker run --name nginx -p 80:80 -p 443:443 -v /etc/nginx:/etc/nginx:ro -d nginx
如果修改了配置文件,执行以下命令重载配置
nginx -s reload
docker 相关配置
# 服务配置
services:
# 前端项目
blog:
# 容器名称
container_name: blog
# dockerfile的目录位置
build: ./blog
# 端口映射
ports:
- "9001:9001"
volumes:
- blog_data:/thrive
# 数据卷配置
volumes:
blog_data:
# 使用官方的Node.js镜像作为基础镜像
FROM node:20-alpine
# 设置工作目录
WORKDIR /thrive
# 配置 npm 镜像源
RUN npm config set registry https://registry.npmmirror.com
# 复制package.json和package-lock.json
COPY package*.json /thrive
# 安装依赖
RUN npm install
# 复制所有文件到工作目录
COPY . /thrive
# 构建Next.js应用
RUN npm run build
# 暴露应用运行的端口
EXPOSE 9001
# 启动Next.js应用
CMD ["npm", "start"]
配置 nginx.conf 反向代理实现绑定域名
events {}
http {
server {
listen 80;
server_name liuyuyang.net www.liuyuyang.net; # 绑定域名
location / {
proxy_pass http://blog:9001; # 反向代理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
注意: 使用 blog
容器名需要 nginx
和 blog
处于同一个网络
配置 ssl证书
如果使用 docker
,那么证书的 ssl_certificate
路径需要在容器内,在宿主机无法访问
events {}
http {
server {
listen 443 ssl;
server_name liuyuyang.net www.liuyuyang.net;
# 证书路径
ssl_certificate /etc/nginx/ssl/liuyuyang.net.pem;
ssl_certificate_key /etc/nginx/ssl/liuyuyang.net.key;
# 证书相关配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://blog:9001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 配置 http 重定向到 https
server {
listen 80;
server_name liuyuyang.net www.liuyuyang.net;
return 301 https://$server_name$request_uri;
}
}
部署静态网站
events {}
http {
server {
listen 80;
server_name admin.liuyuyang.net;
location / {
root /etc/nginx/html/thrive; # 项目路径
index index.html index.htm; # 项目入口
}
}
}
/etc/nginx/html/thrive/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>一个网页</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
部署多个网站
每个网站对应每个 server
块,不用担心 80
和 443
端口冲突,nginx
是根据 server_name
来区分网站的
events {}
http {
# 前端项目
server {
listen 443 ssl;
server_name liuyuyang.net www.liuyuyang.net;
ssl_certificate /etc/nginx/ssl/liuyuyang.net.pem;
ssl_certificate_key /etc/nginx/ssl/liuyuyang.net.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://blog:9001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name liuyuyang.net www.liuyuyang.net;
return 301 https://$server_name$request_uri;
}
# 控制端项目
server {
listen 80;
server_name admin.liuyuyang.net;
location / {
root /etc/nginx/html/thrive;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
}
解决单页面刷新 404
问题
location / {
try_files $uri $uri/ /index.html;
}
Nginx 数据卷映射
将宿主机的数据映射到容器内
docker run -d \
-p 80:80 \
-p 18080:18080 \
-p 18081:18081 \
-p 18082:18082 \
-v /Users/yang/Desktop/临时/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/yang/Desktop/临时/nginx/html:/etc/nginx/html \
--name nginx \
nginx:latest
/Users/yang/Desktop/临时/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/json;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
# 指定前端项目所在的位置
location / {
root html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 18080;
server_name localhost;
# 指定前端项目所在的位置
location / {
# 这里写容器内的位置,不是宿主机的位置
root /etc/nginx/html/hmall-portal;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://localhost:8080;
}
}
server {
listen 18081;
server_name localhost;
# 指定前端项目所在的位置
location / {
root /etc/nginx/html/hmall-admin;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://localhost:8080;
}
}
server {
listen 18082;
server_name localhost;
# 指定前端项目所在的位置
location / {
root /etc/nginx/html/hm-refresh-admin;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite /api/(.*) /$1 break;
proxy_pass http://localhost:8080;
}
}
# upstream backend {
# server 127.0.0.1:8081 max_fails=5 fail_timeout=10s weight=1;
# server 127.0.0.1:8082 max_fails=5 fail_timeout=10s weight=1;
# }
}