colimaでDockerを触ってみた

Docker Desktop が有料であるため(個人使用は無料)、代わりとなるDockerコンテナを管理するためのコマンドラインインターフェース(CLI)としてはColimaを使用しています。

今回はcolimaのインストールからDev Containerを使うまでの手順を紹介します。

colimaとは?

Dockerはコンテナ環境を作るためにLinuxカーネルの機能をしており、MacOS上で実行することは実はできないです。 そのため、MacOS上でLinuxを使うために、LinuxVMを立ち上げる必要があります。そのようなツールの一つがcolimaです。

ツールには様々な種類があります。

  • Docker Desktop
  • Lima
  • colima
  • Ranchar Desktop
  • Multipass

などです。

それぞれのざっくりした特徴を下記に示します。

Docker Desktop 

 コンテナ仮想環境構築のツールにおけるデファクトスタンダード。ただし大企業で使用する場合は有料になります。

Lima

 由来はLinux+Mac。名前の通り、MacOS上にLinuxを立てることに特化している。  VMのOSをUbuntudebian選ぶことができ、カスタマイズ性があるが、Dockerコンテナの構築をサポートすることはありません。
 詳しいことはあまり知らないのでもっと知りたい場合は下記のサイトへどうぞ。

colima

 今回のメインのcolima。これはlimaによってVMを起動してVM上でコンテナの管理や実行を行うソフトウェアであるコンテナランタイム(dockerd あるいは containerd)を動かします。設定作業が少なく初心者向きです。 私は設定が簡単&コマンドを使いたいという点からcolimaを選択しました。

limaとcolimaの違い
ちなみにcolimaとlimaはSSHFSを利用しているのでlinux vmからホストOSのファイルを扱うことができます。そのため共有するためのリソースを消費するのでSSHFSを使わないものと比較すると少しだけ重くなります。

Ranchar Desktop

 これもcolimaと同様にVMを起動してVM上でコンテナランタイムを動かします。GUIが強力なのが特徴です。コンテナエンジンのデフォルトはdockerdではなくcontainerdなので注意が必要です。

Multipass

 Ubuntuの仮想環境を構築して管理するソフトウェアです。Ubuntuしか使えません。limaを土台としていないのでSSHFSは使われません。 Multipassについてはこのサイトで詳しく紹介してあります。

marogosteen-pages.web.app

colimaのインストールと起動

#インストール
$ brew install colima

#colimaの起動
$ colima start
INFO[0000] starting colima                              
INFO[0000] runtime: docker                              
INFO[0000] preparing network ...                         context=vm
INFO[0000] creating and starting ...                     context=vm
INFO[0065] provisioning ...                              context=docker
INFO[0065] starting ...                                  context=docker
INFO[0071] done                                         

#補足
#version確認
$ colima --version
colima version 0.5.5
#オプションの確認
$ colima start --help
#コマンドの確認
$ colima help

コンテナを動かす

イメージをbuildする

root にDockerfileがある場合は-f [Dockerfile] オプションはいりません。

$ docker build -t [イメージ名] -f [Dockerfileのパス] [ビルドコンテキスト]
#ビルドコンテキストは、Dockerイメージのビルドに使用されるファイルが存在するディレクトリです。下の場合、現在のディレクトリがビルドコンテキストです。
$ docker build -t pokemon-resolver -f cloudbuild/Dockerfile .

#イメージの一覧を表示(挙動は同じですがimage lsの方が新しいです)
$ docker image ls
$ docker images

REPOSITORY         TAG        IMAGE ID       CREATED          SIZE
pokemon-resolver   latest     7cc7d4f1fc50   38 seconds ago   901MB

コンテナの作成

$ docker create [イメージ名]
$ docker create -it -p 3000:3000 --name=pokemon pokemon-resolver

docker createコマンドのオプション(docker runコマンドのオプションと同様)

オプション 詳細
-t(--tty) コンテナの標準出力をホストの標準出力につなげる
-i(--interactive) ホストの入力をコンテナの標準出力につなげる
-it -iと-tが合体したもの
-p ホストのポート番号とコンテナのポート番号を割り当てる。複数指定可能。
--name コンテナ名を指定

ちなみに docker runはコンテナを起動状態で作成するもので、docker createはコンテナを停止状態で使用します。 つまり、docker run = create + start です。

-pの補足
上記の例では、ホストの 3000番ポート(左)を、コンテナの 3000番ポート(右)に割り当てています。つまり、コンテナにhhtp://localhost:3000でアクセスすることができるようになります。 この3000:3000という書き方は実は省略された書き方で、これは0.0.0.0:3000:3000と同じ意味になります(docker psすると確認できます)。 この場合0.0.0.0にすることで、ありとあらゆるIPアドレスからlocalhost:3000へのアクセスを許可するということになります。アクセス元のIPアドレスを自分のローカルホストのみを許容したいときは自分のローカルホスト:ホストのポート番号:コンテナのポート番号にします。(cat /etc/hostsコマンドで自分のローカルホストが確認できます。)

コンテナの起動

$ docker container start [コンテナ名]
$ docker container start -a pokemon
オプション 詳細
-a startと同時にattachします

これは

$ docker container start [コンテナ名]
$ docker container attach

と同様です。 アタッチしたコンテナから抜ける(コンテナのプロセスを停止する)にはctrl + p + qで抜け出せます。このシグナルが送れるのは-itオプションのおかげです。

余談

execコマンドはコンテナないの/bin/に対して別のプロセスを立てるものです。つまり、プロセスID[2]以降を作ります。(1コンテナ1プロセスの原則には反してる)逆にプロセスID[1]は作れないのでexecを先にすると、startしなさいと怒られるかもです(それかエラーが出るか)。 それに対し、startコマンドはプロセスID[1]を作ります。 またattachはコンテナのプロセスに入るものです。 execしてプロセスが2つある場合にプロセスID[1]を消すと、自動的にそのコンテナは停止します。

コンテナの停止

$ docker container stop [コンテナ名]

これでコンテナを停止します。

コンテナの削除

$ docker container rm [コンテナ名]

#全てのコンテナを表示(デフォルトは実行中のコンテナだけ表示)
$ docker ps -a

コンテナイメージの削除

$ docker image rm [オプション] [イメージ名]

#コンテナがないimegeを全て削除します
$ docker image prune -a

下記のサイトを参考にしました。

docs.docker.jp

qiita.com

zenn.dev

developers.freee.co.jp

docs.docker.jp