docker-compose 一键部署 Nginx+Tomcat+Mysql+solo2.7.0

本贴最后更新于 2396 天前,其中的信息可能已经水流花落

服务器环境的搭建一直是一个对新手不友好的环节,但借助容器技术 Docker 和编排工具 Docker-Compose,我们可以非常方便的一次性完成配套环境的搭建及项目发布。

前言

先上项目代码: liumapp/solo-in-docker

拷贝到本地目录后,先运行 build-image.sh 脚本安装相关 Docker 镜像:Tomcat9, Mysql5 以及 Nginx。

至于 solo,则是直接在本地打包编译好,然后放置在 webapps 目录下,通过/conf/server.xml 的配置,来让 Tomcat 进行加载。首次运行的伙伴们可以不作修改直接使用。

整体环境配置

对于环境配置,我会做拆分来讲,因为单个容器的环境和多个容器的环境在运行上是有区别的,容器与容器之间的连接也要考虑。

打个比方,在 Nginx 容器中的 localhost:8080 并不会指向 Tomcat 容器中所监听的 8080 端口。

整体环境的配置,如果一个一个 Dockerfile 去写,那么是相当麻烦的,好在 Docker 有一个名为 Docker-Compose 的工具提供,我们可以使用它一次性完成整体环境的配置:

首先我们看看 docker-compose.yml 配置文件的内容:

version: "3"

services:
  mysql:
	container_name: mysql
	image: mysql:5.5.60
	restart: always
	volumes:
	  - ./mysql/data:/var/lib/mysql
	  - ./mysql/conf/mysqld.conf:/etc/mysql/mysql.conf.d/mysqld.cnf
	ports:
	  - "6603:3306"
	environment:
	  - MYSQL_ROOT_PASSWORD=adminadmin
  nginx:
	container_name: nginx
	restart: always
	image: nginx:1.13
	ports:
	  - 80:80
	  - 443:443
	  - 5050:5050
	  - 4040:4040
	volumes:
	  - ./conf/vhosts:/etc/nginx/conf.d
	  - ./logs:/var/log/nginx
	  - ./www/:/var/www/
	links:
	  - tomcat:t1
  tomcat:
	container_name: tomcat
	restart: always
	image: tomcat:9.0
	ports:
	  - 8080:8080
	  - 8009:8009
	volumes:
	  - ./webapps/solo.war:/usr/local/tomcat/webapps/solo.war
	  - ./conf/server.xml:/usr/local/tomcat/conf/server.xml
	  - ./logs:/usr/local/tomcat/logs
	links:
	  - mysql:m1
	  

可以看到,我们一共设置了三个 service,分别是 mysql, nginx, tomcat,其中,需要注意的地方是它们的 volumes 以及 links,其他的地方相信大家很容易理解。

mysql 环境配置

首先看看最简单的 mysql,它没有设置 links,因为是其他容器连接它,它也就不需要理会别的家伙了。但是 mysql 的 volumes 却是最为重要的,如果我们在这里不设置 volumes 的话,那么很棒,每一次 docker 重启,或者 mysql 的 container 重启,您辛辛苦苦产生的 database 数据就会一夜回到解放前:“啥都没有”。

所以 mysql 的 volumes,就设置了两点:

  • 指定 mysql 产生的 data 文件需要同步到宿主机的./mysql/data 目录下

  • 指定 mysql 的配置文件从宿主机的./mysql/conf/mysqld.conf 读取

那么至于 mysql 的配置文件中定义了什么内容,就由伙伴们自行研究吧。

nginx 环境配置

接下来我们看看 Nginx,它有 volumes,也有 links,那么这个地方的 volumes 我们就不解释了,大家可以参照 mysql 的解释来理解,重点看看 links,我们可以发现,Nginx 的 links 建立了与 tomcat 容器的连接,为什么呢,配置过 nginx+tomcat 的伙伴们应该会知道,nginx 负责监听 80 端口,tomcat 负责监听 8080 端口,nginx 接收到需要由 tomcat 来处理的请求就将请求转发到 8080。

那么在 docker 的环境下,nginx 直接将请求转发到 8080,tomcat 会接受到吗?答案肯定是不能的。

我们必须先定义一个 links,这里的值为 t1,那么在 nginx 负责转发的配置文件里,就要写上:

upstream backend {
	server t1:8080;
}

server {
	listen       80;
	server_name  localhost

	access_log off;

	location / {
		proxy_pass http://backend$request_uri;
		proxy_set_header  Host $host:$server_port;
		proxy_set_header  X-Real-IP  $remote_addr;
		client_max_body_size  10m;
	}
}

来告诉 nginx,tomcat 在哪里。

tomcat 环境配置

最后便是 Tomcat 了,它比较特殊,因为还有 solo 的 war 包需要发布上去。

但发布 solo 的 war 包我们只需要定义几个 volumes 的值便可以了。

volumes:
  - ./webapps/solo.war:/usr/local/tomcat/webapps/solo.war
  - ./conf/server.xml:/usr/local/tomcat/conf/server.xml

当然,server.xml 的配置必不可少,但是这个我们也不多说了。

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    492 引用 • 926 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    你好 我该怎么运行 build-image.sh?我已经放在 opt 下面了。也已经装好 docker 、docker-compose、 java。

  • 其他回帖
  • visus

    不客气啦

    1 回复
  • liumapp
    作者

    每次启动后,产生的数据库文件会存储在 mysql 目录的 data 目录下

  • liumapp
    作者

    厚脸皮 😳

  • 查看全部回帖