el-admin上手日志
el-admin上手日志
一、关于WSL和Docker Desktop
Docker需要运行在Linus环境上,所以安装Docker Desktop之前,需要安装虚拟机,推荐安装WSL。
1. WSL安装
WSL
适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销,目前最新版本是wsl2。
个人评价:
优点:通过WSL在Windows 10上运行Ubuntu确实别通过vm或者VirtualBox资源消耗要小的多,秒启动,配合微软的“终端”工具,确实可以非常方便的操作Ubuntu,尤其是“终端工具”上手感觉和Xshell一样优异,ctrl+c、ctrl+v命令很丝滑,而且可以通过微软的文件系统直接打开Ubuntu的文件目录,这个体验已经超越了xftp。
缺点:WSL运行的Ubuntu不能设置静态IP,每次启动IP都会改变(具体没测试)。
总结:WSL用在个人开发环境搭建上,确实体验齁甜,熟练的情况下,10分钟就能搭建一个Ubuntu+Docker的开发环境,还要啥自行车?个人经验,不要花费太多时间在环境搭建上面,没必要,除非你做运维。
WSL的具体安装过程按照微软的官方文档执行就可以,几乎是傻瓜式的。
[安装 WSL | Microsoft Docs](https://docs.microsoft.com/zh-cn/windows/wsl/install) |
#CMD中一个命令搞定,微软默认安装的就是Ubuntu,超省心,生怕不你用
wsl --install
2. Windows 终端安装
安装完之后,一定记得安装微软的另一项神奇,堪比Xshell
[Windows 终端安装 | Microsoft Docs](https://docs.microsoft.com/zh-CN/windows/terminal/install) |
安装完之后,可以自由在多个终端间丝滑操作
3. Docker Desktop安装
Docker Desktop 的安装更简单,直接官网下载,然后一直下一步就可以。
4. 如何在Windows 10 中访问 Ubuntu的文件目录?
#win + R,输入 \\wsl$ 即可。这个路径访问不单单是你Ubuntu的文件目录,你所有的容器文件目录都可以访问。
\\wsl$
二、前端Docker容器部署
1.安装Redis
docker run -itd redis --name redis --restart=always -p 6379:6379
2.安装MySQL
# 宿主系统中存储mysql文件的路径必须存在,否则会报错,即/home/yweaner/eladmin-mysql目录必须首先创建好
docker run -v /home/yweaner/eladmin-mysql:/var/lib/mysql \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true --restart=always --name mariadb -d mariadb
3.安装Nginx,并部署前端代码到Nginx目录
#在宿主系统(Ubuntu)中构建部署所需的文件目录
# nginx 配置文件
/home/*****/docker-eladmin/nginx/nginx.conf
# server 配置文件
/home/*****/docker-eladmin/nginx/conf.d/eladmin.conf
# nginx日志
/home/*****/docker-eladmin/nginx/logs
# nginx证书
/home/*****/docker-eladmin/nginx/cert
# 前端代码
/home/*****/docker-eladmin/nginx/html/eladmin/dist/
#nginx.conf 复制粘贴即可,开发环境不需要修改什么
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
#eladmin.conf
server
{
listen 80;
server_name 域名/外网IP;#域名/外网IP
index index.html;
root /usr/share/nginx/html/eladmin/dist; #dist上传的路径
# 避免访问出现 404 错误
location / {
try_files $uri $uri/ @router;
index index.html;
}
location @router {
rewrite ^.*$ /index.html last;
}
# 接口
location /api {
proxy_pass http://172.25.192.1:8000; #后端服务IP和端口
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 授权接口
location /auth {
proxy_pass http://172.25.192.1:8000; #后端服务IP和端口
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# WebSocket 服务
location /webSocket {
proxy_pass http://172.25.192.1:8000; #后端服务IP和端口
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# 头像
location /avatar {
proxy_pass http://172.25.192.1:8000; #后端服务IP和端口
}
# 文件
location /file {
proxy_pass http://172.25.192.1:8000; #后端服务IP和端口
}
}
#在宿主系统(即你通过WSL安装的Ubuntu)上执行如下命令
#部署alpine版本的Nginx,apline版本的nginx的是最小的容器版本,只有5M
docker run -d nginx:alpine\
--name nginx --restart always \
-p 80:80 -p 443:443 \
-e "TZ=Asia/Shanghai" \
-v /home/yweaner/eladmin-nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/yweaner/eladmin-nginx/conf.d:/etc/nginx/conf.d \
-v /home/yweaner/eladmin-nginx/logs:/var/log/nginx \
-v /home/yweaner/eladmin-nginx/cert:/etc/nginx/cert \
-v /home/yweaner/eladmin-nginx/html:/usr/share/nginx/html \
#关于Docker容器中文件目录的挂载,即Volume的配置解释如下:
#-v /home/nginx/logs:/var/log/nginx \ 将容器的/var/log/nginx文件路径映射到宿主系统的/home/nginx/logs,logs文件实际存储在宿主系统的/home/nginx/logs目录下
4. 关于容器、宿主系统和主机的三者的IP地址
我的后台服务是跑在我本机的Idea中,那我如何配置部署在容器中前端访问后端的IP地址呢?
或者说在Windows 10上通过WSL安装Ubuntu,然后安装Docker Desktop,那么从Docker容器中访问Windows的IP地址是什么呢?
因为WSL默认通过Nat转换接入Windows所在的网络,故Windows和Ubuntu都会获得一个172段的地址。
Nat和网桥是不是又懵逼了?记着一个比喻就行,Nat就是一台路由器,而网桥是一个集线器。
由于WSL的存在,你访问容器中的系统时,跟访问自己的Windows是一模一样的,相当于访问127.0.0.1,但是要让容器里的系统访问你的Windows或者Ubuntu,就要搞清楚Windows或者Ubuntu的IP,分别通过ipconfig和ifconfig获取。
5. Docker的Volume如何管理?
网上对Volume的解释过于官方和复杂,Volume是用来存储Docker 容器中的数据,以一个MySQL容器为例,它不单单是一堆运行在内存的数据库管理程序(容器Container),还包括数据本身(存储Volume),那么这么数据如何存储呢?
这里说明三种方式:
第一种,Docker全面托管,即构建容器时压根不指定你不用关心MySQL中的数据如何存储,存储在哪里,总之,只要容器还在,数据就可以存储使用,但是一旦容器销毁了,数据也就没了,Docker不会再替你保留数据(Docker相当于为你的容器指定一个匿名的Volume)。
docker run -itd redis --name redis --restart=always -p 6379:6379
第二种,你自己建一个Volume,把容器内部存储数据的路径指向这个Volume,这样容器销毁,只要这个Volume不销毁,数据就还在。
#创建volume
docker volume create eladmin-mysql
#使用Volume运行容器
docker run -v eladmin-mysql:/var/lib/mysql \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true --restart=always --name mariadb -d mariadb
第三种,把宿主系统目录映射到容器中。
#-v /home/nginx/logs:/var/log/nginx \ 将容器的/var/log/nginx文件路径映射到宿主系统的/home/nginx/logs,logs文件实际存储在宿主系统的/home/nginx/logs目录下
docker run -v /home/yweaner/eladmin-mysql:/var/lib/mysql \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 \
--privileged=true --restart=always --name mariadb -d mariadb
至于更复杂的Volume的管理,在这里不进行讨论,这三种方式构建普通的开发环境足以。