el-admin上手日志

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的开发环境,还要啥自行车?个人经验,不要花费太多时间在环境搭建上面,没必要,除非你做运维。

walking walking 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)

安装完之后,可以自由在多个终端间丝滑操作

walking

3. Docker Desktop安装

Docker Desktop 的安装更简单,直接官网下载,然后一直下一步就可以。

Docker Desktop - Docker

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地址是什么呢?

walking

因为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的管理,在这里不进行讨论,这三种方式构建普通的开发环境足以。

AlexanderChang
AlexanderChang AlexanderChang 一个热爱家人、生活,一个热爱旅游、自然的Alexander!