Поиск

Найдены 15 статей по слову "docker"

Пример nginx + letsencrypt для docker-compose

Внесите в ваш docker-compose.yml следующие изменения и оставьте открытыми порты (80 и 443) только в сервисе nginx-proxy и добавьте VIRTUAL_HOST и LETSENCRYPT_HOST в environments в ваш сервис (или сервисы), который слушает 80 порт (можно использовать и другие порты/настройки, см. ниже):

version: '2'

services:

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./vhost.d:/etc/nginx/vhost.d:ro
      - ./data/certs:/etc/nginx/certs
      - ./data/html:/usr/share/nginx/html
      - ./proxy.conf:/etc/nginx/proxy.conf

  nginx-proxy-letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    restart: always
    environment:
      - DEFAULT_EMAIL=crusat@yandex.ru
      - NGINX_PROXY_CONTAINER=nginx-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/acme.sh
      - ./vhost.d:/etc/nginx/vhost.d
      - ./data/certs:/etc/nginx/certs
      - ./data/html:/usr/share/nginx/html

  server:
    # ...
    environment:
      - VIRTUAL_HOST=example.ru
      - LETSENCRYPT_HOST=example.ru

  # ...

Создайте в корне файл proxy.conf:

# HTTP 1.1 support
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
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 $proxy_x_forwarded_proto;
proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;
proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;

# Mitigate httpoxy attack (see README for details)
proxy_set_header Proxy "";

# additional
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
send_timeout 3000;

Создайте файл vhost.d/default:

## Start of configuration add by letsencrypt container
location ^~ /.well-known/acme-challenge/ {
    auth_basic off;
    auth_request off;
    allow all;
    root /usr/share/nginx/html;
    try_files $uri =404;
    break;
}
## End of configuration add by letsencrypt container

client_max_body_size 200m;

Также, если необходимо несколько доменов, то можно добавить прокси по имену домена, например, vhost.d/example.ru:

## Start of configuration add by letsencrypt container
location ^~ /.well-known/acme-challenge/ {
    auth_basic off;
    auth_request off;
    allow all;
    root /usr/share/nginx/html;
    try_files $uri =404;
    break;
}
## End of configuration add by letsencrypt container

server_tokens off;
client_max_body_size 2000m;

Для дополнительной документации смотрите сюда: https://hub.docker.com/r/jwilder/nginx-proxy/

devops docker

Чиним вход через ЕСИА с ГОСТ-2012

Сухая выдержка без мата “ЧТО ДЕЛАТЬ”.

Предполагается, что вы уже получили папку (например, “MySite.001”), содержающую файлы header.key, masks.key, masks2.key, name.key, primary.key, primary2.key.

Все это делаем под Windows 10.

  1. Покупаем софт у ЛИССИ P12FromGostCSP http://soft.lissi.ru/ls_product/utils/p12fromcsp/ (на момент написания статьи стоит 2990 руб)
  2. Ждем письмо, при необходимости скорости пишем им в саппорт, почта саппорта указана при покупке.
  3. Присылают письмо с лицензией и ссылкой на скачивание P12FromGostCSP и скачиваете его. Пока не запускаем.
  4. Копируете папку “MySite.001” на флешку (любую).
  5. Устанавливаем триальный КриптоПРО CSP.
  6. Запускаем “Инструменты КриптоПРО”.
  7. Переходим во вкладку Контейнеры, он подгрузит контейнер “MySite.001” с флешки (у него будет уже нормальное имя), жмем Импортировать. Пароль обычно 12345678.
  8. Запускаем P12FromGostCSP, он подгрузит ключ из КриптоПРО. Жмем Экспортировать, выбираем папку.
  9. Все, у вас есть корректный PFX файл, который содержит сертификат и закрытый ключ.
  10. Теперь устанавливайте docker (если его еще нет).
  11. Из директории где лежит p12.pfx выполняете команду (потребуется ввести пароль): docker run –rm -v `pwd`:`pwd` -w `pwd` -it rnix/openssl-gost openssl pkcs12 -in p12.pfx -nocerts -out key.pem -nodes
  12. В директории должен появиться закрытый ключ key.pem.
  13. Далее выполняете из той же директории команду: docker run –rm -v `pwd`:`pwd`-w `pwd` -it rnix/openssl-gost openssl pkcs12 -in p12.pfx -nokeys -out cert.pem
  14. Появится файл сертификата cert.pem.
  15. Далее необходимо сгенерировать публичный ключ из сертификата (необходим для проверки подписи): docker run –rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl x509 -pubkey -noout -in cert.pem > pubkey.pem
  16. Готово, эти ключи понимает openssl с поддержкой ГОСТ-2012. Рекомендую использовать сборку php-fpm отсюда: https://github.com/rnixik/docker-openssl-gost
  17. Также потребуется применить эти файлы к вашему коду. Тут уже сами - у каждого свой код.

