美文网首页
制作nginx的dockerfile文件,使用docker-co

制作nginx的dockerfile文件,使用docker-co

作者: 不改青铜本色 | 来源:发表于2018-11-23 13:56 被阅读0次

制作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可以看启动日志,查看报错第一行就报错内容如下

2.png

发现这个报错后,我通过启动网易蜂巢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完成多容器的启动,如有错误,欢迎指正

相关文章

网友评论

      本文标题:制作nginx的dockerfile文件,使用docker-co

      本文链接:https://www.haomeiwen.com/subject/ietdqqtx.html