Docker.io 関連のメモ

インストール・設定

図1 Docker container runtime by Canonical
$ sudo apt install -y docker.io

参考
ubuntuでは以前「docker」という MacのDock(Windowsでいう何でしたっけ?スタートボタンとかが配置されてるバーみたいなヤツ)のような機能を提供するソフトが存在していて「docker」という名前をとってしまっていました.そのため,いわゆるDockerは「docker.io」という名前になっています. 実は今は(少なくとも 24.04 LTS時点では) ubuntu のリリース元 Canonical 社製の「Docker container runtime」(図1)という Docker 関連のソフトウェアが「docker」という名前をとっていて,けっこう人気もあるし,一般ユーザーも使えたり操作が簡単だったり,なかなかイケてるコンセプトで作られている・そして人気もあるみたいなのですが,とりあえず本物の Docker ではないので今のところ本家 docker.io を使っておくのがよいと思われます.


インストールが完了すると自動で dockerd が起動しているはず.

初期状態では dockerd が待ち受けているソケットが root ユーザーか docker グループに入っているユーザーのみしか書き込みできないようになっているので 毎回 sudo docker とするか(rootユーザーとして使うか),自分を docker グループに入れておくかする.

$ ls -l /var/run/docker.sock 
srw-rw---- 1 root docker 0 Nov 23 16:42 /var/run/docker.sock

毎回 sudo するのも面倒なので自分を docker グループにいれて newgrp で所属グループを変更してから使うのが便利.

$ sudo gpasswd -a hatai docker
Adding user hatai to group docker
$ newgrp - docker
$ docker version
Client:
 Version:           24.0.7
 API version:       1.43
 Go version:        go1.22.2
 Git commit:        24.0.7-0ubuntu4.1
 Built:             Fri Aug  9 02:33:20 2024
 OS/Arch:           linux/amd64
 Context:           default

Server:
 Engine:
  Version:          24.0.7
  API version:      1.43 (minimum version 1.12)
...

参考
実は一般ユーザーでも docker version コマンドは実行できてクライアント(つまりdockerコマンド自身)のバージョン番号などは上記と同様に表示されるのですけど,サーバー部分ではソケットのアクセス権がないため「permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock」のようなエラーがでてしまいます.

実行

え? いきなり実行?…と思うかもですが,大丈夫です. もう今(2024年時点)はコンテナー作るとかそんなややこしい話はいっさいないんスよ.ほしいものは既に何でもそろってますから. みなさんだって今どき *.deb とか *.rpm とか自分で作らないでしょ? もうどこかの誰かが作ってくれてるんです(ありがとうございます!)

から好きなものを探して(検索して)ダウンロードして実行してください.…といいつつ,探し方とダウンロード方法の説明に続きます.

Docker イメージの取得

とりあえず初期状態では下記のようにローカルにはコンテナーイメージがない状態になっています(当然).

$ docker image list
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

「ダウンロード」といっても通常のアプリのようにDocker HubのWebページにいって「ダウンロード」ボタンを押したら *.zip ファイルが落ちてきて…とかではありません. 下記のように docker image pull コマンドを使ってダウンロードします(ゆえに「ダウンロード」ではなく「イメージをプルする」とか言ってる人が多いように思います).

$ docker image pull ubuntu:24.10
24.10: Pulling from library/ubuntu
372111cb3b6e: Pull complete 
Digest: sha256:eea047b4b181f2d3aeafbc0ce5294a2bbb3b98153a68b9ed4bc573d871ca9450
Status: Downloaded newer image for ubuntu:24.10
docker.io/library/ubuntu:24.10

ここでちょいマッテとなるのが,上のコマンドの「ubuntu:24.10」の部分.字面から ubuntu 24.10 をダウロードする意味なのは想像できるとしても,自分がほしいコンテナーイメージの正確な名称・文字列はどうやってわかるんや?ってなりますよね.

そこでDocker Hubの登場です. Docker Hub でほしいソフトウェアを検索して詳細ページに行くと下記のような「タグ」(tags)というのがわかります. このイメージ名とタグを「:」でつないで指定すればOKです.(タグはない場合もあって,その場合はイメージ名だけでOK.下記のように複数ある場合はわかりやすいように別名をつけているだけなのでどれを指定してもOKです.)

Dockerコンテナーイメージのイメージ名とタグ

ダウンロードが終わったら docker image list でダウンロード済みのコンテナーイメージが表示されるようになります.

$ docker image list
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       24.10     bf21d82156ce   6 weeks ago   80.1MB

コンテナーの起動

コンテナーの起動は docker container run です.そのまんまですね…といいつつ,コンテナーの「起動(run)」というのは正確には「イメージから新しいコンテナーを作成して起動する」という意味というのは知っておく必要があります. run とはちがう start(stop しておいたコンテナーを再開する)というのもあるので….
それはさておき,今回はOSそのものまるごとのコンテナーイメージ(ubuntu:24.10)を落としてきたので,代表的なコマンドとして bash を起動する例を示します. -t はターミナルを起動する,-iは対話的に使用する(interactive)の意味です.

$ docker container run -t -i ubuntu:24.10 /bin/bash
root@cd0909a8004a:/#

これで普通にコマンドラインの ubuntu 24.10 が使えるようになったと思います.ただ,コンテナー内でファイルを作ったりしてもコンテナーを削除すると消えてしまうことに注意しておいてください(まぁ当然なんですけど). なので,コンテナー内で作成したデータを永続化したい場合は,外部のDBやファイルサーバーに記録するとか,ホストOS側から共有フォルダーをだしてもらってそこを読み書きするなどの工夫が必要です.

ホストOS側から docker container ls すると実行状態が見れます(container run したターミナルはコンテナー自体の bash との対話に占領されていると思うので別のターミナルを起動して実行してください…以下同様).

$ docker container ls
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS     NAMES
cd0909a8004a   ubuntu:24.10   "/bin/bash"   13 minutes ago   Up 13 minutes             jolly_greider  

ここで大事なのが CONTAINER ID で,コンテナーの実行を止めたり(stop)・再開(start)したりする場合に指定します.

$ docker container stop cd0909a8004a
cd0909a8004a
$ docker container ls     ※停止(stop)しているコンテナーは表示されません.
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
$ docker container ls -a    ※停止しているコンテナーも表示対象になります.
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                        PORTS     NAMES
cd0909a8004a   ubuntu:24.10   "/bin/bash"   29 minutes ago   Exited (137) 27 seconds ago             jolly_greider
$ docker container start cd0909a8004a    ※あ,startしたけど対話モード(-i)指定忘れてたのでコマンド打てないわ (^_^;)
cd0909a8004a
$ docker container ls
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS         PORTS     NAMES
cd0909a8004a   ubuntu:24.10   "/bin/bash"   30 minutes ago   Up 6 seconds             jolly_greider
$ docker container stop cd0909a8004a    ※なのでいったん再度stop.
cd0909a8004a
$ docker container start -i cd0909a8004a   ※今度は -i つけて start
root@cd0909a8004a:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

以下,再度コンテナーを停止(stop)して削除(rm)しておきます(ここで rm するのは あくまで「コンテナー」であって「コンテナーイメージ」ではないことに注意).

$ docker container stop cd0909a8004a
cd0909a8004a
$ docker container ls          
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
$ docker container ls -a
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                        PORTS     NAMES
cd0909a8004a   ubuntu:24.10   "/bin/bash"   42 minutes ago   Exited (137) 10 seconds ago             jolly_greider
$ docker container rm cd0909a8004
cd0909a8004

独自コンテナーイメージの作成

また今度ね.

Further Info