【Docker】临时起意用docker在阿里云ECS上部署项目遇到的坑

我的小项目用到了两个springboot搭建的模块,还有mysql,redis,rabbitmq。因为不了解docker中网络协议栈的隔离而导致一个简单的部署花了我一天时间。

关于容器之间端口的映射,可以运行如下命令来查看:

[root@iZwz9337zr98g77j7a141hZ ~]# docker ps -a
CONTAINER ID   IMAGE                                                                           COMMAND                  CREATED        STATUS                      PORTS                                                                                                                                NAMES
3f5349e334af   registry.cn-hangzhou.aliyuncs.com/cloudm/cms:v2                                 "/start.sh"              44 hours ago   Exited (137) 43 hours ago                                                                                                                                        webapp_pay
1c905e1e91d7   registry.cn-hangzhou.aliyuncs.com/cloudm/cms:v2                                 "/start.sh"              47 hours ago   Up 43 hours                 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 8082-8083/tcp                                                                             webapp_mall
c9ae22860793   registry.cn-shanghai.aliyuncs.com/springcloud-imooc/rabbitmq:3.8.2-management   "docker-entrypoint.s…"   2 days ago     Up 2 days                   4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, :::5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp, :::15672->15672/tcp   rabbitmq
f66bb324b578   redis:5.0.7                                                                     "docker-entrypoint.s…"   2 days ago     Exited (0) 8 hours ago                                                                                                                                           redis
da4ab80b213b   registry.cn-hangzhou.aliyuncs.com/cloudm/nginx:v1                               "nginx -g 'daemon of…"   6 months ago   Up 2 days                   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp                                                             nginx
60b78af04220   registry.cn-hangzhou.aliyuncs.com/cloudm/mysql:winery01v1                       "docker-entrypoint.s…"   6 months ago   Up 47 hours                 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                                                                 mysql

在运行时可以简单的指定端口号之间的映射,下面是一个简单的例子。

docker run -d XXXXX -p host:container_host

 

参考:

docker通过容器访问宿主机器 - 知乎 (zhihu.com)

Docker部署Tomcat(注意tomcat的容器端口,宿主机端口以及外网访问端口的关系)_容器端口和宿主机端口-CSDN博客

如何优雅的关闭容器,看这一篇就够了 - 知乎 (zhihu.com)

一文读懂Docker原理 - 廖雪峰的官方网站 (liaoxuefeng.com)

 

简单记录下部署的流程。

1、nginx配置

由于nginx在ECS中已经搭建好,所以我选择了直接搜索nginx.conf文件来进行反向代理的配置,并把已经编译好的前端代码放在了nginx的html文件夹下。

在终端中运行:

 find / -name nginx.conf

修改nginx.conf,注意配置主页所在的html目录,和转发给springboot后台程序的代理:

erver {
        listen       80;
        server_name  localhost;
     
# 配置前端文件的路径 location / { root html; index index.html index.htm; }       
    
     # 前端发给后台的请求,/api/是请求的格式,172.17.0.1是宿主机localhost在docker容器中的映射 location /api/ { proxy_pass hTTP:
//172.17.0.1:8080/; } }

浏览器中输入公网IP,确认能够看到前端主页。

2、配置msyql、rabbitmq和redis

为了使得浏览器可以访问到服务器的15672端口,需要在阿里云控制台修改安全组策略,这里是有风险的操作,因为可能会使得自己的服务器被攻击,我这里只是测试。

 修改完之后运行mq容器,登录后台页面,创建需要的channel(过程略)。

另外,运行mysql时不知道要从哪里看默认的root密码,所以只能修改my.cnf文件来免去密码输入(汗)。

建库、执行导入数据库脚本的过程略去。

3、打包jar文件,新开java容器运行

在项目对应的.yml文件中配置好生产环境要用的IP和端口号,注意这里的逻辑是转发给宿主机中其他容器暴露给外界的端口:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    url: jdbc:mysql://172.17.0.1:3306/mall?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
  redis:
    host: 172.17.0.1
    port: 6379
  rabbitmq:
    addresses: 172.17.0.1
    port: 5672
    username: guest
    password: guest

执行打包命令:

mvn clean package

将target目录下的jar包copy到云服务器上,不想装其他软件,让WSL中的scp代劳:

scp XXX-0.0.1-SNAPSHOT.jar root@XXX:XXX:XXX:XXX:

再用docker cp命令将文件复制给创建好的容器,最后用java -jar命令启动项目就好了。

逆天的来了,由于我的服务器只有2G,所以两个SpringBoot项目无法同时运行...不过每个模块单独上线时都测试过了基本功能,就当是成功部署了吧 :(

posted @ 2024-04-19 11:29  褪色回音  阅读(103)  评论(0)    收藏  举报