嘿所有我有三个容器,我目前正在撰写
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
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;
}
答案 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 ....