我的小项目用到了两个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博客
简单记录下部署的流程。
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项目无法同时运行...不过每个模块单独上线时都测试过了基本功能,就当是成功部署了吧 :(
标签:ago,0.0,tcp,nginx,ECS,起意用,docker,com From: https://www.cnblogs.com/fadingecho/p/18145452