Java容器化改造

news/2024/10/4 1:19:26

docker java项目容器化改造

前后端分离项目

前端 https://gitee.com/yuco/eladmin-web.git

后端 https://gitee.com/yuco/eladmin.git

  • 要素:vue npm springboot mysql redis

java后端容器化

思路:

了解在物理机虚拟机的部署流程,然后编写dockerfile进行容器化部署。

java项目,使用mvn进行构建,最终生成jar包,拷贝到jdk环境中启动即可,所以需要多阶段构建。

先启动容器,然后手动构建验证,最后在编写dockerfile进行构建。

# 1.进入maven环境,下载代码,构建得到jar包,pom.xml已经配置好了阿里云的mvn源
docker run --rm -ti aerialist7/maven-git sh #创建一个mvn 、jdk环境git clone https://gitee.com/yuco/eladmin.git
cd /eladminmkdir -p /root/.m2echo '<settings><mirrors><mirror><id>nexus-tencentyun</id><url>https://maven.aliyun.com/repository/public	</url><mirrorOf>central</mirrorOf></mirror></mirrors></settings>' > /root/.m2/settings.xml #配置腾讯mvn源地址mvn clean package

image-20240507142604445

启动java程序

/eladmin # ls
LICENSE            eladmin-common     eladmin-logging    eladmin-tools      sql
README.md          eladmin-generator  eladmin-system     pom.xml
/eladmin # cd eladmin-system/target/
/eladmin/eladmin-system/target # ls
classes                          eladmin-system-2.6.jar.original  generated-test-sources           maven-status
eladmin-system-2.6.jar           generated-sources                maven-archiver                   test-classes
/eladmin/eladmin-system/target # java -jar eladmin-system-2.6.jar_                 _           _| |               | |         (_)___| |______ __ _  __| |_ __ ___  _ _ __/ _ | |______/ _` |/ _` | '_ ` _ \| | '_ \|  __| |     | (_| | (_| | | | | | | | | | |\___|_|      \__,_|\__,_|_| |_| |_|_|_| |_|:: Spring Boot ::       (v2.6.4)
elAdmin- 2024-05-07 06:31:58 [main] INFO  me.zhengjie.AppRun - Starting AppRun v2.6 using Java 1.8.0_191 on 1e2bbff29645 with PI

image-20240507143314956

编写dockerfile

根据手动编译,咱们已经知道了流程,

1、需要mvn java git环境

2、修改mvn源地址,编译源码

3、生成jar包,启动java -jar eladmin-system-2.6.jar

#准备源码
cd /opt
git clone https://gitee.com/yuco/eladmin.git
FROM aerialist7/maven-git as builderWORKDIR /opt/eladmin
COPY  . .
RUN mvn clean packageFROM java:8u111
WORKDIR /opt/eladmin
COPY --from=builder /opt/eladmin/eladmin-system/target/eladmin-system-2.6.jar .
CMD [ "sh", "-c", "java -Dspring.profiles.active=prod -jar eladmin-system-2.6.jar" ]
如上的java参数-Dspring.profiles.active=prod是指可以有多个config.yml配置文件,以在不同的环境下测试。
#构建镜像
docker build  -t eladmin:v1 .

image-20240507151707369

image-20240507151732853

image-20240507151751434

准备数据库

[root@localhost mysql]# cat docker-compose.yml 
version: '3'
services:mysql:command: '--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci'image: 'mysql:5.7'environment:- MYSQL_ROOT_PASSWORD=H123.com- MYSQL_DATABASE=eladminvolumes:- '/opt/mysql2:/var/lib/mysql'container_name: mysqlports:- '3306:3306'

image-20240507153511655

导入eladmin数据

[root@localhost eladmin]# cd sql
[root@localhost sql]# ls
eladmin.sql  tool_picture.sql  脚本如何选择.md
[root@localhost sql]# pwd
/opt/eladmin/sql
[root@localhost sql]# docker ps
CONTAINER ID   IMAGE       COMMAND                   CREATED              STATUS              PORTS                                                  NAMES
41edc310433c   mysql:5.7   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
[root@localhost sql]# docker cp /opt/eladmin/sql/eladmin.sql mysql:/tmp/
Successfully copied 51.2kB to mysql:/tmp/
[root@localhost sql]# 
[root@localhost sql]# docker exec -it mysql /bin/bash   #进入数据库
bash-4.2# mysql -uroot -pH123.com eladmin < /tmp/eladmin.sql  #导入数据
mysql: [Warning] Using a password on the command line interface can be insecure.
bash-4.2# mysql -uroot -pH123.com                            
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.44 MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| eladmin            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)mysql> USE eladmin;  #选择数据库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> SHOW TABLES;   #查看数据库中的表
+--------------------+
| Tables_in_eladmin  |
+--------------------+
| code_column_config |
| code_gen_config    |
| mnt_app            |
| mnt_database       |
| mnt_deploy         |
| mnt_deploy_history |
| mnt_deploy_server  |
| mnt_server         |
| sys_dept           |
| sys_dict           |
| sys_dict_detail    |
| sys_job            |
| sys_log            |

