macに仮想環境を作ってubuntuいれて色々やったけど、最終的にDockerにした時のメモ

#はじめに
普段windows使ったり、macOS使ったり、Linux使ったり、自ら意図して環境を用意してこなかったので、環境構築でもしてみるか、という思いつきのメモです。

#環境
macOS sierra

#仮想化

実は仮想環境を作る前に、デュアルブートも考えましたが、どうやらインストールも大変だし、アンインストールも大変らしいという話を聞いてやめました。

仮想化を考えてからは以下を検討しました。
・VMwareなどのホスト型：ホストOS上で動作する仮想化ソフトウェアを利用して仮想マシンを管理
・KVMなどのハイパーバイザ型：ハードウェア上のハイパーバイザを利用して仮想マシンを管理
　※どちらもオーバヘッドが大きいとのことでした。
・Docker コンテナ型：ホストOS上にコンテナを用意し仮想マシンのように仮想区画を利用
コンテナはホストOS上のカーネルを利用しています。オーバーヘッドが少ないです。
またインフラのコード化ができるのはとても便利な気がしました。

#気分的にOS環境構築もしたかったので、ハイパーバイザ型

なんでもよかったのですがVirtualBoxよりも動作が早いとのことで、[Parallels Desktop Lite](https://itunes.apple.com/jp/app/parallels-desktop-lite/id1085114709?mt=12)を使うことにしました。

残念ながらmacOS Sierraだと使えず(いつも面倒なので後回しにしてしまうアップデート...)、mojavaにアップデートして、AppStoreでポチッと導入できました。

#そうか有料なのか

14日間は無料で、それ以降は年間１万弱とのことでした。

#OS選択

Linuxを使うことにして、どのディストリビューションがいいかなと考えましたが、とりあえず前から使っているUbuntuにしました。※正直あまり違いがわかってない

※インストールに２時間かかりました。。。
<img width="873" alt="スクリーンショット 2019-02-16 20.54.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/241505/ef7d883a-6c4c-ba30-0d00-08c57fa6981c.png">

#こんな感じ

例のごとくダサい見た目ですね

<img width="1280" alt="スクリーンショット 2019-02-16 23.55.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/241505/b5dd266d-08b6-cadb-a9cd-022d2d39d65d.png">

#カッコよくする

こちら参照にしました。

[Ubuntuの使い勝手をできるだけMacに近づける](https://qiita.com/akutius/items/e1b6b1c96f138c2823ed)
[UbuntuでMacレベルに使いやすくておしゃれな環境構築](https://qiita.com/setouchi/items/7591a335c50ef99042d9)
[Ubuntu 18.04 LTSをインストールした直後に行う設定 & インストールするソフト](https://sicklylife.jp/ubuntu/1804/settings.html)
[Ubuntu 16.04のキーボード設定をMacBook向けにしてみる](https://qiita.com/koreyou/items/341e1fac95c72d9743ad)

gitいれたりテーマ変えたりしました。

``` 
$ sudo apt install git
```
```
$ sudo add-apt-repository ppa:papirus/papirus
$ sudo apt-get update
$ sudo apt-get install papirus-icon-theme
```
```
$ sudo apt install materia-gtk-theme
```
```
$ sudo apt install -y fonts-roboto fonts-noto fonts-ricty-diminished
```
最後に

```
$ sudo apt-get install notify-osd
```
をしてから適用を行います。

```
$ unity-tweak-tool
```

最終的にこの設定にしました。
<img width="758" alt="スクリーンショット 2019-02-17 0.42.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/241505/69d84873-0c81-095f-7e1f-309f46ad3046.png">

結果こんな感じ。ターミナルの字体含めDockの雰囲気もよくなりました。
<img width="982" alt="スクリーンショット 2019-02-17 0.47.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/241505/e4347817-35be-80c8-3b0e-8a5da5d873ab.png">

#一応

macOS側からubuntuに入ることができます。
まずはsshをインストールします。IPアドレスも確認します。

```:ubuntu側
$ sudo apt install ssh
$ ip addr
```
下からしたから数行目のinetの部分のスラッシュより前の部分をメモしておきます。
そしたら今度はmac側から接続を行います。
ubunutuアカウント名と上記のIPアドレスを使います。

```:mac側
$ ssh [ubuntuアカウント]@000.000.00.0
The authenticity of host '000.000.00.0 (000.000.00.0)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxx
Are you sure you want to continue connecting (yes/no)? 
```
するとECDSAキーが出てくるので、
今度はubuntu側でキーを確認します。一緒であればOKです。mac側でyesを押します。

```:ubuntu
$ ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key_pub
SHA256:xxxxxxxxxxxxxxxxxxxxxxxx
```
yesを押した後に以下のように出た場合

```
Permission denied, please try again.
```
この時はubuntu側に行って設定をvimで書き換えます。

```:Ubuntu側
$ sudo vi /etc/ssh/sshd_config
```
vimで開いたら、以下のようなコメントアウトがあるので、書き加えます。[i]でインサートモードに。

```:/etc/ssh/sshd_config(変更前)
#PermitRootLogin prohibit-password
```
```:/etc/ssh/sshd_config(変更後)
PermitRootLogin no
```
書き終えたら、「:wq」で終了します。
最後に先ほどの同様に、以下のコマンドを打ち、パスワード確認のみでログインすることができます。

```:mac側
$ ssh [ubuntuアカウント]@000.000.00.0
```

#一応

これらのssh接続ではIPアドレスとアカウントとパスワードで接続ができました。
でもこれ普通にめっちゃ危ないですよね。セキュリティは低いんです。
ポートの番号変えたり、秘密鍵作ったり、と本当はやらなくてはいけませんが、ここでは説明は割愛します。[こちらを参考](https://www.sejuku.net/blog/58846)に。

#でも

virtualboxより早いとは聞いていたものの、ややもったりしているのが気になる。。。

#ということで一旦ここから離れて、Dockerを導入。

`https://www.docker.com/`へ行ってDocker for macをインストール。
インストール場所とID/PW等をセットしするだけ。
※詳細は割愛します

ログインできたら、PC上部にクジラのマークが出ているはずです。
一応ターミナルから確認。

```
$ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false
```

nginxを起動する

```
$ docker run -d -p 80:80 --name webservertest nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
6ae821421a7d: Pull complete 
da4474e5966c: Pull complete 
eb2aec2b9c9f: Pull complete 
```
立ち上がっているか確認。

```
$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
b0268587494c        nginx               "nginx -g 'daemon of…"   58 seconds ago      Up 56 seconds       0.0.0.0:80->80/tcp   webservertest
```
ブラウザで`http://localhost/`にアクセスしたら立ち上がってました

<img width="1076" alt="スクリーンショット 2019-02-17 1.37.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/241505/94571058-deb3-e07f-9d73-0de9a4f6806a.png">


一旦停止しておく

```
$ docker container stop webservertest
webservertest
```
ちなみに再起動はこちら

```
$ docker container start webservertest
webservertest
```
test用なので削除

```
$ docker container rm webservertest
```
nginxイメージも削除するなら

```
$ docker image rm nginx
Untagged: nginx:latest
Untagged: nginx@sha256:dd2d0ac3fff2f007d99e033b64854be0941e19a2ad51f174d9240dda20d9f534
Deleted: sha256:f09fe80eb0e75e97b04b9dfb065ac3fda37a8fac0161f42fca1e6fe4d0977c80
Deleted: sha256:355e42205f69706706acf084bc2ed484ea5c034a8861b5bcebb7d8bf141fd686
Deleted: sha256:70cc0be2e302cca187cfadaaf528005d004bec56d46ae890a8a06bdd96768ef1
Deleted: sha256:0a07e81f5da36e4cd6c89d9bc3af643345e56bb2ed74cc8772e42ec0d393aee3
```

せっかくなのでpythonイメージを。
docker searchで確認

```
$ docker search python
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
python                                 Python is an interpreted, interactive, objec…   3897                [OK]                
django                                 Django is a free web application framework, …   792                 [OK]                
pypy                                   PyPy is a fast, compliant alternative implem…   169                 [OK]                
kaggle/python                          Docker image for Python scripts run on Kaggle   108                                     [OK]
frolvlad/alpine-python3                The smallest Docker image with Python 3.5 (~…   94                                      [OK]
azuresdk/azure-cli-python              For official Azure CLI 2.0 builds, see https…   37                                      [OK]
centos/python-35-centos7               Platform for building and running Python 3.5…   33                                      
arm32v7/python                         Python is an interpreted, interactive, objec…   33                                      
joyzoursky/python-chromedriver         Python with Chromedriver, for running automa…   23                                      [OK]
circleci/python                        Python is an interpreted, interactive, objec…   23                                      
centos/python-36-centos7               Platform for building and running Python 3.6…   14                                      
centos/python-27-centos7               Platform for building and running Python 2.7…   12                                      
iron/python                            Tiny Python Microcontainer                      9                                       
civisanalytics/datascience-python      Common dependencies for data science workflo…   8                                       [OK]
microsoft/azure-functions-python3.6    Azure functions python image                    8                                       [OK]
publicisworldwide/python-conda         Basic Python environments with Conda.           5                                       [OK]
dockershelf/python                     Repository for docker images of Python. Test…   4                                       [OK]
bitnami/python                         Bitnami Python Docker Image                     3                                       [OK]
komand/python-plugin                   DEPRECATED: Komand Python SDK                   2                                       [OK]
centos/python-34-centos7               Platform for building and running Python 3.4…   2                                       
civisanalytics/civis-jupyter-python3   Custom Jupyter Notebook image for Python 3      2                                       [OK]
civisanalytics/civis-jupyter-python2   Custom Jupyter Notebook image for Python 2.     1                                       [OK]
saagie/python                          Repo for python jobs                            0                                       
qbtrade/python                         python 3.5.0 with requirements                  0                                       
openshift/python-33-centos7            DEPRECATED: A Centos7 based Python v3.3 imag…   0   
```
pullでイメージ入手

```                                    
$ docker pull python
Using default tag: latest
latest: Pulling from library/python
741437d97401: Pull complete 
34d8874714d7: Pull complete 
0a108aa26679: Pull complete 
7f0334c36886: Pull complete 
65c95cb8b3be: Pull complete 
9107d7193263: Pull complete 
dd6f212ec984: Pull complete 
43288b101abf: Pull complete 
f68aede0db03: Pull complete 
Digest: sha256:fb877e7ea5c40de100534c6d6f515c486247bfd899cb2767f2de0e876a8127fa
Status: Downloaded newer image for python:latest
```
確認

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              latest              ac069ebfe1e1        3 days ago          927MB
```

動かしてみる

```
$ docker run -it --name pythontest python
Python 3.7.2 (default, Feb  6 2019, 12:04:03) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
```
めっちゃ簡単に環境構築ができました。レイヤ管理だからなのかサクサクでした。
仮想化したubuntu上でDocker動かしたらもっと色々できますね。

#ざっと

・CPUとかメモリとかの割りあてがない分、VMよりサクサク
・当然ストレージも
・Dockerがあれば、誰でも複数人でイメージを共有できるので楽そう※VMでsshで共有はできるか
・OSを変えられるのはVMのいいところ
　ー個人で環境変えたいくらいならVMはいい
・セキュリティを考えてアプリごとにVMを用意してアイソレーションを立てれば立てるほど、お金もかかるし、リソースが逼迫する
・コンテナであれば、別々にアイソレーションが可能ですが、共通OSなので、OSがダメだった場合に影響範囲が広くなります。

#参照

[DockerでPythonの実行環境を作ったメモ](http://www.mwsoft.jp/programming/numpy/docker.html)
[DockerでPython3.6の環境構築！matplotlibインストールで詰まった話とかも](https://qiita.com/po3rin/items/45ba92e482efcf883325)
[Dockerのpython公式Imageを使ってみた](http://ukwksk.hatenablog.com/entry/2018/09/21/014424)
[いまさらDockerに入門したので分かりやすくまとめます](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1)
[第3回　Dockerコマンドの使い方](https://www.atmarkit.co.jp/ait/articles/1702/01/news061.html)

↓基本はこれ読めば完璧
[ゼロからはじめるDocker](https://news.mynavi.jp/article/docker-1/)

#終わり