Для проверки используйте следующий код.

Подпись

Создайте файл с любым текстовым содержимым, например file.txt:

Some Data

Далее необходимо подписать файл (выходом будет бинарный формат, поэтому делаем base64):

docker run --rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl dgst -md_gost12_256 -sign key.pem file.txt | base64 > signed.txt

Проверяйте, что файл появился и у него есть содержимое.

Проверка

Далее, раскодируем из base64 в бинарный формат:

base64 -D -in signed.txt > signed.bin

И проверяем подпись, сравнивая с исходным файлом и подписью:

docker run --rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl dgst -md_gost12_256 -verify pubkey.pem -signature signed.bin file.txt

////////////////

Также обратите внимание на этот репозиторий (сделал REST-сервис для подписи и проверки подписи): https://github.com/crusat/openssl-gost-rest

////////////////

Источник: боль, кровь и мои слезы.

openssl

Docker показывает IP контейнера, а не пользователя

Это в первую очередь касается PHP проектов.

Делаем две вещи. Первое - для reverse proxy (если используется) у nginx дописываем в раздел следующее:

server {
    ...
    location / {
        ...
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ...
    }
    ...
}

И рестартим nginx.

После этого у нас для переменной $_SERVER['HTTP_X_REAL_IP'] будет правильный IP-адрес клиента, а для $_SERVER['REMOTE_ADDR'], скорее всего, останется неправильной.

Второе, что делаем - надо прокинуть правильную переменную в fastcgi_param. Идем во внутренний nginx и исправляем конфиг:

server {
    ...
    location ~ \.php$ {
        ...
        fastcgi_param REMOTE_ADDR $http_x_real_ip;
        ...
    }
    ...
}
devops nginx php

Ошибка ERROR: network site_default is ambiguous (2 matches found based on name)

Когда что-то пошло не так при работе с docker/docker-compose, вы можете увидеть эту ошибку.

Решение:

<span>1.</span> Выполняем команду docker network ls, чтобы увидеть, какиие сети докера есть.

Пример вывода:

2bb4da84a955        site_default   bridge              local
a51623d2e6f7        site_default   bridge              local

<span>2.</span> Удаляем сети.

docker network rm 2bb4da84a955
docker network rm a51623d2e6f7

<span>3.</span> Далее, можно работать в обычном режиме с докером.

docker

Проверка веб-ресурса на уязвимости с помощью OpenVAS

OpenVAS - это автоматизированное средство проверки серверов на уязвимости.

ВНИМАНИЕ! Вы имеете право проверять только свои серверы. Проверка чужих незаконна, т.к. это является взломом.

Самое удобное для тестирования - использовать докер. Если вы с ним еще незнакомы, то почитайте эти статьи: раз, два.

docker run -d -p 443:443 --name openvas mikesplain/openvas

Далее заходим по адресу https://localhost и жмем кнопку “Подробнее” и “Сделать исключение для этого сайта” (у него самоподписанный SSL-сертификат).

Заходим в админку (иногда приходится очень долго ждать, вплоть до 5 минут, пока все запустится):

Логин: admin
Пароль: admin

Переходим в верхнем меню в Scans -> Tasks. Слева сверху наводим на волшебную палочку (маленькая фиолетовая иконка). После этого появляется окно с просьбой ввести хост или IP-адрес. Вводим туда что-то, например, crusat.ru. После этого запускается анализ сервера на уязвимости. Это займет некоторое время, можно отслеживать прогресс в столбце “Status”.

После того, как статус сменился на “Done”, можно нажать на единичку в столбце “Reports”. После этого вы перейдете на список отчетов. В нем надо нажать в первом столбце (поле “Date”) на заголовок отчета - после этого откроется список найденных уязвимостей с отображением их критичности и описанием (по клику можно посмотреть подробности).