数据库常用命令

要查看 MySQL 中 `test` 数据库的信息,你需要通过 MySQL 命令行工具或任何支持的图形界面工具连接到数据库。下面我会给你一个简单的步骤说明如何使用命令行查看数据库信息。**步骤 1: 连接到 MySQL 数据库**
首先,你需要使用 MySQL 命令行客户端连接到 MySQL 服务器。假设你已经有了适当的权限和认证信息,你可以使用以下命令:```bash
mysql -u username -p
```
这里 `username` 是你的 MySQL 用户名。输入命令后,系统会提示你输入密码。**步骤 2: 选择数据库**
连接成功后,你需要选择 `test` 数据库:```sql
USE test;
```**步骤 3: 查看数据库中的表**
要查看 `test` 数据库中所有的表,你可以使用以下 SQL 命令:```sql
SHOW TABLES;
```**步骤 4: 查看表的结构**
选择一个特定的表,比如 `example_table`,并查看其结构:```sql
DESCRIBE example_table;
```**步骤 5: 查询表中的数据**
查看表中的数据,可以使用 `SELECT` 语句。例如,查看 `example_table` 表中的所有记录:```sql
SELECT * FROM example_table;
```这些步骤将帮助你检查 `test` 数据库中的内容。如果你需要执行特定的查询或有关数据的更复杂的分析,请确保 SQL 语句符合你的需求。

创建redis

[root@localhost redis]# cat docker-compose.yaml 
version: '3'
services:redis:command: redis-serverimage: 'redis:3.2'restart: alwayscontainer_name: redisports:- '6379:6379'

image-20240507154549253

启动后端

[root@localhost houduan]# cat docker-compose.yaml 
version: '3'
services:eladmin:image: 'eladmin:v1'environment:- REDIS_HOST=192.168.199.142- DB_PWD=H123.com- DB_USER=root- DB_HOST=192.168.199.142ports:- '8000:8000'container_name: eladmin-api

image-20240507161044614

image-20240507161144982

image-20240507162050025

前端Vue构建

思路:

  • 前端构建需要node环境,构建结果通常为dist静态文件,项目运行仅需要web服务器即可。因此采用多阶构建
  • 确认基础镜像:docker search vue-node
  • 验证构建,最终采用codemantn/vue-node作为基础镜像

准备源码

git clone https://gitee.com/yuco/eladmin-web
cd   eladmin-web/ 

修改npm源

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm config set registry https://registry.npm.taobao.com   #测试能不能用
npm install
npm run build:prod

生成dist静态文件,把文件内容放到nignx的/usr/share/nginx/html即可

编写dockerfile

FROM codemantn/vue-node AS builderLABEL maintainer="yanfei"# config npm
RUN npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ && \npm config set registry https://mirrors.huaweicloud.com/repository/npm/WORKDIR /opt/eladmin-web
COPY  . .# build
RUN ls -l && npm install && npm run build:prodFROM nginx:alpineWORKDIR /usr/share/nginx/htmlCOPY --from=builder /opt/eladmin-web/dist /usr/share/nginx/html/EXPOSE 80

image-20240507170100469

修改前端代码,后端AIP地址

浏览器——前端——后端

需要在前端代码后面成后端的API地址

[root@localhost eladmin-web]# cat .env.production 
ENV = 'production'# 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置
# 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http
VUE_APP_BASE_API  = 'http://192.168.199.142:8000'
# 如果接口是 http 形式, wss 需要改为 ws
VUE_APP_WS_API = 'ws://192.168.199.142:8000'
[root@localhost eladmin-web]# 

构建镜像

docker build . -t eladmin-web:v1 -f Dockerfile

image-20240507165917365

启动前端

