部署步骤简要描述如下
- 宿主机上部署docker服务
- docker.io 选择需要的镜像版本,并拉取到宿主机
- docker 部署mysql并进行初始化
- 部署tomcat、并将程序包放置到tomcat webapps中
- 部署nginx、域名配置
宿主机上部署docker服务
- docker的yum源 && 安装依赖
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y yum-utils device-mapper-persistent-data lvm2
- 查看当前yum源下docker版本并安装选择的版本
yum search docker --showduplicates
yum install -y docker-ce-18.09.9-3.el7.x86_64
- 修改docker默认数据目录(非必要、/目录空间较小时可选)
vim /usr/lib/systemd/system/docker.service
#在ExecStart 最后追加存储目录--graph /home/dockerdata
ExecStart=/usr/bin/dockerd --graph /home/dockerdata
- 配置镜像加速 因国内访问docker.io比较不稳定,可选择使用阿里提供的免费加速地址 加速地址在https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 中获取 /etc/docker/daemon.json 文件中添加以下内容
{
"live-restore": true,
"registry-mirrors": ["https://kb56o5ld.mirror.aliyuncs.com"]
}
- 启动docker 并配置开机启动
systemctl start docker && systemctl enable docker
选择需要的镜像版本
选择mysql版本为:5.7、tomcat版本为8.5、nginx版本为1.16 需注意的是,tomcat版本选择需注意jdk版本- pull镜像
docker pull nginx:1.16.1 && docker pull mysql:5.7 && docker pull tomcat:8.5
部署mysql
- 宿主机新建mysql数据目录
mkdir -p /home/Data/mysql
- 端口以及目录映射
docker run -d -p 3306:3306 --name mysql -v /home/mysqldata:/var/lib/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD="密码" mysql:5.7
- 数据库初始化 可使用mysql命令行或者navicat进行
部署tomcat
- 宿主机新建程序包目录
mkdir -p /home/App/webapps
- 启动容器,并将容器8080端口映射到宿主机8008
- link mysql容器,方便后续使用环境变量连接mysql服务
docker run -d -p 8008:8080 \
-v /home/App/webapps:/usr/local/tomcat/webapps \
-v /etc/localtime:/etc/localtime:ro \
--link mysql:mysql \
--name tomcat tomcat:8.5
- 查看tomcat容器中的环境变量 只运行了一个tomcat相关容器的前提下使用
docker exec -it `docker ps |grep tomcat|awk '{print $1}'` env
或者使用docker ps查到CONTAINER ID
docker exec -it ${CONTAINER ID} env
可以看到部署好的tomcat容器中env存在MYSQL相关环境变量
MYSQL_PORT=tcp://172.17.0.2:3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.2:3306
MYSQL_PORT_3306_TCP_ADDR=172.17.0.2
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT_33060_TCP=tcp://172.17.0.2:33060
MYSQL_PORT_33060_TCP_ADDR=172.17.0.2
MYSQL_PORT_33060_TCP_PORT=33060
MYSQL_PORT_33060_TCP_PROTO=tcp
MYSQL_NAME=/tomcat/mysql
MYSQL_ENV_MYSQL_ROOT_PASSWORD="密码"
MYSQL_ENV_GOSU_VERSION=1.7
MYSQL_ENV_MYSQL_MAJOR=5.7
MYSQL_ENV_MYSQL_VERSION=5.7.29-1debian10
在应用程序中JDBC相关配置使用以上环境变量即可;
- 程序包放置到webapps中
将代码war包或者解压的war包放置在/home/App/webapps,不能直接将编译好的内容放置到首层目录。
原因为:
官方镜像tomcat不能直接识别webapps下的文件,只是识别webapps下各个目录的内容,即单个tomcat 可部署多个应用程序;
在访问地址中使用IP:PORT/dist1/*** , IP:PORT/dist2/*** 区分,所以需要前置nginx来处理路径问题。
放置好的程序内容的目录结构如下:
部署nginx
- 分别新建nginx配置目录、日志目录等
mkdir -p /home/Config/nginx
mkdir -p /home/Logs/nginx
mkdir -p /home/Data/nginx/html
- 宿主机上初始化nginx.conf
- [1] 启动临时使用的nginx容器获取配置文件
docker run -itd nginx:1.16.1
docker cp ${CONTAINER ID}:/etc/nginx/nginx.conf /home/Config/nginx/nginx.conf
docker cp ${CONTAINER ID}:/etc/nginx/conf.d /home/Config/nginx/
#复制完成后,删除临时容器
docker stop ${CONTAINER ID} && docker rm ${CONTAINER ID}
容器化部署nginx麻烦在:要在宿主机新建nginx.conf(因为想直接宿主机修改配置、而不进入容器中)、否则-v 挂载之后容器docker会因没有配置文件无法启动;
- [2] 启动nginx容器
docker run -d -p 8005:80 \
-v /home/Data/nginx/html:/usr/share/nginx/html \
-v /home/Config/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/Config/nginx/conf.d:/etc/nginx/conf.d \
-v /etc/localtime:/etc/localtime:ro \
-v /home/Logs/nginx:/var/log/nginx \
--name nginx nginx:1.16.1
- 获取tomcat容器的IP
docker exec -it ${CONTAINER ID} ip a
- 配置域名proxy
cp /home/Config/nginx/conf.d/default.conf /home/Config/nginx/conf.d/test.conf
bash
修改
``` json
server {
listen 80;
#修改server_name为需要的域名
server_name dist.timodiediedie.again;
location / {
#意思为当直接访问/目录时,proxy到/dist/
proxy_pass http://172.17.0.3:8080/dist/;
}
#location /dist/中dist指 tomcat部署时webapps 下的目录名称
location /dist/ {
#意思为访问/dist/*** 时直接proxy到后端,不做路径处理
proxy_pass http://172.17.0.3:8080;
}
}
上面配置需要注意的点为,不同的应用对于url处理的规则不同,部分应用只需要配置location / 即可;
localtion /dist/ 的优先级高于 /,即无其他目录的location时,/ 的生效;存在其他目录location时,/最后生效。
- reload nginx 配置
docker exec -it ${CONTAINER ID} nginx -t
docker exec -it ${CONTAINER ID} nginx -s reload