部署要求
宿主机为CentOS7,上面安装了docker、nginx和mysql。
1、把已经开发好的JavaWeb项目(pandawork-start)部署到docker容器里。
2、该JavaWeb项目使用宿主机的mysql。
3、容器设置静态ip为192.168.34.10,80端口映射为宿主机28080端口。
4、nginx配置可以通过网址pandawork.voidking.com
访问该JavaWeb项目。
软件准备
1、《Docker安装tomcat服务》一文中配置好的ubuntu/tomcat镜像。
2、假设宿主机中的mysql数据库密码为voidking,那么需要修改pandawork-start项目中的数据库配置文件(mybatis-config.xml),主机修改为192.168.34.1,密码修改为voidking。
3、打包JavaWeb项目的war包一份。
在pom.xml所在文件夹,执行mvn package -Dmaven.test.skip=true
命令,在target目录下就会生成war包。(把该war包放到tomcat的webapps文件夹里,会自动解压。)
4、使用xftp,上传war包到CentOS7的/download目录下。
数据库准备
1、使用navicat连接到宿主机mysql。
2、创建数据库pandawork,数据库名为pandawork,字符集选择utf8–UTF-8 Unicode,排序规则选择utf8_general_ci。
3、导入pandawork-start项目中的pandawork.sql文件。
部署项目
部署war包
1、启动ubuntu/tomcat镜像。docker run -i -t -v /download/:/mnt/software/ ubuntu/tomcat /bin/bash
2、移动war包到webapps。cd /mnt/software
mv pandawork-start.war /opt/apache-tomcat-8.0.44/webapps/
3、启动tomcat,自动解压war包。source /etc/profile
cd /opt/apache-tomcat-8.0.44/bin/
./startup.sh
4、测试访问。curl localhost:8080/pandawork-start/hello
5、关闭tomcat。./shutdown.sh
tomcat配置
1、配置tomcat端口为80。cd /opt/apache-tomcat-8.0.44/conf/
vi server.xml
找到:
1 | <Connector port="8080" protocol="HTTP/1.1" |
修改为:
1 | <Connector port="80" protocol="HTTP/1.1" |
2、配置域名访问。
找到:
1 | <Engine name="Catalina" defaultHost="localhost"> |
修改为:
1 | <Engine name="Catalina" defaultHost="pandawork.voidking.com"> |
找到:
1 | <Host name="localhost" appBase="webapps" |
修改为:
1 | <Host name="pandawork.voidking.com" appBase="webapps" |
测试启动
1、启动tomcat。cd /opt/apache-tomcat-8.0.44/bin/
./startup.sh
2、在/etc/hosts文件中,添加
1 | 127.0.0.1 pandawork.voidking.com |
3、测试访问。curl pandawork.voidking.com
4、关闭tomcat。./shutdown.sh
保存容器
1、退出容器exit
2、查看dockeriddocker ps -l
3、保存容器为ubuntu/pandawork镜像。docker commit 87be ubuntu/pandawork
网络配置
1、创建自定义网络,选取192.168.34.0网段。
1 | docker network create --subnet=192.168.34.0/24 voidkingnet |
2、选取192.168.34.10作为静态IP地址,启动ubuntu/pandawork镜像。
1 | docker run -d -p 28080:80 --name pandawork1.0 --add-host pandawork.voidking.com:127.0.0.1 --net voidkingnet --ip 192.168.34.10 ubuntu/pandawork /run.sh |
我们已经在容器中修改了/etc/hosts文件,为什么还需要–add-host参数?
这是因为容器中的hosts文件,在重启后会恢复初始设置,改了也没用。
实际上,在容器中配置tomcat的时候,如果
1 | <Engine name="Catalina" defaultHost="localhost"> |
1 | <Host name="localhost" appBase="webapps" |
那么,–add-host参数不加也可以。貌似画蛇添足,实际上不然,有些项目可移植性比较差,必须配置本地hosts。
3、查看运行状态。docker ps
4、测试访问。curl 192.168.34.10
或者curl localhost:28080
5、关闭容器docker kill pandawork1.0
6、再次启动容器docker start pandawork1.0
nginx配置
1、在宿主机中,找到nginx安装位置ps aux | grep nginx
2、进入nginx配置目录
在《在CentOS7上配置PHP运行环境》一文中,小编的nginx是通过EZHTTP安装的。
cd /usr/local/nginx/conf
,进入nginx配置文件目录。cd vhost
,具体的某个站点的目录,都在vhost目录下。
3、修改nginx配置文件
参照项目:https://github.com/voidking/nginx-conf ,在vhost目录下,新建pandawork.voidking.com.conf文件,内容如下:
1 | upstream pandawork{ |
4、重新加载nginx配置文件cd /usr/local/nginx/sbin
,./nginx -s reload
报错:
1 | nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory) |
解决办法:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
然后重新执行./nginx -s reload
。
hosts配置
1、在宿主机中,修改/etc/hosts文件,添加:
1 | 127.0.0.1 pandawork.voidking.com |
2、测试访问。
在宿主机中,curl pandawork.voidking.com
。
最终测试
1、在宿主机中关闭防火墙,systemctl stop firewalld.service
。
2、假设宿主机IP为192.168.56.101,那么在宿主机同局域网PC中配置hosts:
1 | 192.168.56.101 pandawork.voidking.com |
3、浏览器中输入http://pandawork.voidking.com
,看到“Hello World!”。
4、验证注册登录等功能,全部正常。此次,大功告成。
重启宿主机后报错
重新启动宿主机后,启动docker,启动pandawork容器。
执行docker start pandawork1.0
时,报错如下:
1 | Error response from daemon: driver failed programming external connectivity on endpoint pandawork1.0 (9f3cbc9ebc5030c0cbbbbbac81628ce48374fd392f6995f4d75ac20bce9d2a30): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 28080 -j DNAT --to-destination 192.168.34.10:80 ! -i br-024154a13bb1: iptables: No chain/target/match by that name. |
解决办法:pkill docker
iptables -t nat -F
ifconfig docker0 down
最后重启docker,docker restart docker
。