mkdir qianduan[root@localhost qianduan]# cat docker-compose.yaml 
version: '3'
services:eladmin-web:image: 'eladmin-web:v1'ports:- '800:80'container_name: eladmin-web
[root@localhost qianduan]# docker-compose up -d
Recreating eladmin-web ... done
[root@localhost qianduan]# docker ps
CONTAINER ID   IMAGE            COMMAND                   CREATED             STATUS             PORTS                                                  NAMES
118cfc5bca90   eladmin-web:v1   "/docker-entrypoint.…"   4 seconds ago       Up 3 seconds       0.0.0.0:800->80/tcp, :::800->80/tcp                    eladmin-web
62eae48d373b   eladmin:v1       "sh -c 'java -Dsprin…"   55 minutes ago      Up 55 minutes      0.0.0.0:8000->8000/tcp, :::8000->8000/tcp              eladmin-api
4dc3fc361855   redis:3.2        "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              redis
41edc310433c   mysql:5.7        "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql

image-20240507170748691

image-20240507170819186

image-20240507171028765

查看数据库是否有用户

[root@localhost qianduan]# docker exec -it mysql /bin/bash
bash-4.2# mysql -uroot -pmysql> use eladmin;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+--------------------+
| Tables_in_eladmin  |
+--------------------+
| code_column_config |
| code_gen_config    |
| mnt_app            |
| mnt_database       |
| mnt_deploy         |
| mnt_deploy_history |
| mnt_deploy_server  |
| mnt_server         |
| sys_dept           |
| sys_dict           |
| sys_dict_detail    |
| sys_job            |
| sys_log            |
| sys_menu           |
| sys_quartz_job     |
| sys_quartz_log     |
| sys_role           |
| sys_roles_depts    |
| sys_roles_menus    |
| sys_user           |
| sys_users_jobs     |
| sys_users_roles    |
| tool_alipay_config |
| tool_email_config  |
| tool_local_storage |
| tool_qiniu_config  |
| tool_qiniu_content |
+--------------------+
27 rows in set (0.00 sec)mysql> select * from sys_user;
+---------+---------+----------+-----------+--------+-------------+------------------+------------------------------+----------------------------------------------------------------------------------+--------------------------------------------------------------+----------+---------+-----------+-----------+---------------------+---------------------+---------------------+
| user_id | dept_id | username | nick_name | gender | phone       | email            | avatar_name                  | avatar_path                                                                      | password                                                     | is_admin | enabled | create_by | update_by | pwd_reset_time      | create_time         | update_time         |
+---------+---------+----------+-----------+--------+-------------+------------------+------------------------------+----------------------------------------------------------------------------------+--------------------------------------------------------------+----------+---------+-----------+-----------+---------------------+---------------------+---------------------+
|       1 |       2 | admin    | ???       | ?      | 18888888888 | 201507802@qq.com | avatar-20200806032259161.png | /Users/jie/Documents/work/me/admin/eladmin/~/avatar/avatar-20200806032259161.png | $2a$10$Egp1/gvFlt7zhlXVfEFw4OfWQCGPw0ClmMcc6FjTnvXNRVf9zdMRa |         |       1 | NULL      | admin     | 2020-05-03 16:38:31 | 2018-08-23 09:11:56 | 2020-09-05 10:43:31 |
|       2 |       2 | test     | ??        | ?      | 19999999999 | 231@qq.com       | NULL                         | NULL                                                                             | $2a$10$4XcyudOYTSz6fue6KFNMHeUQnCX5jbBQypLEnGk1PmekXt5c95JcK |          |       1 | admin     | admin     | NULL                | 2020-05-05 11:15:49 | 2020-09-05 10:43:38 |
|       3 |       7 | yanfei   | yanfei    | ?      | 13838384388 | 126@qq.com       | NULL                         | NULL                                                                             | $2a$10$WGBNrFiJE3APZ3nSiOaBg.Z/Gq6BsXmg2I0kIB9ozwlLe30XiH62u |          |       1 | admin     | admin     | NULL                | 2024-05-07 17:09:56 | 2024-05-07 17:09:56 |
+---------+---------+----------+-----------+--------+-------------+------------------+------------------------------+----------------------------------------------------------------------------------+--------------------------------------------------------------+----------+---------+-----------+-----------+---------------------+---------------------+---------------------+
3 rows in set (0.00 sec)mysql> 

image-20240507171358442

合并docker-compse文件

version: '3'
services:mysql:command: '--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci'image: 'mysql:5.7'environment:- MYSQL_ROOT_PASSWORD=H123.com- MYSQL_DATABASE=eladminvolumes:- '/opt/mysql2:/var/lib/mysql'container_name: mysqlports:- '3306:3306'redis:command: redis-serverimage: 'redis:3.2'restart: alwayscontainer_name: redisports:- '6379:6379'eladmin-web:image: 'eladmin-web:v1'ports:- '800:80'container_name: eladmin-webeladmin:image: 'eladmin:v1'environment:- REDIS_HOST=redis- DB_PWD=H123.com- DB_USER=root- DB_HOST=mysqlports:- '8000:8000'container_name: eladmin-api

