Docker で開発するなら Linux 使おう

[株式会社オープンロジ](https://openlogi.com/corp/) CTOの五十嵐([@migrs](https://twitter.com/migrs))です。
[OPENLOGI Advent Calendar 2017](https://qiita.com/advent-calendar/2017/openlogi) の7日目の記事になります。

## オープンロジの開発環境

[オープンロジ](https://openlogi.com/corp/)では、これまで特にエンジニアからの指定がなければ MacBook Pro 15" を標準マシンとして支給していたのですが、[Docker](https://www.docker.com/) による開発環境を整備してからというもの macOS 上で開発する必要性が薄れ、むしろ [Docker for Mac](https://www.docker.com/docker-mac) のホストボリュームマウントが異常に遅い問題がツラすぎて、とてもみんなにオススメできる開発環境では無くなってしまいました。

[Vagrant](https://www.vagrantup.com/) + [BargeOS](https://github.com/bargees/barge-os) で運用する Docker 環境も用意してますが、Linux 上で開発した方が総合的に幸せだと感じたため、主に社内のエンジニア向けに導入ハードルを下げるためのメモとしてまとめつつ、せっかくなので Advent Calendar のネタとして公開します。

（Docker for Mac の [cached オプション](https://docs.docker.com/docker-for-mac/osxfs-caching/)を利用するという手も有力ですが、書き込み速度は依然遅いままなので改善はするがベストではないと思っています。）

## Ubuntu 17.10 のセットアップ

Linux ディストリビューションは何でも良いのですがメジャーで扱いやすい [Ubuntu](https://www.ubuntu.com/) を勧めておきます。

Ubuntu のインストール方法はチュートリアルにあるとおりなのでそれに従いましょう。

 - [USBインストールディスクの作成] (https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-windows)
 - [Ubuntu Desktop のインストール](https://tutorials.ubuntu.com/tutorial/tutorial-install-ubuntu-desktop)

セットアップ時の選択肢として、

 - Language: `English`
 - Installation type: `Install Ubuntu alongside Windows Boot Manager`
 - Keyboard layout: `Japanese` / `Japanese` (日本語配列の場合)

あたりを選択した前提で以降話を進めます。

## パッケージのインストールと設定

### etckeeper
個人的な趣味なのですが、なにはともあれ一番最初に [etckeeper](http://etckeeper.branchable.com/) をインストールすることにしています。

```shell-session
sudo apt install etckeeper
```

etckeeper は自動で etc ディレクトリのバージョン管理をしてくれます。

### 日本語入力設定
日本語入力できるようにするために、

`[Settings]` -> `[Region & Languages]` -> `Input Source` に
`Japanese (Mozc)` を追加する必要があるのですが、インストール直後の状態では選択肢がでてこないので、以下の手順で追加します。


 1. `[Language Support]` を起動すると日本語入力に必要なパッケージのインストールが始まるので見守ります
 2. ログアウトします
 3. `[Settings]` -> `[Region & Languages]` -> `Input Source` で
`Japanese / Japanese (Mozc)` が選べるようになっているので追加
 4. メニューバーの Input Mode アイコンから `Japanese (Mozc)` を選択

### キーボードレイアウト変更

Mac と同じように、CapsLock を Ctrl にしたり、テキストフィールドで Emacs キーバインド使ったりしたい場合は、`gnome-tweak-tool` で設定します。

```shell-session
sudo apt install gnome-tweak-tool
```

`[Tweaks]` -> `[Keyboard & Mouse]` で、

 - `[Emacs Input]` -> `[ON]`
 - `[Additional Layout Options]` -> `[Caps Lock key behavior]` -> `[Caps Lock is also a Ctrl]` を選択

### Docker のインストール
あとはメインの Docker さえインストールすれば最低限開発できる環境は出来上がりです。

```shell-session
sudo apt install docker docker-compose
sudo gpasswd -a $USER docker
```

## おすすめのソフトウェア
個人的に入れてるパッケージを晒しておきます。

### apt でインストールできるタイプ

|パッケージ名|説明|
|---|---|
|[terminator](https://gnometerminator.blogspot.jp/)| 画面分割などができるターミナル |
|[neovim](https://neovim.io/)| 男は黙って Vim |
|[awscli](https://aws.amazon.com/jp/cli/)| AWS クライアント |
|[tig](https://jonas.github.io/tig/)| Git クライアント |
|[git-flow](https://github.com/petervanderdoes/gitflow-avh)| Git Flow | 
|[fdclone](https://github.com/knu/FDclone)|ファイラー|
|[liquidprompt](https://github.com/nojhan/liquidprompt)|シェルプロンプト|
|[corebird](https://corebird.baedert.org/)|Twitter クライアント|

### ダウンロードしてインストールするタイプ

|ソフトウェア名|説明|
|---|---|
|[Visual Studio Code](https://code.visualstudio.com/)|モダンなエディタ使いたいなら|
|[IntelliJ IDEA](https://www.jetbrains.com/idea/download/#section=linux)| IDEなら|
|[Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)|ブラウザ|
|[Slack](https://slack.com/intl/ja-jp/downloads/linux)|チャット|
|[DBeaver](https://dbeaver.jkiss.org/download/)|データベース接続|

### Golang なソフトウェア

|ソフトウェア名|説明|
|---|---|
|[goofsy](https://github.com/kahing/goofys)| s3 fuse クライアント|
|[ripgrep](https://github.com/BurntSushi/ripgrep)| 高速 grep |
|[fzf](https://github.com/junegunn/fzf)| peco より fzf 派|
|[ccat](https://github.com/jingweno/ccat)|シンタックスカラー対応 cat|

## 本当は開発環境自体のOSの依存も無くしたい

開発環境自体も docker で構築できれば良いと思っているので準備できたら共有します。

## まとめ
最終的には自分が一番やりやすい環境で開発してもらえれば良いと思っていますが、Mac に比べて ThinkPad 等の方がメモリーもCPUもハイスペックなものを載せられコストパフォーマンスもよいので今後の標準開発環境としてはこちらをオススメしていきたいと思っています。

オープンロジの開発環境についてもっと詳しく聞いてみたい方はぜひ気軽に池袋まで遊びに来てください！

 - [Wantedly](https://www.wantedly.com/projects/173681)
 - [採用ページ](https://www.openlogi.com/corp/recruit/index.html)