未来を変える日記

ETロボコンを目指して

Docker (3) コマンドで使う

 導入が終わったので、基本的な使い方に進みます。

f:id:corgi-eric:20210130110940p:plain:w200
https://hub.docker.com/
  1. ターミナルからコマンドで使う
  2. Dockerfileでイメージを弄って利用
  3. Docker-Compose.yml で複数イメージを束ねる

 上の3分類から、今回はターミナルからコマンドで利用する方法について記載します。

コンテナの起動と停止

docker container run

 最もよく利用したコンテナ立ち上げコマンド。

 xenolf/legoで試してみます。

f:id:corgi-eric:20210129055535p:plain:w300
https://hub.docker.com/r/xenolf/lego
docker container run xenolf/lego 

f:id:corgi-eric:20210129055832p:plain

 xenolf/legoは、https認証書を取得してくれるクライアントなのですが、要は、Dockerを利用することで、WindowsのターミナルからLinuxコマンドを使えるのです。

docker container stop

 続いて、動作中のコンテナを停止してくれるコマンド。

 上のlegoはLinuxコマンドなので、結果を返したら自動で停止します。しかし、例えば、前の記事で取り上げたNginxはWebサーバー。サーバーは動き続けるものなので、Dockerで扱うには明示的なstopが必要になります。

f:id:corgi-eric:20210129061502p:plain:w300
https://hub.docker.com/_/nginx/
docker container run -it -d -p 80:80 --name websrv nginx
docker container stop websrv

 stopコマンドで指定するのは、イメージ名(nginx)ではなく、コンテナ名(websrv)。docker側が割り振ってくれるコンテナIDやコンテナ名でも指定できますが、後述する ls コマンドで調べる手間があるので、起動時の --nameオプションで指定しておくと楽でした。

コンテナの管理

docker container ls

 dockerにあるコンテナを並べてくれるコマンド。

 停止しているコンテナも含めて全表示する(--all, -a)オプションと共によく使います。

 試しに次の3つのコンテナを起動させてみます。

  1. python(スクリプト言語。自動終了する)
  2. mysql(データーベースサーバー。動き続ける。)
  3. nginx(Webサーバー。動き続ける。)

 コマンドは以下の通り。

docker container run python
docker container run -it --name db -e MYSQL_ROOT_PASSWORD=mysql -d mysql
docker container run -it --name websrv -d -p 80:80 nginx
docker container ls
docker container ls -a

 こちらがその結果。
f:id:corgi-eric:20210129063952p:plain

 Pythonは、起動後特に何もさせてないので、コンテナもそのまま終了。MySQLとNginxはサーバーなので動き続けます。オプション無しの ls で表示されるのは、MySQLとNginx。Pythonは、オプション付きの ls -a で停止コンテナとして表示されます。
 なお、Pythonのコンテナには --name オプションを入れなかったので、Docker側から、exciting_edisonという名前が自動で割り振られました。

docker container rm

 コンテナを削除するコマンドです。

 前述の ls コマンドで示した通り、停止後も停止コンテナとしてdocker管理下におかれ続けるため、必要に応じて削除してやる必要があります。

 次の3行で生成、停止、削除のエコシステムが完成します。

docker container run -it --name websrv -d -p 80:80 nginx
docker container stop websrv
docker container rm websrv

docker container prune

 前述の削除を一括でやってくれます。

 例えば、次のようにPythonコンテナを5個使ったとすると・・・

docker container run python
docker container run python
docker container run python
docker container run python
docker container run python

 コンテナの残骸が5個残りますので・・・

f:id:corgi-eric:20210129065345p:plain
docker desktopにて確認

 docker container pruneで一気に処理します。

f:id:corgi-eric:20210129065607p:plain

イメージの管理

はじめに

 コマンドの前にイメージとコンテナの違いを理解しておく必要があります。

f:id:corgi-eric:20210129052018p:plain
イメージとコンテナ

 Docker Hub上で管理されているイメージは、各々のソフトの起動に必要最小限の構成となっています。ここにソフトを利用するのに必要な設定(例:環境変数)を加えてやることで、実際に動作するコンテナとなります。

 例えば、データーベースのPostgreSQLを利用する場合、