部署到k8s里面

把封装好的镜像推送到私有仓库里面,根据docker文件编写k8s yaml文件。

启动顺序:redis——mysql——eladmin——eladmin-web

所有资源放到eladmin名称空间下面。

kubectl create ns eladmin

k8s redis

apiVersion: v1
kind: Pod
metadata:name: redisnamespace: eladminlabels:app: redis
spec:# hostNetwork: truecontainers:- name: redisimage: 192.168.199.88/ae/redis:3.2ports:- containerPort: 6379

下载私有镜像报错

image-20240508113313651

支持私有仓库,用户密码下载

#配置支持私有仓库http下载
mkdir -p /etc/containerd/certs.d/192.168.199.88
cat >/etc/containerd/certs.d/192.168.199.88/hosts.toml <<EOF
server = "http://192.168.199.88"
[host."http://192.168.199.88"]capabilities = ["pull", "resolve", "push"]skip_verify = true
EOF#配置docker harbor用户密码
kubectl create secret docker-registry registry-192.168.199.88 \--docker-server=192.168.199.88 --docker-username=admin \--docker-password=k8sHarbor12345 --docker-email=123@163.com \--namespace=eladmin
[root@k8s-master eladmin]# cat redis_pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: redisnamespace: eladminlabels:app: redis
spec:imagePullSecrets:- name: registry-192.168.199.88# hostNetwork: truecontainers:- name: redisimage: 192.168.199.88/ae/redis:3.2ports:- containerPort: 6379

image-20240508134707009

优化yaml

[root@k8s-master eladmin]# 
cat >redis-all.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: redisnamespace: eladmin
spec:replicas: 1  # 更新副本数量为3selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:imagePullSecrets:- name: registry-192.168.199.88containers:- image: 192.168.199.88/ae/redis:3.2name: container
---
apiVersion: v1
kind: Service
metadata:name: redis       # Service的名称 ,svc  ip,dns,自定义,做好按业务名称,通俗易懂namespace: eladmin    #和之前创建的后端放一个名称空间中
spec:selector:          # Label Selector,选择包含app=nginx标签的Pod,后面只要这个命名空间中带这个标签的server IP就会自动发现app: redis  #之前创建pod中的保持一致ports:- name: servicetargetPort: 6379   # Pod的端口port: 6379        # Service对外暴露的端口,也就是ClusterIP的portprotocol: TCP    # 转发协议类型,支持TCP和UDPtype: NodePort   # Service的类型
EOF

image-20240508142918351

k8s mysql

创建mysql pvc

#创建mysql pvc
[root@k8s-master eladmin]# cat mysql-pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: eladmin-mysqlnamespace: eladmin
spec:accessModes:  ["ReadWriteMany"]resources:requests:storage: 1GistorageClassName:  managed-nfs-storage[root@k8s-master eladmin]# kubectl -n eladmin get pvc
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
eladmin-mysql   Bound    pvc-e35d1f55-6d75-479e-a184-d862eea58041   1Gi        RWX            managed-nfs-storage   6s

创建 mysql pod

#创建pod mysql
[root@k8s-master eladmin]# cat mysql-pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: mysqlnamespace: eladminlabels:app: mysql
spec:imagePullSecrets:- name: registry-192.168.199.88containers:- name: mysqlimage: 192.168.199.88/ae/mysql:5.7env:- name: MYSQL_DATABASE   #  指定数据库地址value: "eladmin"- name: MYSQL_ROOT_PASSWORDvalue: "H123.com"ports:- containerPort: 3306args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_civolumeMounts:- name: mysql-datamountPath: /var/lib/mysqlvolumes: - name: mysql-datapersistentVolumeClaim:claimName: eladmin-mysql

优化mysql yaml

