没有作曲家运行multpe容器?

时间:2018-06-15 02:32:48

标签: docker nginx

嘿所有我有三个容器,我目前正在撰写

version: '2'

services:

  web:
    restart: always
    build:
      context: ./
      dockerfile: deploy-1w/web.dockerfile
    ports:
      - "9000:9000"
    links:
      - redis:redis
    volumes:
      - /usr/src/app
      - /usr/src/app/source/static
    env_file:
      - .env
    environment:
      - 'DEBUG=true'
      - 'DOCKER_COMPOSE_MODE=true'
      - 'APP_ENV=local'

  nginx:
    restart: always
    build:
      context: ./
      dockerfile: deploy-1w/nginx.dockerfile
    ports:
      - "80:80"
    volumes:
      - /www/static
    volumes_from:
      - web
    env_file:
      - .env
    links:
      - web:web
    environment:
      - "BACKEND_ADDR=web:9000"
      - 'DOCKER_COMPOSE_MODE=true'
      - 'APP_ENV=local'


  redis:
    restart: always
    build:
      context: ./
      dockerfile: deploy-1w/cache.dockerfile
    ports:
      - "6379:6379"
    volumes:
      - ./redisdata:/data

我试图在不使用compose的情况下运行这些(更多用于调试目的和理解作曲家实际上做什么比什么都多)但由于链接等我无法让它们运行(nginx使用代理传递和寻找web)的上游

这里是web

的Dockerfile
FROM python:2-onbuild

WORKDIR /usr/src/app/

RUN cp -rf /usr/src/app/src/* /usr/src/app/

# build dependencies
RUN apt-get update && apt-get install -y git-core rubygems ruby-dev gettext nano  \
    && wget nodejs.org/dist/v6.10.0/node-v6.10.0-linux-x64.tar.gz                 \
    && tar -C /usr/local --strip-components 1 -xzf node-v6.10.0-linux-x64.tar.gz

RUN pip install -r requirements.txt

RUN apt-get install nodejs-legacy -y                                              \
    && gem install sass compass                                                   \
    && npm install -g grunt-cli bower

# Bad command?
#RUN npm install -g

RUN npm install grunt@0.4.5 -g --save-dev                                         \
    && npm install                                                                \
    && bower install --allow-root

RUN grunt buildcss                                                                \
    && grunt buildjs --force


# Add the local settings file
COPY ./deploy-1w/config/local_settings.py /usr/src/app/source/source/local_settings.py


# copy the bootstrap script
COPY ./deploy-1w/web-bootstrap.sh  /usr/local/bin/web-bootstrap.sh
RUN chmod 775 /usr/local/bin/web-bootstrap.sh


WORKDIR /usr/src/app/source

# run bootstrap script
CMD ["/usr/local/bin/web-bootstrap.sh"]

Nginx的

FROM tutum/nginx

# backend web address
ENV BACKEND_ADDR 0.0.0.0:0


# build dependencies
RUN apt-get update && apt-get install -y gettext


# copy config template
COPY ./deploy-1w/config/nginx.conf /etc/nginx/nginx.conf.template


# copy static file to use as a health check
COPY ./deploy-1w/config/nginx-health-check /var/www/html/public/health-check


# copy the bootstrap script
COPY ./deploy-1w/nginx-bootstrap.sh  /usr/local/bin/nginx-bootstrap.sh
RUN chmod 775 /usr/local/bin/nginx-bootstrap.sh


# run bootstrap script
CMD ["/usr/local/bin/nginx-bootstrap.sh"]

和Redis

FROM debian:jessie

ENV REDIS_MAJOR_MINOR_VERSION 4.0
ENV REDIS_VERSION 4.0.10
ENV REDIS_TARBALL_SHA1 d2738d9b93a3220eecc83e89a7c28593b58e4909
ENV BACKEND_ADDR 0.0.0.0:0

RUN apt-get -q update && \
  DEBIAN_FRONTEND=noninteractive apt-get -qy --no-install-recommends install \
    build-essential \
    curl && \
  curl -O http://download.redis.io/releases/redis-$REDIS_VERSION.tar.gz && \
  [ $(shasum redis-$REDIS_VERSION.tar.gz | awk '{ print $1 }') = $REDIS_TARBALL_SHA1 ] && \
  tar zxf redis-$REDIS_VERSION.tar.gz && \
  cd redis-$REDIS_VERSION && \
  make -j$(nproc) && \
  cd src && \
  cp \
    redis-benchmark \
    redis-check-aof \
    redis-check-rdb \
    redis-cli \
    redis-sentinel \
    redis-server \
    /usr/local/bin && \
  cd ../.. && \
  rm -rf redis-$REDIS_VERSION redis-$REDIS_VERSION.tar.gz /tmp/* /var/tmp/* && \
  apt-get -qy purge build-essential curl && \
  apt-get -qy clean autoclean autoremove && \
  rm -rf /var/lib/{apt,dpkg,cache,log}/

COPY ./deploy-1w/config/redis.conf /etc/redis.conf

VOLUME /var/lib/redis

CMD ["/usr/local/bin/redis-server", "/etc/redis.conf"]

我真的试图去做我在作曲家里做的事......没有作曲家......

我正在做的是这个,而且它失败了

docker build -t redis-test -f deploy-1w/cache.dockerfile .
docker build -t nginx-test -f deploy-1w/nginx.dockerfile .
docker build -t web-test -f deploy-1w/web.dockerfile .

docker network create test-network

docker run -d -it -p --network test-network '6379:6379' redis-test
docker run -d -it -p --network test-network '9000:9000' --link $(docker ps -a | grep redis-test |awk '{print$1}') web-test 
docker run -d -it -p --network test-network '80:80' -e 'BACKEND_ADDR=web:9000' --link $(docker ps -a | grep web-test |awk '{print$1}') nginx-test

以上给我一个错误......

bash-4.4$ docker logs bc28bcd28653
nginx: [emerg] host not found in upstream "web" in /etc/nginx/nginx.conf:35

这里是nginx conf的相关部分

location / {
  proxy_pass http://${BACKEND_ADDR};    <-- Line 35
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
} 

1 个答案:

答案 0 :(得分:1)

我使用docker和nginx时遇到很多问题,因为我对一切都不太了解。 所以这是我的建议:

快速修复

添加

nginx:
    restart: always
    ....
    depends_on:
        - web

说明:

带上游的Nginx可能很有用,但如果上游不存在,那么nginx永远不会启动。 在docker案例中,您必须说网络应该在使用depends_on参数的nginx之前运行。

但是在将我的堆栈升级到docker swarm后,我发现depends_on不能再用于多个实例 我不记得了。

所以我想启动nginx,即使我的web服务器没有运行,简单的方法就是使用变量 在这样的nginx中:

      set $server_1 web;
      proxy_pass http://$server_1:8080;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header HOST $host;
      proxy_set_header X-NginX-Proxy true;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

我明确建议您使用最后一个docker-compose版本,因为您有更好的功能。 此外,使用链接已被弃用,我建议您使用docker network命令创建内部网络。 向它添加或删除实例非常有用,您可以节省时间和可维护性。

在没有作曲家的情况下运行多个容器

您需要为每个容器使用docker run命令

docker run -d --name web -p 9000:9000 ....
docker run -d --name nginx -p 80:80 ....