docker部署nginx+tomcat+mysql服务

1,251 阅读3分钟

部署步骤简要描述如下

  1. 宿主机上部署docker服务
  2. docker.io 选择需要的镜像版本,并拉取到宿主机
  3. docker 部署mysql并进行初始化
  4. 部署tomcat、并将程序包放置到tomcat webapps中
  5. 部署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