制作nginx的dockerfile文件,使用docker-compose启动服务
在之前的文章中,我们使用dockerfile制作了tomcat镜像文件启动了tomcat,本篇文章首先通过制作nginx的dockerfile文件先启动一个nginx,然后通过nginx文件实现两个tomcat服务器的负载均衡,最后通过docker-compose工具来实现三个docker容器(nginx服务器和两个tomcat服务器)的发布
制作nginx的dockerfile文件
构建nginx文件,实现两个tomcat文件的负载均衡
首先我们部署启动两个tomcat服务器,部署启动tomcat可以参考文章通过dockerfile文件创建tomcat容器并上传至docker仓库,tomcat启动成功后可以通过浏览器向服务器发送请求,服务器接受请求后将请求发送至nginx服务器,nginx服务器将请求分发至两台tomcat服务器,最终实现负载均衡
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream api {
server ip:10003 weight=1;
server ip:10002 weight=1;
}
#api服务配置
server {
listen 80;
server_name 域名;
add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept';
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
# access_log logs/web.access.log main;
charset utf-8;
location / {
proxy_pass http://api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* \.(eot|ttf|woff)$ {
add_header Access-Control-Allow-Origin *;
}
}
nginx实现负载均衡操作
上面是我配置的nginx文件,server_name是我接受请求的域名,proxy_pass http://api;表示将请求的处理交给命名为api的upstream,api中配置了请求转发的两个服务器的地址,ip:port,后面是对应的权重,当nginx接受到请求后,调用upstream,会根据对应的权重,选择最终由哪个ip:port地址来执行请求
制作nginx的dockerfile文件
与之前做tomcat的dockerfile文件差不多,首先是基础镜像,然后是定义需要进行覆盖的文件以及对应文件的路径,将我们的文件与基础镜像中的文件进行替换,不同的地方是,操作nginx需要相应的权限,所以需要对相应文件夹对应的权限
#基础镜像
FROM nginx:stable
##定义工作目录
ENV WORK_PATH /etc/nginx
#
##定义conf文件名
ENV CONF_FILE_NAME nginx.conf
#
##删除原有配置文件
RUN rm $WORK_PATH/$CONF_FILE_NAME
#
##复制新的配置文件
COPY ./$CONF_FILE_NAME $WORK_PATH/
#
##给shell文件赋读权限
RUN chmod a+r $WORK_PATH/$CONF_FILE_NAME
Dockerfile文件配置好了,启动,报错,不得不说搞清楚docker启动服务的内部文件脉络真的很重要,这里卡了我半天,因为我服务器上本身就有nginx,用起来一直没问题,但是用docker启动怎么启动怎么报错,XJB操作了一通发现没用,最后排除镜像问题,docker启动方式问题,dockerfile文件问题,最后还是锁定在了nginx文件上,但是我服务器启动nginx(非docker方式)没问题啊,关键是服务没起起来也没法看日志,最后想起来之前用的dockerui可以看启动日志,查看报错第一行就报错内容如下
发现这个报错后,我通过启动网易蜂巢pull的镜像然后进入到容器内部,此处需要注意的是 我在启动过程没有映射本地的nginx文件,只是单纯的使用了docker run 的方法,因为如果我映射自己的nginx.conf文件就会报错,此时更加印证了是nginx.conf出现问题的猜想,在进入启动的nginx容器内部发现了docker启动的nginx和服务器本身的nginx在logs这个目录上是有区别的
docker在nginx目录下是没有logs的,但是非docker下是有logs文件夹的,所以才会报这个错,然后我进入到nginx的配置文件中,发现自己定义了access.log的文件路径,导致文件启动的时候找不到这个文件,才会出现上面这个问题,把它去掉之后在做映射启动nginx,就可以顺利启动了
构建dockerfile文件主要是下载基础镜像,定义需要进行替换的配置文件,操作文件的替换,需要注意的是要对相应的文件赋读权限
nginx文件修改好后,重新构建镜像文件,command如下
docker build -t w2gnginx:0.0.1 .
镜像构建完成后,可以直接启动镜像文件,此处我们先单独启动该镜像文件,后面我们可以使用docker-compose命令直接启动
docker run --name=w2gnginx -p 80:80 -idt 5f2d4477b7e
启动tomcat服务器,完成nginx的负载均衡
通过dockerfile文件构建nginx并启动就结束了,然后我们在使用上章提到的方法创建两个tomcat文件,端口号分别为10002和10003,并将之分别启动,此时浏览器输入域名,请求则会分别转发到这两台服务器上
单个容器启动的弊端
此时我们有三个容器,一个nginx,两个tomcat,我们需要进行三次docker run,非常麻烦,对此,docker为我们提供了相应的工具,通过启动yml文件,来达到同时启动所需容器的目的
构建docker-compose文件
docker-compose是被用作启动多个容器应用的工具,通过yml文件配置启动容器服务
version: '2'
services:
nginx:
image: w2g_nginx:0.0.1
ports:
- "80:80"
restart: always
tomcat001:
image: 72d2be374029
ports:
- "10002:80"
volumes:
- /opt/api_tomcat/webapps:/usr/local/tomcat/webapps
- /opt/api_tomcat/server.xml:/usr/local/tomcat/conf/server.xml
network_mode: "host"
restart: always
tomcat002:
image: 5d859994672d
ports:
- "10003:80"
volumes:
- /opt/image_tomcat/webapps:/usr/local/tomcat/webapps
network_mode: "host"
restart: always
在docker-compose文件中,定义了3个需要运行的容器,在这里我简单说下用到的命令
- ports:需要映射的端口号
- volumes:配置文件映射的路径
- network_mode:为容器指定网络类型,version为1时使用net
我在此处在启动的时候需要注意的是80端口不能被占据,否则会导致启动失败
运行docker-compose,启动相关容器
进入到docker-compose.yml所在目录下,执行
docker-compose up -d
此时会发现所需容器都被启动了
本文主要是写了dockerfile启动nginx并实现负载均衡,和使用docker-compose完成多容器的启动,如有错误,欢迎指正