Docker - пример связывание трех контейнеров на примере Python приложения, nginx, redis

Материал из Wiki - Iphoster - the best ever hosting and support. 2005 - 2023
Перейти к:навигация, поиск
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Docker - пример связывание трех контейнеров на примере Python приложения, nginx, redis

В примере - py приложение (1 контейнер) работающее с redis (1 контейнер) и доступное через nginx (1 контейнер). Всех их нужно связать.

# vi /root/Dockerfile
FROM python:2.7
RUN mkdir -p /code
COPY . /code
VOLUME [ "/code" ]
WORKDIR /code
RUN pip install -r requirements.txt
EXPOSE 5000
CMD [ "python", "/code/app.py" ]
FROM - название образа, взятого за основу
RUN - запустить команду в контейнере
COPY - скопировать файлы с одного места в другое
VOLUME - какие директории мы подключаем
WORKDIR - рабочая директория
EXPOSE - 5000 порт
CMD - запуск команды


# vi /root/app.py:
from flask import Flask
from redis import Redis
import os
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
   redis.incr('hits')
   return 'Hello World! I have been seen %s times.' % redis.get('hits')
if __name__ == "__main__":
   app.run(host="0.0.0.0", debug=True)


# vi requirements.txt
flask
redis


Собираем первый образ и запускам контейнер с эти образом:

# docker build -t flaskapp /root/
# docker run -d -P --name flaskapp flaskapp


Наш первый контейнер

# docker ps
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS              PORTS                     NAMES
377a255e8a1f        flaskapp            "python /code/app.py"   5 seconds ago       Up 4 seconds        0.0.0.0:32770->5000/tcp   flaskapp

Теперь подключаем контейнер с redis к контейнеру с py приложением.

# docker rm -f flaskapp
flaskapp
# docker run -d --name redis redis
# docker run -d -P --name flaskapp --link redis:redis flaskapp
# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
2942e75a05d6        flaskapp            "python /code/app.py"    42 seconds ago      Up 41 seconds       0.0.0.0:32771->5000/tcp   flaskapp
b3daf6504f4f        redis               "docker-entrypoint..."   48 seconds ago      Up 47 seconds       6379/tcp                  redis


Теперь создаем докер файл

# :> /root/Dockerfile
# vi /root/Dockerfile
FROM nginx:1.7.8
COPY flaskapp.conf /etc/nginx/conf.d/default.conf


# vi flaskapp.conf
server {
   listen 80;
   location / {
       proxy_pass http://flaskapp:5000;
   }
}


Собираем образ с нашим кастомным конфигом nginx:

#   docker build -t nginx-flask /root/
#   docker run --name nginx-flask --link flaskapp:flaskapp -d -p 8080:80 nginx-flask

Наши все контейнеры:

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
534ce3cfe883        nginx-flask         "nginx -g 'daemon ..."   2 minutes ago       Up 2 minutes        443/tcp, 0.0.0.0:8080->80/tcp   nginx-flask
2942e75a05d6        flaskapp            "python /code/app.py"    18 minutes ago      Up 18 minutes       0.0.0.0:32771->5000/tcp         flaskapp
b3daf6504f4f        redis               "docker-entrypoint..."   18 minutes ago      Up 18 minutes       6379/tcp                        redis


Проверяем как работает эта схема:

# curl ip:8080
Hello World! I have been seen 1 times.