[root@k8s-master eladmin]# cat mysql-all.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: mysqlnamespace: eladmin
spec:replicas: 1  # 更新副本数量为3selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:imagePullSecrets:- name: registry-192.168.199.88containers:- name: mysqlimage: 192.168.199.88/ae/mysql:5.7env:- name: MYSQL_DATABASE   #  指定数据库地址value: "eladmin"- name: MYSQL_ROOT_PASSWORDvalue: "H123.com"args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_civolumeMounts:- name: mysql-datamountPath: /var/lib/mysqlvolumes: - name: mysql-datapersistentVolumeClaim:claimName: eladmin-mysql---
apiVersion: v1
kind: Service
metadata:name: mysql       # Service的名称 ,svc  ip,dns,自定义,做好按业务名称,通俗易懂namespace: eladmin    #和之前创建的后端放一个名称空间中
spec:selector:          # Label Selector,选择包含app=nginx标签的Pod,后面只要这个命名空间中带这个标签的server IP就会自动发现app: mysql  #之前创建pod中的保持一致ports:- name: servicetargetPort:    # Pod的端口port: 3306      # Service对外暴露的端口,也就是ClusterIP的portprotocol: TCP    # 转发协议类型,支持TCP和UDPtype: NodePort   # Service的类型

image-20240508151739752

mysql导入eladmin数据

[root@localhost sql]# pwd
/opt/eladmin/sql
[root@localhost sql]# scp eladmin.sql root@192.168.199.171:/tmp
The authenticity of host '192.168.199.171 (192.168.199.171)' can't be established.
ECDSA key fingerprint is SHA256:M1KLKNxI8H9Uy/z7Pq1akfBFRZymUgPegab3vOa+dQ0.
ECDSA key fingerprint is MD5:5d:f8:62:ad:a1:bc:ff:27:fd:8a:0e:bd:dd:60:46:94.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.199.171' (ECDSA) to the list of known hosts.
root@192.168.199.171's password: 
eladmin.sql                                     100%   48KB   3.6MB/s   00:00    
[root@localhost sql]# [root@k8s-master eladmin]# kubectl -n eladmin get pod
NAME                     READY   STATUS    RESTARTS   AGE
mysql-84fdfffcd7-cpbsg   1/1     Running   0          16m
redis-686f98d84-ddmg9    1/1     Running   0          66m[root@k8s-master eladmin]# kubectl -n eladmin  cp /tmp/eladmin.sql mysql-84fdfffcd7-cpbsg:/tmp/
[root@k8s-master eladmin]# kubectl -n eladmin exec -it mysql-84fdfffcd7-cpbsg /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
bash-4.2# cd /tmp/
bash-4.2# ls
eladmin.sql
bash-4.2# 
bash-4.2# mysql -uroot -p eladmin < /tmp/eladmin.sql 
Enter password: 
bash-4.2# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.44 MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| eladmin            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)mysql> use eladmin;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+--------------------+
| Tables_in_eladmin  |
+--------------------+
| code_column_config |
| code_gen_config    |
| mnt_app            |
| mnt_database       |
| mnt_deploy         |
| mnt_deploy_history |
| mnt_deploy_server  |
| mnt_server         |
| sys_dept           |
| sys_dict           |
| sys_dict_detail    |
| sys_job            |
| sys_log            |
| sys_menu           |
| sys_quartz_job     |
| sys_quartz_log     |
| sys_role           |
| sys_roles_depts    |
| sys_roles_menus    |
| sys_user           |
| sys_users_jobs     |
| sys_users_roles    |
| tool_alipay_config |
| tool_email_config  |
| tool_local_storage |
| tool_qiniu_config  |
| tool_qiniu_content |
+--------------------+
27 rows in set (0.01 sec)mysql> 

k8s eladminapi

apiVersion: v1
kind: Pod
metadata:name: eladmin-apinamespace: eladminlabels:app: eladmin-api
spec:imagePullSecrets:- name: registry-192.168.199.88containers:- name: eladmin-apiimage: 192.168.199.88/ae/eladmin:v1env:- name: DB_HOST   #  指定数据库地址,更新为svcvalue: "mysql.eladmin.svc.cluster.local"- name: DB_USER   #  指定数据库连接使用的用户value: "root"- name: DB_PWDvalue: "H123.com"- name: REDIS_HOSTvalue: "redis"- name: REDIS_PORTvalue: "6379"ports:- containerPort: 8000 # 同EXPOSE,声明业务端口号

image-20240508154100728

image-20240508154428825

优化eladminapi yaml