f:id:corgi-eric:20210130081612p:plain:w200
https://hub.docker.com/_/postgres/

 上のリンク先のDocker Hubにはイメージがあり、下のコマンドで起動することができます。

$ docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

 このコマンドのオプション(-e)で環境変数(POSTGRES_PASSWORD)を書き加えて、イメージを実際に動くコンテナ化しています。

 以上を踏まえて、コンテナの元となるイメージ管理に関するコマンドを記載します。

docker image ls

 コンテナ起動に使われたイメージは、docker hubに格納されていますが、一度利用するとローカル側のdockerで管理されます。
 その管理イメージ一覧を表示するコマンド。

 コマンドの使用例を下のスクショに示します。最右列のSIZEに容量が記載されていますが、かなり食いますので、時折、掃除してやる必要があります。

f:id:corgi-eric:20210129070128p:plain

docker image prune

 前述したイメージの掃除でよく使うコマンドです。使用されていないイメージを一括で削除してくれます。

docker image rm

 後述するdockerfileを利用したビルドで失敗したなど、個別に指定したイメージを削除したい場合はこちらの image rm が使えるのですが・・・

docker image rm | Docker Documentation

 自分は、下のスクショのようにDocker DesktopでGUIから操作した方が楽な気がしました。この辺は好みですかね。

f:id:corgi-eric:20210129070837p:plain

コンテナ内に入る

 Dockerに慣れてくると動作確認や設定変更などで、コンテナ内に入りたくなってきます。そんな時のためのコマンド操作。

docker container run -it [image] /bin/bash

 例えば上で挙げたPython。スクリプト言語であってて、サーバーではないので、特にさせることがないと、そのまま自動終了してしまいます。

f:id:corgi-eric:20210129054525p:plain:w150
https://hub.docker.com/_/python/

 そんな場合は、次のようにしてターミナルのbashを起動すると自動終了されずに、コンテナ内に入ることができます。

$ docker container run -it --rm --name py python /bin/bash

 ターミナルに root@xxxxx と表示されたら、Pythonの動作確認でHello Worldさせてから終了させてみます。ターミナル起動後、次のように打ちます。

/ python
>>> print('hello world')
>>> quit()
/ exit

f:id:corgi-eric:20210130102022p:plain

 なお、今回はコンテナ起動時に(--rm)オプションを付けました。このオプションにより、Pythonコンテナの停止と削除は同時に実施されます(イメージは残る)。

docker exec -it [name] bash

 今度は、サーバーなどの動き続けるコンテナに入る場合です。

$ docker container run -d --rm ---name websrv -p 80:80 nginx
$ docker exec -it websrv bash

 1行目の起動は通常通り行い、その後に docker exec で bashを起動させてやります。試しに、コンテナ内からNginxを再起動して、終了させます。

/ nginx -s reload
/ exit
$ docker container stop websrv

f:id:corgi-eric:20210130110312p:plain

 Pythonと違ってコンテナを抜けても動き続けますので、stopで止めてやります。起動時にオプション(--rm)を付けてますので、stop後のコンテナ削除は不要です。

bashではなくashの場合も

 イメージのベースOSがDebian系Linux(Ubuntuなど)ではなく、Apline Linuxの場合があります。
 

f:id:corgi-eric:20210130111757p:plain:w250
https://www.alpinelinux.org/

 というより、Alpine Linuxを利用すると容量を小さく纏められるので、慣れてくるとApline Linuxのイメージを選びたくなってくる・・・と表現する方が正しいか。

 この場合のターミナルはbashではなく、ashになります。なので、Alpine Linuxのコンテナ内に入るなら、例えば、次のように起動させます。

$ docker container run -it --rm --name alp alpine /bin/ash

 

まとめ

 他にも沢山あるのですが、今回は、ターミナルのコマンドからDockerのコンテナを操作する所に関して、頻繁に使用したコマンドをまとめました。
 なお、コマンド操作は、次のdockerfileやdocker-compose.ymlでも必要です。その都度で良く使ったものを記載してゆきます。