制作nginx的dockerfile文件,使用docker-compose启动服务


制作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完成多容器的启动,如有错误,欢迎指正

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342