Также, можно скачать отчет. Для этого слева от главного заголовка “Report: Results” надо навести на стрелочку и выбрать первый пункт (“Report: Summary and Download”). Он перебросит на страницу с двумя отчетами - отфильтрованный и полный. Справа от каждого есть поле выбора (там можно выбрать, например, PDF) и зеленая стрелочка - по ней можно скачать отчет в выбранном формате.

В целом, рекомендую покопаться в интерфейсе - много интересного можно найти.

Удачи и держите свои машины в безопасности!

bash devops docker сайты

Что такое Docker и что делать, если ваша команда его уже использует?

Что такое вообще этот docker и зачем он нужен?

Он обеспечивает изоляцию выполняемых программ в нем от окружения (программного обеспечения и настроек) вашей операционной системы.

Например, вы работаете над проектом, который использует PHP версии 7. И вдруг к вам на техподдержку приходит проект, который работает максимум на PHP 5.3. Что делать? Если не использовать Docker (или подобное ПО), то вам придется иметь на вашей рабочей машине две версии PHP и разруливать их. Учитывая остальное необходимое для работы приложения ПО, система довольно быстро замусоривается и вполне могут начаться конфликты между ПО, который необходим для одного проекта и неприемлим для другого.

Вы можете рассматривать контейнер docker’а как легковесную виртуальную машину (аналог vmware, virtualbox и т.п.). Только без графического интерфейса и выполняющую определенную программу.

Некоторые термины

Проект - исходный код и конфигурации проекта, над которым вы работаете, обычно находится в одном git-репозитории.

Образ - операционная система и набор программ, которые можно использовать для создания контейнера (программистам проще представлять его как “Класс”). Примеры - Ubuntu 18.04 с установленным PHP 7.1; Debian с установленным nginx; CentOS с установленным MySQL 5.7.

Контейнер - созданный на основе образа экземпляр, может накапливать внутри себя изменения (программистам проще представлять его как “Объект, экземпляр класса”).

Какая разница между командами docker и docker-compose?

Команда docker просто выполняет команду, которая следует в параметрах, например docker run hello-world запустит образ hello-world и покажет результат его выполнения.

Команда docker-compose работет с конфигурациями (файлы формата *.yml), которые содержат инструкции для сборки проекта. Также, он может запускать несколько контейнеров сразу, а не только один как команда docker.

Для разработки обычно используется docker-compose, т.к. он позволяет удобно передавать конфигурацию сборки между разработчиками.

Я только получил проект, что делать?

Для начала надо поднять проект локально. Для этого выполняется команда:

docker-compose up

Параметр up создает необходимые для работы проекта контейнеры. Если контейнеры уже были созданы, то он запускает их.

В самом простом случае этого должно быть достаточно чтобы запустить проект и начать работу.

Что за параметр -f?

Вам могла попадаться команда вида:

docker-compose -f docker-compose-dev.yml up

Параметр -f <путь_к_файлу_yml> позволяет указать путь к файлу конфигурации для запуска проекта.

Дело в том, что когда мы не указываем этот параметр, то это равнозначно -f docker-compose.yml - т.е. это стандартный путь к файлу конфигурации.

Т.е., две следующие команды - равнозначны (делают одно и то же):

docker-compose up
docker-compose -f docker-compose.yml up

Но, возможно есть несколько файлов конфигурации (например, один запускает только базу данных - docker-compose-db.yml, другой целиком бекенд - docker-compose-backend.yml, третий проект в продакшн режиме - docker-compose-production.yml), тогда и пригождается эта команда. В ней можно указать полный путь, например, /home/user/myproject/myconfigs/my-docker-compose.yml. Его можно применять для любого из параметров (up, down, start, stop, build и т.п.). Ставится всегда перед параметром, т.е. docker-compose -f <путь> <параметр start|stop|down|up|build>.

Что за параметр -d?

Это запуск проекта в фоновом режиме.

Например:

docker-compose up -d

Поднимает проект в фоне, т.е. вы не увидите логов приложения без особых команд. Ставится всегда после параметра, т.е. docker-compose <параметр> -d.

Я закончил работу с проектом, что делать?

Можно выполнить одну из двух команд.

Эта команда просто остановит контейнеры, то есть вы сможете быстро их запустить позже (командой docker-compose start):

docker-compose stop

А эта команда остановит и удалит контейнеры проекта, то есть вы освободите место на жестком диске, но запуск контейнеров будет производится дольше:

docker-compose down

