https://verstaem.com/devops/docker-php-development/
https://habrahabr.ru/post/322440/
https://system-admins.ru/nginx-dlya-balansirovki-nagruzki-v-klastere-docker/
https://habrahabr.ru/post/314012/
https://habrahabr.ru/post/311890/
Из крон в яндекс диск.
#!/bin/bash TIME=date +%Y-%m-%d-%H-%M-%S
SERVER_NAME="SERVER_NAME" MYSQL_FILE=/tmp/$SERVER_NAME-mysql.$TIME.sql.gz FS_FILE=/tmp/$SERVER_NAME-fs.$TIME.tar.gz # Archiving databases mysqldump -u MYSQL_USER --password=MYSQL_USER_PASS MYSQL_DB | gzip > $MYSQL_FILE if [ -f $MYSQL_FILE ]; then echo $TIME" db dump created" # Uploading to the cloud curl --user YA_USER@yandex.ru:YA_PASS -T "{$MYSQL_FILE}" https://webdav.yandex.ru/backup/database/ #Delete archve rm $MYSQL_FILE fi # Archiving filesystem tar czfP $FS_FILE /var/www/SITE_PATH if [ -f $FS_FILE ]; then echo $TIME" fs achive created" # Uploading to the cloud curl --user YA_USER@yandex.ru:YA_PASS -T "{$FS_FILE}" https://webdav.yandex.ru/backup/files/ #Delete archve rm $FS_FILE fi
Запуск Python Flask в докере
FROM python:3.6.5-alpine MAINTAINER: BVM #В будущем в COPE нужно прописать путь, куда будут сохраняться инфо #после гашения образа эта инфа не пропадет COPY ./ WORKDIR / RUN pip3 install -r requirements.txt ENTRYPOINT ["python"] CMD ["flask_test.py"]
Flask
from flask import Flask app = Flask(name)
@app.route('/') def hello_world(): return 'Flask in container'
if name == 'main': app.run(debug=True, host='0.0.0.0')
docker build -t flask_test docker images - посмотреть доступные образы docker run -d -p 80:5000 flask_test - запускает образ с проброской 80 порта из образа в 5000 хостовой os docker ps -a -q - посмотреть запущенные образы docker stop $(docker ps - a -q) - остановить все запущенные образы docker rm $(docker ps - a -q) - удалить все образы
5.localhost:5000 Видим в броузере Flask in container
Промежуточный итог по созданию окружения и деплоя. Ставим VmWare, качаем образ ubuntu 18 LTS live server. Заводим пользователя, пароль. Делаем сеть Bridge, при этом виртуалка получит IP от DHCP роутера, хост и вирт будут в одной подсети с разными IP. ifconfig /all - посмотреть все сетевые соединения. На хост машине расшарить интернет, тогда виртуалка сможет ходить в инет. По умолчанию в ubuntu ufw отключен, можно пользоваться.
Ставим VmWare tools, что позволит монтировать папку с сырцами из хост машины прямо в виртуалку. sudo mkdir /mnt/cdrom ls /mnt/cdrom tar xzvf /mnt/cdrom/VMwareTools-x.x.x-xxxx.tar.gz -C /tmp/ cd /tmp/vmware-tools-distrib/ sudo ./vmware-install.pl -d sudo reboot Грузит с диска, запускает скрипт перла, ставит (нужен перл, по умолчанию есть в убунту). Проверяем чтобы в настройках виртуальной машине была указана папка для шары, иначе не сработает монтирование hgfs. sudo /etc/init.d/vmware-tools start Создаем символическую ссылку в свой домашний каталог. mkdir /home/bvm84/flask ln - s /mnt/hgfs/flask /home/bvm84/flask cd /home/bvm84/flask rm flask - удалить симв. ссылку (rmdir - удалить директорию)
Ставим docker sudo apt-get install docker-ce (возможно поставит не последнюю версию, неважно). Еще нужно chmod и чтобы docker без sudo Ставим docker-compose sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version
Пишем образ для flask FROM python:3.6.5-alpine MAINTAINER Brendel Vadim brendel.vadim@gmail.com COPY . /app WORKDIR /app RUN file="$(ls -1 /app)" && echo $file
ENTRYPOINT ["python"] CMD ["test_run.py"]
Делаем образ и сразу ставим ему таг docker build -f docker_python -t flaskbp:latest docker tag flaskbp bvm84/flaskbp docker login docker push bvm84/flaskbp
Пишем docker-compose yml файл version: '3' //версия docker-compose services: flask: image: bvm84/flaskbp web-server: image: nginx:alpine ports:
Запуск docker-compose -f docker_flask_compose.yml up -d без -d зависает в attaching, что-то связано с логами, непонятно что. docker-compose -f docker_flask_compose.yml down - гасит все Как то оно соберется или нет. Зависит от верности eml файла.
Окончательный вариант
Dockerfile
FROM python:3.6.5-alpine MAINTAINER Brendel Vadim brendel.vadim@gmail.com
RUN echo "http://dl-4.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
RUN apk --update add --no-cache
lapack-dev
gcc
freetype-dev
RUN apk add --no-cache --virtual .build-deps
gfortran
musl-dev
g++
RUN ln -s /usr/include/locale.h /usr/include/xlocale.h
COPY . /app WORKDIR /app RUN file="$(ls -1 /app)" && echo $file RUN pip3 install -r requirements.txt
RUN apk del .build-deps
EXPOSE 5090 ENTRYPOINT ["python"] CMD ["test_run.py"]
.dockerignore
.git .idea pycache conf.d venv
flaskapp.conf
server { listen 80; server_name localhost;
location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host;
proxy_pass http://flaskapp:5090; } }
docker-compose.yml
version: '3' services: flaskapp: build: context: . networks:
nginx: image: nginx:alpine ports:
volumes:
depends_on:
networks:
networks: web_nw: driver: bridge
test_app.py
from flask import Flask, request, render_template
app = Flask(name)
@app.route('/') def my_form(): return render_template('my_form.html')
@app.route('/', methods=['POST']) def my_form_post(): text = request.form['text'] processed_text = text.upper() return processed_text
if name == 'main': app.run(debug=True, host='0.0.0.0', port=5090)
docker-compose build --no-cache - cоздаем образы. docker-compose down --rmi all - гасим и удаляем. docker-compose up -d - поднимает образы docker-compose down - гасит образы docker-compose logs flaskbp_flaskapp_1 - выводит лог
Из-за дебильной винды, чтобы простировать API приходится писать вот такой изврат: curl -X PUT -H "Content-Type: application/json" -d "{ "id": "1212", "upw": [12, 12, 13] }" http://localhost:5090/123 curl -X PUT -H "Content-Type: application/json" -d @data.json http://localhost:5090/123
curl -X GET -H "Content-Type: application/json" -d @data.json http://localhost:5090/api/get_bp curl -X GET -H "Content-Type: application/json" -d @put_data.json http://localhost:5090/api/db_service curl -X GET http://localhost:5090/api/db_service?action=db_list