Tuples в C# 7

Сегодня я поковырял детали реализации кортежей (tuples), которые будут доступны в седьмой версии языка C#.

Совсем скоро мы сможем писать:

public (int x, int y, string comment) GetSomething() {
    return (42, 123, "tuples!");
}

и затем:

var tuple = GetSomething();
var sum = tuple.x + tuple.y;

Наконец-то, наконец-то появится красивый способ вернуть из функции несколько значений!

Воспользовавшись советами отсюда и отсюда, я смог запустить Visual Studio 2015 с компилятором C#, собранным прямо из master-ветки.

Читать далее ▸

Docker: user namespaces

С самого начала пользователей Докера, обеспокоенных вопросами безопасности, волновал тот факт, что внутри контейнеров идентификаторы пользователей и групп начинаются с нуля. Иными словами, root в контейнере равносилен root-у во внешней системе. И даже нашлись сценарии (не самые тривиальные, конечно), в которых root выбирается наружу.

В Docker 1.10 добавили поддержку так называемых user namespaces, которые призваны исправить эту ситуацию.

Нужно ли скорее бежать и включать их у себя?

Не спешите! Во всей этой истории предполагается, что зловредный пользователь контейнера хочет атаковать внешнюю систему. Такое возможно в сценариях хостинга и аренды. Если же вы используете Docker сами и на своих серверах, то, конечно же, не будете этого делать, а наоборот будете соблюдать правила безопасности внутри контейнеров. «Внутренний» root заслуживает такого же бережного обращения как и внешний.

Читать далее ▸

Docker: user defined networks — правильная работа с сетью

И раньше, и сейчас, если не указать дополнительных опций, контейнеры попадают в «дефолтную» виртуальную сеть, параметры которой можно узнать командой:

ip addr show docker0

В Docker 1.10 появилась возможность создавать дополнительные (user-defined) виртуальные сети. Делается это так:

docker network create my-net-1

Читать далее ▸

Docker: named volumes — правильная работа с томами

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

Принцип работы прост: определённые директории внутри контейнера (например, /var/lib/mysql или /var/log/nginx) монтируются извне. Можно уничтожить контейнер и создать на его месте новый — например, из обновленного Dockerfile или более свежего базового образа — и при этом драгоценные данные, размещенные на томах, останутся в целости и сохранности.

До версии Docker 1.10 было два способа работы с томами:

  • Bind-mounts — монтирование внешних папок параметром -v /host:/container (как в статье про MySQL внутри Докера).

  • Data-only containers — создание специального контейнера-спутника и использование его файловой системы для хранения данных (параметр --volumes-from).

Читать далее ▸

Docker: запуск нескольких приложений в одном контейнере

Прежде всего, несколько слов о том, правильно ли это.

В интернете можно встретить утверждения вида «философия Докера предполагает ровно один процесс». Я не думаю, что это правда. Философия Докера строится не вокруг технических деталей (таких как количество процессов), а вокруг идеи удобной упаковки, доставки и развертывания приложений. Вы сами выбираете подход — десяток изолированных микросервисов или один толстый контейнер all inclusive. Действуйте по ситуации!

Вот одна классическая ситуация: Apache + MySQL + cron.

Dockerfile может выглядеть так:

FROM ubuntu:14.04

RUN DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 mysql-server

CMD (mysqld_safe&) && apache2ctl start && cron && sleep infinity

Читать далее ▸