Помните, что если вы использовали особую конфигурацию для поднятия проекта (параметр -f), то его же надо использовать и для этих команд, например, docker-compose -f docker-compose-db.yml stop.

Как посмотреть, какие контейнеры сейчас запущены?

Эта команда покажет запущенные контейнеры:

docker ps

А эта все созданные контейнеры:

docker ps -a

По названию контейнеров можно понять, какой проект работает. Лучше всего, когда вы запускаете только тот проект, с которым работаете, а остальные выключаете, тогда количество проблем будет минимально.

devops docker

Как проще всего развернуть Django-проект через Docker

Приведу здесь пошаговое руководство. Как устанавливать и использовать сам фреймворк здесь не описано, так что, при необходимости, обратитесь к официальной документации .

Структура проекта

<span>1.</span> Начнем с приложения. Создадим директорию, в которой будет проект (здесь я создаю его в домашней директории, может находиться где угодно):

$ mkdir ~/my_app

В корне будут храниться файлы конфигураций, так что приложение сгенерирем в поддиректории.

<span>2.</span> Сгенерируем в этой директории Django-приложение:

$ django-admin startproject app

<span>3.</span> Базово настроим Django-проект:

$ cd ~/my_app/
$ virtualenv -p python3.6 venv
$ source venv/bin/activate
$ pip install django
$ pip install python-dotenv
$ pip install psycopg2-binary
$ pip install gunicorn
$ pip freeze > ./app/requirements.txt

Объясню решение по поводу venv. Рекомендую сделать виртуальное окружение на уровень выше приложения, чтобы он не мешал при сборке докер-образа в будущем (чтобы не отправлялся контекст в докер при сборке и образ собирался быстрее).

Из requirements.txt удалите строку pkg-resources==0.0.0 (такой версии не существует и она сломает установщик).

В my_app/app/app/settings.py надо переменные для БД брать из файла .env (см. документацию к python-dotenv):

import os
from dotenv import load_dotenv

load_dotenv()

SECRET_KEY = os.getenv("SECRET_KEY")
DEBUG = bool(os.getenv("DEBUG"))

# ...

ALLOWED_HOSTS = ['*']

# ...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('POSTGRES_DB'),
        'USER': os.getenv('POSTGRES_USER'),
        'PASSWORD': os.getenv('POSTGRES_PASSWORD'),
        'HOST': os.getenv('POSTGRES_HOST'),
        'PORT': os.getenv('POSTGRES_PORT'),
    },
}

# ...

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    # os.path.join(BASE_DIR, '..', "frontend", "src"),
)
STATIC_ROOT = os.path.join(BASE_DIR, '..', 'public', 'static')

MEDIA_ROOT = os.path.join(BASE_DIR, '..', 'public', 'media')
MEDIA_URL = '/media/'

# ...

<span>4.</span> Создаем файл .env в корне (~/my_app/.env), пример содержимого:

SECRET_KEY=1234567890

DEBUG=1

POSTGRES_DB=db
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_HOST=localhost
POSTGRES_PORT=5432

<span>5.</span> Теперь создадим docker-compose конфигурацию, которая поможет нам при разработке. Положим файл в корень проекта:

Файл docker-compose.yml:

version: '3' 

services:
  db: 
    image: postgres:11-alpine
    env_file:
      - .env
    volumes:
      - ./postgresql/dumps:/code/dumps
      - ./postgresql/data:/var/lib/postgresql/data
    restart: always
    ports:
      - "${POSTGRES_PORT}:5432"

В данном файле можно обратить внимание на env_file - это откуда будут применены переменные окружения (логин, пароль, имя базы данных при первом создании).

Также, если вы не хотите, чтобы при рестарте компьютера контейнер с базой данных автоматически запускался, то удалите строчку restart: always

И последнее - все хранилища будут находиться в директории проекта.

<span>6.</span> Протестируем, что все нормально работает для разработки:

$ cd ~/my_app
$ docker-compose up -d
$ source venv/bin/activate
$ python app/manage.py migrate

<span>7.</span> Инициализируем в корне приложения git-репозиторий и настроем удаленный репозиторий (наконец-то бесплатные приватные репозитории на github), например:

$ cd ~/my_app/
$ git init
$ git remote add origin https://github.com/crusat/test.git

И не забудьте сделать файл .gitignore, например:

*.pyc
*.log
__pycache__
/app/venv/
db.sqlite3
.DS_Store
/public/*
!/public/favicon.ico
/.idea/
.vscode/
*.history
/reports/
.coverage
*.swp
/htmlcov/
*.ipynb
.env
nohup.out
/postgresql/
tmp

И запушить:

$ git add .
$ git commit -am "initial"
$ git push -u origin master

Подготовка к деплою

<span>8.</span> Регистрируем на докер хабе (можно использовать gitlab registry и т.п.) новый репозиторий https://cloud.docker.com/repository/create - в него мы будем пушить образы. В будущем для этого можно сделать автоматическую сборку, но пока делаем в ручном режиме, для понимания. Назовем репозиторий, например, “test”.

<span>9.</span> Теперь надо сбилдить образ, который мы будем деплоить. Для этого в директории ~/my_app/app/ создадим файл Dockerfile:

FROM python:3.6-stretch

ENV PYTHONUNBUFFERED 1

# Здесь можно добавлять пакеты, которые необходимы для работы приложения
RUN apt update && apt install -y python3-dev

WORKDIR /code

# Сначала копируем requirements.txt, для того, чтобы образ собирался быстрее (см. слои докера)
COPY requirements.txt /code/
RUN pip install -r requirements.txt

# Далее копируем сам код приложения
COPY . /code/
WORKDIR /code/

EXPOSE 8000

И файл run.sh там же с содержимым:

#!/usr/bin/env sh

python ./manage.py migrate
python ./manage.py collectstatic --noinput
gunicorn --forwarded-allow-ips=* --bind 0.0.0.0:8080 -w 2 app.wsgi:application

Запускаем билд, потом авторизуемся на удаленном сервере, затем пушим в удаленный репозиторий докерхаба.

$ docker build -t crusat/test .
$ docker login
$ docker push crusat/test

Замените “crusat/test” на ваше имя пользователя и имя репозитория.

<span>10.</span> Теперь подготовим docker-compose.yml для удаленного сервера.

Создаем директорию ~/my_app/deploy

Создаем файл ~/my_app/deploy/docker-compose.yml с содержимым:

version: '3'

services:

  server:
    image: nginx:alpine
    restart: always
    depends_on:
      - web
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./public:/code/public

  web:
    image: crusat/test:latest
    command: sh -c "/code/run.sh"
    restart: always
    env_file:
      - .env
    depends_on:
      - db
    volumes:
      - ./public:/code/public

  db:
    image: postgres:10-alpine
    restart: always
    env_file:
    - .env
    volumes:
    - ./postgres/data:/var/lib/postgresql/data
    - ./postgres/dumps:/dumps

Замените в этом файле “crusat/test” на ваши данные.

Также, создайте в этой директории файл .env аналогичным тому, который лежит в корне.

И положите файл nginx.conf там же со следующим содержимым:

# daemon off;
worker_processes  auto;

pid  /var/run/nginx.pid;

events {
    worker_connections  1024;
    multi_accept on;
    use epoll;
}

http {
    default_type application/octet-stream;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    types_hash_max_size 2048;
    client_max_body_size 1G;

    include /etc/nginx/mime.types;

    server {
        listen 80;
        server_name _;

        # gzip begin
        gzip on;
        gzip_disable "msie6";

        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_min_length 256;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
        # gzip end

        location /media/ {
            root /code/public;
            expires max;
            try_files $uri$args $uri =404;
        }

        location /static/ {
            root /code/public;
            expires max;
            try_files $uri$args $uri =404;
        }

        location = /favicon.ico {
            alias /code/public/favicon.ico;
        }

        location / {
            proxy_pass http://web:8000;
            proxy_set_header Host $http_host;
            proxy_set_header Connection "upgrade";
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Upgrade $http_upgrade;
            proxy_connect_timeout       600;
            proxy_send_timeout          600;
            proxy_read_timeout          600;
            send_timeout                600;
        }
    }
}

Удаленная машина

<span>1.</span> Для начала надо зарегистрировать новый сервер. Я использую хостинг https://vscale.io и Ubuntu (в данный момент последняя LTS это 18.04). При создании добавьте свой публичный ключ. Возможно, сервера на 512 мб ОЗУ не будет достаточно и придется использовать сервер на 1 гб ОЗУ.

<span>2.</span> Заходим на сервер, например:

$ ssh root@123.123.123.123

<span>3.</span> Устанавливаем зависимости:

$ apt update && apt install -y curl

<span>4.</span> Устанавливаем Docker и docker-compose:

$ curl -sSL https://get.docker.com/ | sh; curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose

<span>5.</span> Создаем нового пользователя (назовем его deploy) и добавляем его к группе Docker, чтобы не требовался root-доступ для работы с докером:

$ adduser deploy
$ usermod -aG docker deploy

<span>6.</span> Проверяем, что все работает нормально:

$ su deploy
$ docker run hello-world

Должно появиться следующее (если вывелось это, то все работает нормально):

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

<span>7.</span> Теперь копируем содержимое директории deploy (~/my_app/deploy) в директорию на сервере (/home/deploy/my_app) и устанавливаем владельца, также поменяйте пароли и секретные ключи в файле окружения .env.

$ chown -R deploy:deploy /home/deploy/my_app

Пример содержимого .env:

SECRET_KEY=MubREzkP5GNMxBCHE3wOhuo49zpEjZMUEhoAjkvVujEl3AUD

DEBUG=

POSTGRES_DB=db
POSTGRES_USER=user
POSTGRES_PASSWORD=snm2LfPnas1Fb7d8
POSTGRES_HOST=db
POSTGRES_PORT=5432

<span>8.</span> Теперь необходимо авторизоваться на реджистри, забрать последний образ и развернуть приложение:

$ su deploy
$ docker login
$ cd /home/deploy/my_app
$ docker-compose pull && docker-compose down && docker-compose up -d

<span>9.</span> Заходим по IP-адресу сервера, все должно работать. При необходимости подключаем домен (ставим А-запись домена на регистраторе на IP-адрес сервера).

bash devops django docker linux nginx postgresql python

Как поднять собственный socks5 сервер на базе Tor

Может пригодиться для работы в заблокированном в РФ telegram.

Файл docker-compose.yml:

version: '3'

services:
  tor:
    image: connectical/tor
    ports:
      - '9050:9050'
    volumes:
      - ./tor/cfg:/etc/tor
      - ./tor/data:/var/lib/tor

Файл up.sh (в той же директории):

#!/bin/bash

mkdir -p ./tor/cfg ./tor/data
sudo echo 'SOCKSPort 0.0.0.0:9050'$'\n''DataDirectory /var/lib/tor' > ./tor/cfg/torrc
sudo chown 100:100 ./tor/data
sudo docker-compose up -d

Добавляем возможность запуска для up.sh и запускаем его:

$ chmod +x up.sh
$ ./up.sh

Как установить сам докер можно почитать здесь https://crusat.ru/blog/21-ustanovka-docker-i-docker-compose-v-odnu-stroku/

bash docker linux

ERROR: could not access file “$libdir/postgis-2.4”: No such file or directory

Встретил такую ошибку. Использовал образ https://hub.docker.com/r/mdillon/postgis

Выяснилось, что образ обновил postgis до версии 2.5 (2.4 был полностью убран).

Чтобы все починить, просто выполните команду внутри контейнера /usr/local/bin/update-postgis.sh - это обновит postgis с версии 2.4 до версии 2.5 внутри вашего контейнера. Возможно, придется перезагрузить его, но у меня все заработало.

devops docker postgresql

Простейший работающий пример docker + chromedriver + selenium + python на сервере

Скачать пример файлом - example_chromedriver.zip

Структура папок и файлов:

wrapper/Dockerfile
wrapper/requirements.txt
wrapper/main.py
docker-compose-yml

Содержимое docker-compose.yml:

version: "2"

services:

  web:
    build: wrapper
    restart: always
    command: python main.py

Содержимое wrapper/Dockerfile:

FROM python:3.6

ENV PYTHONUNBUFFERED 1

# install google chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable

# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

# set display port to avoid crash
ENV DISPLAY=:99

RUN mkdir /code
WORKDIR /code

COPY . /code/

RUN pip install -r requirements.txt

Содержимое wrapper/requirements.txt:

selenium==3.8.0

Содержимое wrapper/main.py:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time


chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.implicitly_wait(10)

while True:
    print('start')
    driver.get("http://www.python.org")
    assert "Python" in driver.title
    elem = driver.find_element_by_name("q")
    print('elem', elem)
    elem.clear()
    elem.send_keys("pycon")
    elem.send_keys(Keys.RETURN)
    assert "No results found." not in driver.page_source
    print('all ok')
    time.sleep(3)

driver.close()

Источник: https://github.com/joyzoursky/docker-python-chromedriver

python selenium