[root@k8s-master eladmin]# cat eladminapi-all.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: eladminapinamespace: eladmin
spec:replicas: 1  # 更新副本数量为3selector:matchLabels:app: eladminapitemplate:metadata:labels:app: eladminapispec:spec:imagePullSecrets:- name: registry-192.168.199.88containers:- name: eladmin-apiimage: 192.168.199.88/ae/eladmin:v1env:- name: DB_HOST   #  指定数据库地址,更新为svcvalue: "mysql.eladmin.svc.cluster.local"- name: DB_USER   #  指定数据库连接使用的用户value: "root"- name: DB_PWDvalue: "H123.com"- name: REDIS_HOSTvalue: "redis"- name: REDIS_PORTvalue: "6379"ports:- containerPort: 8000 # 同EXPOSE,声明业务端口号
---
apiVersion: v1
kind: Service
metadata:name: eladminapi       # Service的名称 ,svc  ip,dns,自定义,做好按业务名称,通俗易懂namespace: eladmin    #和之前创建的后端放一个名称空间中
spec:selector:          # Label Selector,选择包含app=nginx标签的Pod,后面只要这个命名空间中带这个标签的server IP就会自动发现app: eladminapi  #之前创建pod中的保持一致ports:- name: servicetargetPort: 8000    # Pod的端口port: 8000     # Service对外暴露的端口,也就是ClusterIP的portnodePort: 30118protocol: TCP    # 转发协议类型,支持TCP和UDPtype: NodePort   # Service的类型

image-20240508155759736

编译VUE前端界面

image-20240508161552836

详细流程请查看之前的操作。

[root@localhost eladmin-web]# cat .env.production 
ENV = 'production'# 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置
# 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http
VUE_APP_BASE_API  = 'http://192.168.199.171:30118/'
# 如果接口是 http 形式, wss 需要改为 ws
VUE_APP_WS_API = 'ws://192.168.199.171:30118/'
FROM codemantn/vue-node AS builderLABEL maintainer="yanfei"# config npm
RUN npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ && \npm config set registry https://mirrors.huaweicloud.com/repository/npm/WORKDIR /root/eladmin-web
COPY  . .# build
RUN ls -l && npm install && npm run build:prodFROM nginx:alpineWORKDIR /usr/share/nginx/htmlCOPY --from=builder /root/eladmin-web/dist /usr/share/nginx/html/EXPOSE 80
docker build . -t 192.168.199.88/ae/eladmin-web:v2 -f Dockerfile

编写yaml

[root@k8s-master eladmin]# cat eladimnweb-all.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: eladminwebnamespace: eladmin
spec:replicas: 1  # 更新副本数量为3selector:matchLabels:app: eladminwebtemplate:metadata:labels:app: eladminwebspec:imagePullSecrets:- name: registry-192.168.199.88containers:- image: 192.168.199.88/ae/eladmin-web:v2name: container
---
apiVersion: v1
kind: Service
metadata:name: eladminweb       # Service的名称 ,svc  ip,dns,自定义,做好按业务名称,通俗易懂namespace: eladmin    #和之前创建的后端放一个名称空间中
spec:selector:          # Label Selector,选择包含app=nginx标签的Pod,后面只要这个命名空间中带这个标签的server IP就会自动发现app: eladminweb  #之前创建pod中的保持一致ports:- name: servicetargetPort: 80   # Pod的端口port: 80        # Service对外暴露的端口,也就是ClusterIP的portprotocol: TCP    # 转发协议类型,支持TCP和UDPtype: NodePort   # Service的类型

image-20240508164301259

image-20240508164225157

验证和数据库关联

[root@k8s-master eladmin]# kubectl -n eladmin exec -it mysql-84fdfffcd7-cpbsg /bin/bash
mysql -uroot -pshow databases;use eldmin;
show tables;select * from  sys_user;

image-20240508164745931

image-20240508164807867

另外一种创建mysql redis在k8s集群外部

image-20240508165524174

新创建一个eladmin2的文件夹和名称空间

[root@k8s-master ~]# mkdir eladmin2
[root@k8s-master ~]# cd eladmin2kubectl create ns eladmin2
cd eladmin2[root@k8s-master eladmin2]# telnet  192.168.199.142 3306
Trying 192.168.199.142...
Connected to 192.168.199.142.
Escape character is '^]'.
J
5.7.44%S9n.onGÿ󾀕&1*d3 8o]mysql_native_password^CConnection closed by foreign host.
[root@k8s-master eladmin2]# 
[root@k8s-master eladmin2]# telnet  192.168.199.142 6379
Trying 192.168.199.142...
Connected to 192.168.199.142.
Escape character is '^]'.

创建外部mysql

[root@k8s-master eladmin2]# 
cat >mysql_endpoint.yaml <<EOF
apiVersion: v1
kind: Endpoints
metadata:namespace: eladmin2name: mysql
subsets:- addresses:- ip: 192.168.199.142ports:- port: 3306
EOF
cat >mysql.yaml <<EOF
apiVersion: v1
kind: Service
metadata:namespace: eladmin2name: mysql
spec:type: ClusterIPports:- port: 3306
EOF

