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をUbuntuやdebian選ぶことができ、カスタマイズ性があるが、Dockerコンテナの構築をサポートすることはありません。
詳しいことはあまり知らないのでもっと知りたい場合は下記のサイトへどうぞ。
colima
今回のメインのcolima。これはlimaによってVMを起動してVM上でコンテナの管理や実行を行うソフトウェアであるコンテナランタイム(dockerd あるいは containerd)を動かします。設定作業が少なく初心者向きです。 私は設定が簡単&コマンドを使いたいという点からcolimaを選択しました。 ちなみにcolimaとlimaはSSHFSを利用しているのでlinux vmからホストOSのファイルを扱うことができます。そのため共有するためのリソースを消費するのでSSHFSを使わないものと比較すると少しだけ重くなります。
Ranchar Desktop
これもcolimaと同様にVMを起動してVM上でコンテナランタイムを動かします。GUIが強力なのが特徴です。コンテナエンジンのデフォルトはdockerdではなくcontainerdなので注意が必要です。
Multipass
Ubuntuの仮想環境を構築して管理するソフトウェアです。Ubuntuしか使えません。limaを土台としていないのでSSHFSは使われません。 Multipassについてはこのサイトで詳しく紹介してあります。
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
下記のサイトを参考にしました。