MacでDocker/docker-compose

MacでLinuxを起動し、Docker環境を構築したので、備忘録として残しておきます。

# Linux起動
WindowsではWSL2を使ってLinuxを起動しますが、MacでLinux起動となるとVirtualBoxなどが脳裏をよぎりますが、今回は「Multipass」というのを使ってUbuntuを起動しました。

https://multipass.run/

トップページで環境を選ぶようになっているので、ここで「**macOS**」を選択し、「**Download Multipass for MacOS**」をクリックするとダウンロードされます。
「**multipass-バージョン番号+mac-Darwin.pkg**」というファイルがダウンロードされているはずなので、これを起動します。
インストーラーが起動するので、インストールを完了させます。

インストールが完了すると、ターミナルで「**multipass**」コマンドが使えるようになっていると思います。
```bash
$ multipass --version
multipass   1.9.1+mac
multipassd  1.9.1+mac
```
次にLinuxコンテナを作成します。
```bash
$ multipass launch --name ubuntu --cpus 2 --memory 4G --disk 100G
```

**--name**でインスタンス名、**--cpus**でCPUのコア数、**--memory**でメモリ、**--disk**でストレージ容量を指定します。
OSはデフォルトでubuntuになります。

作成したubuntuコンテナにシェルで接続します。
```bash
$ multipass shell ubuntu
```

接続すると以下のような表示になります。
```
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-117-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

 System information disabled due to load higher than 1.0

 * Super-optimized for small spaces - read how we shrank the memory
   footprint of MicroK8s to make it the smallest full K8s around.

   https://ubuntu.com/blog/microk8s-memory-optimisation

1 update can be applied immediately.
To see these additional updates run: apt list --upgradable


Last login: Tue Jun 14 01:53:54 2022 from 192.168.64.1
```
ラストログインは、macOSに生成されたブリッジネットワークからのものになっていると思います。
Ubuntuが起動してしまえばあとは、UbuntuのDocker起動手順がそのまま使えます。

# Dockerインストール
参考サイト（オフィシャル）：https://docs.docker.com/engine/install/ubuntu/

まずは、古いバージョンが入っているかもしれないので、削除します。
```bash
$ sudo apt-get remove docker docker-engine docker.io containerd runc
```
次に、必要なものをインストールします。
私の環境だと、下記はすでにインストールはされていました。
```bash
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg lsb-release
```
次に、Dockerリポジトリを追加するための鍵を生成します。
```bash
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```
Dockerリポジトリを追加します。
```bash
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
これでDocker engineをインストールする環境が整いました。
インストール可能なバージョン一覧を表示します。
インストールする時にバージョンを指定出来ます。
```bash
$ apt-cache madison docker-ce
docker-ce | 5:20.10.17~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
docker-ce | 5:20.10.16~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
docker-ce | 5:20.10.15~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
docker-ce | 5:20.10.14~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
docker-ce | 5:20.10.13~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
 ・
 ・
 ・
```
インストールします。
```bash
$ sudo apt-get update
$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
```
「VERSION_STRING」には、例えば上記の例で言うと「5:20.10.17~3-0~ubuntu-focal」などを指定します。
バージョンを省略すると、おそらくstableバージョンがインストールされます（多分）。
```bash
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
次に、一般ユーザーでdockerコマンドが使えるようにします。
まず、dockerグループを作成します。
```bash
$ sudo groupadd docker
```
作成したグループに、現在の作業ユーザーを追加します。
```bash
$ sudo usermod -aG docker $USER
```
グループ設定を反映します。
```bash
$ newgrp docker 
```
これで、一般ユーザー（現在作業している／usermodで設定したユーザー）で、dockerコマンドが使えるようになりました。
```bash
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:80f31da1ac7b312ba29d65080fddf797dd76acfb870e677f390d5acba9741b17
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/

$ docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED              STATUS                          PORTS                                                           NAMES
05071d641959   hello-world         "/hello"                 About a minute ago   Exited (0) About a minute ago                                                                   intelligent_kare
```

# docker-composeインストール
下記コマンドでインストールする。
```bash
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
・
・（インストール経過）
・
$ sudo chmod +x /usr/local/bin/docker-compose
```

これで、docker-composeが使えるようになります。

# Dockerコンテナ内にアクセス
これで、Dockerコンテナが使えるようになったわけですが、コンテナ内のサービスにWindowsとかであれば、localhostのポートフォワードしたところへ繋ぐとアクセス出来ますが、Macではlocalhostでは接続出来ません。
てっとり早い手段としては、Multipassで起動したUbuntuに割り当てられた仮想アドレス宛てにアクセスすると繋がります。
私は今のところはこれで使っています。