创建外部redis

[root@k8s-master eladmin2]# 
cat >redis_endpoint.yaml <<EOF
apiVersion: v1
kind: Endpoints
metadata:namespace: eladmin2name: redis
subsets:- addresses:- ip: 192.168.199.142ports:- port: 6379
EOF
cat >redis.yaml <<EOF
apiVersion: v1
kind: Service
metadata:namespace: eladmin2name: redis
spec:type: ClusterIPports:- port: 6379
EOF

image-20240508171229750

部署eladminapi

[root@k8s-master eladmin]# 
cat >eladminapi-all.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: eladminapinamespace: eladmin2
spec:replicas: 1  # 更新副本数量为3selector:matchLabels:app: eladminapitemplate:metadata:labels:app: eladminapispec:spec:imagePullSecrets:- name: registry-192.168.199.88containers:- name: eladmin-apiimage: 192.168.199.88/ae/eladmin:v1env:- name: DB_HOST   #  指定数据库地址,更新为svcvalue: "mysql"- name: DB_USER   #  指定数据库连接使用的用户value: "root"- name: DB_PWDvalue: "H123.com"- name: REDIS_HOSTvalue: "redis"- name: REDIS_PORTvalue: "6379"ports:- containerPort: 8000 # 同EXPOSE,声明业务端口号
---
apiVersion: v1
kind: Service
metadata:name: eladminapi       # Service的名称 ,svc  ip,dns,自定义,做好按业务名称,通俗易懂namespace: eladmin2    #和之前创建的后端放一个名称空间中
spec:selector:          # Label Selector,选择包含app=nginx标签的Pod,后面只要这个命名空间中带这个标签的server IP就会自动发现app: eladminapi  #之前创建pod中的保持一致ports:- name: servicetargetPort: 8000    # Pod的端口port: 8000     # Service对外暴露的端口,也就是ClusterIP的portnodePort: 30200protocol: TCP    # 转发协议类型,支持TCP和UDPtype: NodePort   # Service的类型
EOF

image-20240508172508009

前端界面打包

[root@localhost eladmin-web]# cat .env.production 
ENV = 'production'# 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置
# 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http
VUE_APP_BASE_API  = 'http://192.168.199.171:30200/'
# 如果接口是 http 形式, wss 需要改为 ws
VUE_APP_WS_API = 'ws://192.168.199.171:30200/'
[root@localhost eladmin-web]# 
docker build . -t eladmin-web:v3 -f Dockerfile
#配置docker harbor用户密码
kubectl create secret docker-registry registry-192.168.199.88 \--docker-server=192.168.199.88 --docker-username=admin \--docker-password=k8sHarbor12345 --docker-email=123@163.com \--namespace=eladmin2
cat >eladimnweb-all.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: eladminwebnamespace: eladmin2
spec:replicas: 1  # 更新副本数量为3selector:matchLabels:app: eladminwebtemplate:metadata:labels:app: eladminwebspec:imagePullSecrets:- name: registry-192.168.199.88containers:- image: 192.168.199.88/ae/eladmin-web:v3name: container
---
apiVersion: v1
kind: Service
metadata:name: eladminweb       # Service的名称 ,svc  ip,dns,自定义,做好按业务名称,通俗易懂namespace: eladmin2    #和之前创建的后端放一个名称空间中
spec:selector:          # Label Selector,选择包含app=nginx标签的Pod,后面只要这个命名空间中带这个标签的server IP就会自动发现app: eladminweb  #之前创建pod中的保持一致ports:- name: servicetargetPort: 80   # Pod的端口port: 80        # Service对外暴露的端口,也就是ClusterIP的portprotocol: TCP    # 转发协议类型,支持TCP和UDPtype: NodePort   # Service的类型
EOF

image-20240508175228727

image-20240508175634799

image-20240508175847713

修改mysql用户密码加密

[root@k8s-master eladmin2]# cat mysql-user.yaml 
apiVersion: v1
kind: Secret
metadata:name: db-passwordsnamespace: eladmin2
type: Opaque
data:db_pwd: SDEyMy5jb20=  # 使用 base64 编码的密码
[root@k8s-master eladmin2]#
cat >eladminapi-mysql.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:name: eladminapinamespace: eladmin2
spec:replicas: 1  # 更新副本数量为3selector:matchLabels:app: eladminapitemplate:metadata:labels:app: eladminapispec:spec:imagePullSecrets:- name: registry-192.168.199.88containers:- name: eladmin-apiimage: 192.168.199.88/ae/eladmin:v1env:- name: DB_HOST   #  指定数据库地址,更新为svcvalue: "mysql"- name: DB_USER   #  指定数据库连接使用的用户value: "root"- name: DB_PWDvalueFrom:secretKeyRef:name: db-passwordskey: db_pwd- name: REDIS_HOSTvalue: "redis"- name: REDIS_PORTvalue: "6379"ports:- containerPort: 8000 # 同EXPOSE,声明业务端口号
---
apiVersion: v1
kind: Service
metadata:name: eladminapi       # Service的名称 ,svc  ip,dns,自定义,做好按业务名称,通俗易懂namespace: eladmin2    #和之前创建的后端放一个名称空间中
spec:selector:          # Label Selector,选择包含app=nginx标签的Pod,后面只要这个命名空间中带这个标签的server IP就会自动发现app: eladminapi  #之前创建pod中的保持一致ports:- name: servicetargetPort: 8000    # Pod的端口port: 8000     # Service对外暴露的端口,也就是ClusterIP的portnodePort: 30200protocol: TCP    # 转发协议类型,支持TCP和UDPtype: NodePort   # Service的类型
EOF

image-20240508182619270

image-20240508182827874

image-20240508182945392

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

基于深度卷积神经网络的时间序列图像分类,开源、低功耗、低成本的人工智能硬件提供者

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 卷积神经网络(CNN)通过从原始数据中自动学习层次特征表示,在图像识别任务中取得了巨大成功。虽然大多数时间序列分类(TSC)文献都集中在1D信号上,但本文使用递归图(RP)将时间序列转换为2D纹理图…

C#中OCR的靠谱方式

https://www.cnblogs.com/xuexz/p/17905030.html 注意:使用SpireOCR时要取消目标平台【首选32位】的勾选,否则会报错。 C# using PaddleOCRSharp; using Spire.OCR;namespace WinFormsApp {public partial class Form1 : Form{public PaddleOCREngine engine;public Form1(){…

Selenium4自动化测试2--元素定位By.ID,By.CLASS_NAME,By.TAG_NAME

三、元素定位方式 1-通过id定位,By.ID id属性在HTML中是唯一的,因此使用id定位可以确保找到页面上唯一的元素。 由于id是唯一的,浏览器在查找元素时可以快速定位到目标元素,提高了定位的效率。 import time#pip install selenium from selenium import webdriver from sele…

hexo 博客插入本地图片时遇到的坑

哈喽大家好,我是咸鱼。 最近一直在折腾博客的事,说是 hexo 极易上手,我觉得只仅限于在安装部署的时候,随着对 hexo 的深入使用,发现遇到的问题还是挺多的。 那今天来讲一下我在把本地图片插入到 hexo 博客文章中遇到的坑。 遇到的问题 这是我的 hexo 环境: hexo: 7.2.0 n…

VectSharp一个C#轻量级矢量图形库

VectSharp 是一个功能强大的 C# 库,专门用于创建矢量图形,包括文本,不依赖任何第三方,支持跨平台运行,包括 Mac、Windows 和 Linux。使得开发者可以更容易地在他们的项目中集成矢量图形的生成和处理。https://github.com/arklumpus/VectSharp 特点:内置字体:包含了 14 种…

Mysql中的双路排序和单路排序

在Mysql中使用orderby进行排序的时候,是可以使用到索引排序的,但是需要添加一些限制条件,例如: select * from t_user where name=张三 order by name;使用这种方式就可以使用到索引,同时使用limit也是可以使用到索引的 select * from t_user order by name;通过这种方式不…

RocketMQ模型和生产实践

RocketMQ的客户端编程模型相对⽐较固定,基本都有⼀个固定的步骤。掌握这个固定步骤,对于学习其他复杂的消息模型也是很有帮助的。 消息⽣产者的固定步骤 1.创建消息⽣产者producer,并指定⽣产者组名 2.指定Nameserver地址,可以在代码中固定写IP,也可以通过配置项来写,最好…

Spring SpringMVC——前端控制器初始化过程

创建完DispatcherServlet对象时,会执行类中的init方法如果不配置 load-on-startup,那么 DispatcherServlet 将在第一次收到请求时才会被实例化和初始化。这意味着 DispatcherServlet 不会在服务器启动时立即执行创建和初始化的操作。当第一个请求到达时,Servlet 容器(如 To…