Linux あれこれ

Linux 関連(一部 Windows11 )の備忘録です。

Boxes の「Xubuntu 22.04.1 LTS」に、「Docker for Linux」をインストール〈H157-7〉

登録日: 2022-10-15 更新日: 2022-10-22

プログラム開発に使われる環境として、「VertualBox」や「Boxes」以外に、「コンテナ」があります。

同じ仮想化ですが、仕組みが違います。

-

「コンテナ」について勉強したいので、「Boxes」のゲストOS の「Xubuntu 22.04.1 LTS」に、まずは基本となる「Docker for Linux」 (Docker Engine) をインストールしてみました。

その備忘録です。

-

-

使用したPC は「ASUS Chromebox CN60 」で、 プロセッサは第4世代の「Intel Celeron 2955U 」です。

UEFI 立ち上げ」のPC です。

-

(注)リンクを戻るときはブラウザの左上の「←」をクリック

-

-


目次

-

今回の作業:

  1. 「Docker for Linux」をインストール:

  2. 「Docker」でコンテナが動くことを確認 (hello-world):

  3. 「docker」コマンドを使ってみる(その1):

  4. 「docker」コマンドを使ってみる(その2):

  5. 「Docker」をチュートリアルで学ぶ (docker/getting-started):

  6. 「コンテナ」を使ってみる:

  7. 「Dockerfile」の作成時に使う命令:

  8. 「Dockerfile」の作成例を試す:

  9. 「Dockerfile」を作ってみる:

  10. 「バインド マウント」を使ってみる:

  11. 「ボリューム」マウントを使ってみる:

  12. コンテナ間で「データ共有」してみる:

-

コマンド関連:

  1. 「docker」コマンドの新旧の違い:

  2. 「docker」コマンド:

  3. 「docker container」コマンド:

  4. 「docker image」コマンド:

  5. 「docker run」コマンド:

  6. 「docker run」コマンドの使用例:

  7. 「docker volume」コマンドの使用例:

-

「まとめ へ」

-

「目次詳細 へ」

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - -

Xubuntu 22.04.1 LTS のデスクトップ画面:

-

ホストOS は、「Xubuntu 22.04.1 LTS」:

→個人的に「ブログを書く土台となる仮想環境が必要」です。

なので、シンプルな「Boxes」(42.2) をAPT でインストールしました。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - --

Xubuntu」について:

-

Ubuntu の公式フレーバー(性格の違う兄弟?)です

Ubuntu ベースの、軽量な「Xfce」デスクトップ環境です。

個人的には使い慣れた環境です。

-

Ubuntu は、アプリによっては問題が出る「Wayland」セッションがデフォルトです。 Xubuntu は、中身は Ubuntu ですが「X11」で動いており、「Wayland」での問題を回避できます。

-


Xubuntu 22.04.1 LTS」の現在のバージョンを表示:

-

ホストOS のバージョン:

2022-10-22 現在

カーネル:

$ uname -r
5.15.0-50-generic

-

リリース:

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS"

→「22.04.1」にアップしています。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ---

「コンテナ」について:

-

「VertualBox」や「Boxes」は、「仮想マシン」による仮想化です。

仮想マシン」による仮想化では、仮想マシンごとに「OS のインストール」を行います。 ホストOS の上 でゲストOS を立ち上げるので、必要なリソースが大きく、負荷も大きいです。

-

それに対し、「コンテナ」による仮想化は、ひとつのプロセスになるので、新しいOS は必要なく、OS はひとつです。

「コンテナエンジン」が Linux カーネルの高い互換性を使い、ホストOS とコンテナ間でカーネルを共有して、コンテナを作成した「ベースOS 上でアプリが動いているのと同じ環境」を実現しています。(実体となるOS がない分)軽量で、リソースを効率よく使用できます。また、複数の「コンテナ」を動かせます。

-

「Docker エンジン」が動いていれば、コンテナは動くので、 「Linux」だけではなく、「Windows」や「Mac」の環境でも動かせます。

ただし、「Linux カーネルの高い互換性」により実現している機能なので、 「Windows」や「Mac」は、「Docker Desktop」というVM 上で動かします。

-

コンテナはひとつのプロセスとして動くので、課題もあります: 稼働中に内部のファイルに書き込んだデータは、コンテナが停止すると消えてしまいます。

データを残すには、コンテナ内部で使用するディレクトリを、ホスト側のディレクトリにマッピングして共有するのが簡単ですが、セキュリティ面でのリスクが増えます。

また、コンテナの作り方で、ホストのリソースの使い方に大きな差が出て、パフォーマンスに影響します。 コンテナの実行には、ダウンロードを伴うので、コンテナサイズを小さくするのが、良い結果を生みます。

-

コンテナで使われている「ベースOS」としては、通常の Linux ディストリビューション(Centos7、FedoraDebianUbuntu)だけでなく、軽量な「Alpine Linux」や「Busybox」、OS からコンテナで使われない部分を削除してコンパクトにした「Debian slim」、コンテナ専用として開発の「Fedora CoreOS」(旧 CoreOS + 旧 Fedora Atomic Host)などがあります。

-

参考:

Docker Official Image

コンテナってなんだろう― 「コンテナ」の概要を知る

目で見て覚えるDocker用語集

Fedora CoreOS のドキュメント

-

-


「コンテナ」の現在のバージョンを表示:

2022-10-22 現在

$ sudo docker --version
:
Docker version 20.10.20, build 9fdeb9c

-

$ sudo docker version
:
Client: Docker Engine - Community   ←(クライアント)
 Version:           20.10.20
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        9fdeb9c
 Built:             Tue Oct 18 18:20:18 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community   ←(サーバー)
 Engine:
  Version:          20.10.20
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.7
  Git commit:       03df974
  Built:            Tue Oct 18 18:18:08 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.8
  GitCommit:        9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----

「Docker for Linux」の「Xubuntu 22.04.1 LTS」への対応:

-

Docker の日本語サイトを見ると、インストールは「Ubuntu 21.10」までの対応でした。 念の為、英語のサイトを確認すると、

→「Ubuntu 22.04」の追加がありました。最新の情報は英語のサイトを確認するのが良さそう。

-

参考:

Install Docker Engine on Ubuntu 」より抜粋:

-

Ubuntu で Docker エンジンの使用を開始するには、

2022-10-15 現在:

次のいずれかの Ubuntu バージョンの 64 ビット バージョンが必要:

    Ubuntu Jammy 22.04 (LTS)
    Ubuntu Impish 21.10
    Ubuntu Focal 20.04 (LTS)
    Ubuntu Bionic 18.04 (LTS)

-

なので、ゲストOS の「Xubuntu 22.04.1 LTS」で作業できます:

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - -----

1. 古いバージョンの Docker のクリア処理:

-

インストールしてなければ作業は要りません。
何かしらの「Docker」をインストールしていた場合に実施します。

-

1). 古いバージョンの Docker をアンインストール:

$ sudo apt remove docker docker-engine docker.io containerd runc

→以前は「docker-engine」でしたが、現在は違います。

-

2). 「クリーン インストール」をするために、残骸をクリア:

-

(1). 関連パッケージのアンインストール:
$ sudo apt purge docker-ce docker-ce-cli containerd.io docker-compose-plugin

-

(2). すべてのイメージ、コンテナ、およびボリュームを削除:
$ sudo rm -rf /var/lib/docker
$ sudo rm -rf /var/lib/containerd

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- -

2. 「Docker for Linux」をインストール:

-

推奨されている手順は、 Docker のリポジトリをセットアップして、そこからインストールです。

-

ゲストOS の「Xubuntu 22.04.1 LTS」で作業:

-

1). リポジトリをセットアップ:

$ sudo apt update

$ sudo apt install ca-certificates curl gnupg lsb-release
:
ca-certificates はすでに最新バージョン (20211016) です。
lsb-release はすでに最新バージョン (11.1.0ubuntu4) です。
gnupg はすでに最新バージョン (2.2.27-3ubuntu2.1) です。
:
以下のパッケージが新たにインストールされます:
  curl

-

2). Docker の公式 GPG キーを追加:

$ sudo mkdir -p /etc/apt/keyrings
$ ls /etc/apt/keyrings
$
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$
$ ls /etc/apt/keyrings
docker.gpg

$ ls -l /etc/apt/keyrings/docker.gpg
-rw-r--r-- 1 root root 2760 10月 14 10:31 /etc/apt/keyrings/docker.gpg

-

3). リポジトリを設定:

$ 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

→1行のコマンドです。「貼り付け」をクリック

-

確認:

$ cat /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg]   https://download.docker.com/linux/ubuntu jammy stable

-

4). リポジトリの更新

$ sudo apt update
:
取得:1 https://download.docker.com/linux/ubuntu jammy InRelease [48.9 kB]
ヒット:2 http://jp.archive.ubuntu.com/ubuntu jammy InRelease    
ヒット:3 http://jp.archive.ubuntu.com/ubuntu jammy-updates InRelease
ヒット:4 http://jp.archive.ubuntu.com/ubuntu jammy-backports InRelease
取得:5 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages [7,756 B]  ←(追加)
取得:6 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
167 kB を 2秒 で取得しました (73.9 kB/s)

-

apt update の実行時に GPG エラーが発生した場合:

デフォルトの umask が正しく設定されていない可能性があり、リポジトリの公開鍵ファイルが検出されません。

次のコマンドを実行してから、リポジトリの更新を再度試みます:

$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
$ sudo apt update

-

5). Docker エンジンをインストール:

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
:
以下のパッケージが新たにインストールされます:
  containerd.io docker-ce docker-ce-cli
  docker-ce-rootless-extras docker-compose-plugin
  docker-scan-plugin git git-man liberror-perl libslirp0 pigz
  slirp4netns
アップグレード: 0 個、新規インストール: 12 個、削除: 0 個、保留: 0 個。

-

確認:
$ apt list docker
一覧表示... 完了
docker/jammy,jammy 1.5-2 all

→「docker」パッケージは「Ubuntu」版ですが、バージョンが少し古いです。

-

$ apt list docker* --installed
一覧表示... 完了
docker-ce-cli/jammy,now 5:20.10.19~3-0~ubuntu-jammy amd64 [インストール済み]
docker-ce-rootless-extras/jammy,now 5:20.10.19~3-0~ubuntu-jammy amd64 [インストール済み、自動]
docker-ce/jammy,now 5:20.10.19~3-0~ubuntu-jammy amd64 [インストール済み]
docker-compose-plugin/jammy,now 2.11.2~ubuntu-jammy amd64 [インストール済み]
docker-scan-plugin/jammy,now 0.17.0~ubuntu-jammy amd64 [インストール済み、自動]

リポジトリを追加した場合は、「docker-ce」というパッケージ名になるようです。「Community 版の Engine」ということみたい。

-

$ docker --version
Docker version 20.10.19, build d85ef84

-

-

6). 追記: 後日、システム更新があり、パッケージが更新されました:

2022-10-19:

$ sudo apt update
:       
アップグレードできるパッケージが 6 個あります。表示するには 'apt list --upgradable' を実行してください。

$ apt list --upgradable
:
docker-ce-cli/jammy 5:20.10.20~3-0~ubuntu-jammy amd64 [5:20.10.19~3-0~ubuntu-jammy からアップグレード可]
docker-ce-rootless-extras/jammy 5:20.10.20~3-0~ubuntu-jammy amd64 [5:20.10.19~3-0~ubuntu-jammy からアップグレード可]
docker-ce/jammy 5:20.10.20~3-0~ubuntu-jammy amd64 [5:20.10.19~3-0~ubuntu-jammy からアップグレード可]
docker-compose-plugin/jammy 2.12.0~ubuntu-jammy amd64 [2.11.2~ubuntu-jammy からアップグレード可]
git-man/jammy-security,jammy-security 1:2.34.1-1ubuntu1.5 all [1:2.34.1-1ubuntu1.4 からアップグレード可]
git/jammy-security 1:2.34.1-1ubuntu1.5 amd64 [1:2.34.1-1ubuntu1.4 からアップグレード可]
$ sudo apt upgrade
:
以下のパッケージはアップグレードされます:
  docker-ce docker-ce-cli docker-ce-rootless-extras
  docker-compose-plugin git git-man
アップグレード: 6 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
2 standard LTS security updates

-

確認:

$ sudo docker --version
:
Docker version 20.10.20, build 9fdeb9c

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- --

3. 「Docker」コマンドを使ってみる(その1):

-

1). インストールされたDocker のバージョンを確認:

2022-10-19 現在のバージョン:

$ docker version
Client: Docker Engine - Community
 Version:           20.10.20
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        9fdeb9c
 Built:             Tue Oct 18 18:20:18 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version": dial unix /var/run/docker.sock: connect: permission denied

→「docker」コマンドには「sudo」が必要なことを忘れていました。

-

sudo を使わなくても済む設定は、「項番 5」を参照:

個人的には、sudo を付けるのがわかっているので支障ありません。

-

「docker」コマンドには管理者権限が必要です:

2022-10-19 現在のバージョン:

$ sudo docker version
:
Client: Docker Engine - Community   ←(クライアント)
 Version:           20.10.20
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        9fdeb9c
 Built:             Tue Oct 18 18:20:18 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community   ←(サーバー)
 Engine:
  Version:          20.10.20
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.7
  Git commit:       03df974
  Built:            Tue Oct 18 18:18:08 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.8
  GitCommit:        9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

-

2). 動作しているコンテナの確認

$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→現在起動されているコンテナの情報等が表示:

-

3). 停止中を含めたコンテナの一覧の表示:

$ sudo docker ps -a
:
CONTAINER ID   IMAGE         COMMAND    CREATED       STATUS                   PORTS     NAMES
8568bab22f14   hello-world   "/hello"   5 hours ago   Exited (0) 5 hours ago             dreamy_black

→実行してすぐに終了するアプリだったので、「項番 2)」には表示されませんが、こちらには表示。

-

4). イメージの確認:

$ sudo docker images
:
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   12 months ago   13.3kB

→ダウンロードされているイメージがあれば表示されます。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ---

4. 「Docker」でコンテナが動くことを確認:

-

1). hello-world イメージを実行して、Docker エンジンが正しく動くことを確認:

サービスの開始:

$ sudo service docker start
$ 

-

コンテナの実行:

$ sudo docker run hello-world
:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:18a657d0cc1c7d0678a3fbea8b7eb4918bba25968d3e1b0adebfa71caddbc346
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/

→和訳:

イメージ 'hello-world:latest' がローカルに見つかりません
最新: library/hello-world からプルします
2db29710123e: プル完了しました
ダイジェスト: sha256:18a657d0cc1c7d0678a3fbea8b7eb4918bba25968d3e1b0adebfa71caddbc346
ステータス: hello-world:latest の新しいイメージをダウンロードしました

Docker からこんにちは!
このメッセージは、インストールが正しく機能しているかを示しています。

このメッセージを生成するために、Docker は次の手順を実行しました:

1. Docker クライアントが Docker デーモンに接続しました。
2. Docker デーモンは、Docker Hub から「hello-world」 (amd64) イメージをプルしました。
3. Docker デーモンは、「現在読んでいる出力を生成する実行可能ファイルを実行する」そのイメージから
 新しいコンテナーを作成しました。
4. Docker デーモンはその出力を Docker クライアントにストリーミングし、
 Docker クライアントはそれを端末に送信しました。

→単に「Docker からこんにちは!」を表示するだけではなく、多くの情報を表示。

-

「イメージをダウンロード」 →「コンテナで実行」 →「メッセージを出力して終了」

-

Docker エンジンがちゃんとインストールされ、実行されたことが確認できました。

-

2). docker グループは作成されましたが、ユーザーは追加されません:

グループ確認:

$ id
uid=1000(ubn) gid=1000(ubn) groups=1000(ubn),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),122(lpadmin),132(lxd),133(sambashare)

$ groups
ubn adm cdrom sudo dip plugdev lpadmin lxd sambashare

-

ファイルを見ないとわからないみたい:

$ cut -d: -f1 /etc/group
:
root
daemon
bin
sys
adm
tty
disk
lp
mail
news
uucp
man
proxy
kmem
dialout
fax
voice
cdrom
floppy
tape
sudo
audio
dip
www-data
backup
operator
list
irc
src
gnats
shadow
utmp
video
sasl
plugdev
staff
games
users
nogroup
systemd-journal
systemd-network
systemd-resolve
crontab
messagebus
systemd-timesync
input
sgx
kvm
render
syslog
_ssh
tss
bluetooth
ssl-cert
uuidd
tcpdump
plocate
avahi-autoipd
netdev
avahi
lpadmin
lightdm
nopasswdlogin
rtkit
whoopsie
scanner
saned
colord
pulse
pulse-access
lxd
ubn
sambashare
docker     ←(追加されました)

→行の中の、必要な部分のみ表示しました。

-

  • 設定しないままだと、Docker コマンドを実行するには、sudo を使用する必要があります。

-

3). Docker サービスの状態の確認:

$ systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled>
     Active: active (running) since Fri 2022-10-14 10:57:27 JST;>
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 3073 (dockerd)
      Tasks: 9
     Memory: 26.3M
        CPU: 1.752s
     CGroup: /system.slice/docker.service
             └─3073 /usr/bin/dockerd -H fd:// --containerd=/run/>

10月 14 10:57:26 ubn-box dockerd[3073]: time="2022-10-14T10:57:2>
10月 14 10:57:26 ubn-box dockerd[3073]: time="2022-10-14T10:57:2>
10月 14 10:57:27 ubn-box dockerd[3073]: time="2022-10-14T10:57:2>
10月 14 10:57:27 ubn-box dockerd[3073]: time="2022-10-14T10:57:2>
10月 14 10:57:27 ubn-box dockerd[3073]: time="2022-10-14T10:57:2>
10月 14 10:57:27 ubn-box dockerd[3073]: time="2022-10-14T10:57:2>
10月 14 10:57:27 ubn-box dockerd[3073]: time="2022-10-14T10:57:2>
10月 14 10:57:27 ubn-box systemd[1]: Started Docker Application >
10月 14 10:57:27 ubn-box dockerd[3073]: time="2022-10-14T10:57:2>
10月 14 11:01:57 ubn-box dockerd[3073]: time="2022-10-14T11:01:5>

「q」で終了

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----

5. sudo を使わずに実行したいときの設定:

-

Linux のインストール後の手順:

Post-installation steps for Linux

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- -----

6. Docker をチュートリアルで学ぶ:

-

コンテナで「Docker のチュートリアル」が準備されていました。 おもしろいですね。

-

イメージをビルドして、コンテナ化されたアプリとして実行する方法をチュートリアルで学びます:

「はじめに」(Get started )

Start the tutorial

-

1). チュートリアルを実行:

$ sudo docker run -d -p 80:80 docker/getting-started
:
Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
df9b9388f04a: Pull complete 
5867cba5fcbd: Pull complete 
4b639e65cb3b: Pull complete 
061ed9e2b976: Pull complete 
bc19f3e8eeb1: Pull complete 
4071be97c256: Pull complete 
79b586f1a54b: Pull complete 
0c9732f525d6: Pull complete 
Digest: sha256:b558be874169471bd4e65bd6eac8c303b271a7ee8553ba47481b73b2bf597aae
Status: Downloaded newer image for docker/getting-started:latest
7a4fff3414686bcd4261cd9febe78e5bdc2b051edd1a655a22d91c76a9cb4674

→正常に起動されました。ブラウザからチュートリアルを閲覧できます。

-

または、

$ sudo docker run -dp 80:80 docker/getting-started

-

パラメータの説明:

-d

デタッチ モードで(バックグラウンドで)、コンテナを実行します。

-

-p 80:80

ホストのポート 80 をコンテナのポート 80 にマップします。
チュートリアルにアクセスするには、Web ブラウザを開き、http://localhost:80 に移動します。
.
ホスト マシンのポート 80 を使うサービスが既にある場合は、別のポートを指定します。
例えば、-p 3000:80 を指定してから、Web ブラウザーを介して
http://localhost:3000チュートリアルにアクセスします。

-

2). 動作しているコンテナの確認:

$ sudo docker ps
:
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                               NAMES
7a4fff341468   docker/getting-started   "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   tender_roentgen

-

3). Firefox ブラウザを起動:

-

4). 「http://localhost:80」を入力して、チュートリアルにアクセス:

「Getting Started」(http://localhost/tutorial/) ページが開きました:

こちらの項番の最初に確認した、 Start the tutorial と同じページです。

-

開いたページより、抜粋して和訳:

-

「コンテナ」とは?

コンテナは、ホスト マシン上の他のすべてのプロセスから分離された、マシン上の別のプロセスです。

この分離は、カーネル名前空間と cgroups を活用しています。
これは、Linux に長い間存在していた機能です。 Docker は、これらの機能を使いやすいものしました。

-

「コンテナイメージ」とは?

コンテナを実行する場合、分離されたファイルシステムを使用します。

このカスタム ファイル システムは、「コンテナ イメージ」によって提供されます。

イメージにはコンテナのファイルシステムが含まれているため、アプリケーションを実行するために必要なすべてのもの (すべての依存関係、構成、スクリプト、バイナリなど) を含めておく必要があります。

「コンテナイメージ」には、環境変数、実行する既定のコマンドなど、コンテナの他の構成も含まれています。

-

情報

chroot についての知識があるなら、コンテナを chroot の拡張バージョンと考えてください。

ファイルシステムは、単にイメージから取得されます。
ただし、コンテナは、単純に chroot を使う場合には利用できない「追加の分離」を追加します。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- -

7. 「Docker」コマンドを使ってみる(その2):

-

1). 起動しているコンテナを表示:

$ sudo docker ps
:
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                               NAMES
7a4fff341468   docker/getting-started   "/docker-entrypoint.…"   27 minutes ago   Up 27 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   tender_roentgen

-

2). 起動しているコンテナの、コンテナIDを表示:

$ sudo docker ps -q
:
7a4fff341468

-

3). コンテナIDを指定して停止:

$ sudo docker stop 7a4fff341468
7a4fff341468

-

4). すべてのコンテナを停止

$ sudo docker stop $(sudo docker ps -q)

-

5). 停止しているコンテナも含め、すべてのコンテナを削除

$ sudo docker rm $(sudo docker ps -q -a)

-

6). すべてのイメージを削除:

コンテナを停止してから、Dockerのイメージを削除:

$ sudo docker stop $(sudo docker ps -q) && docker rmi $(sudo docker images -q) -f

→通常はコンテナが停止していないとDockerのイメージを削除することができません

「-f」は強制実行の指定です。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- --

8. Docker で開発する:

-

リンク先は英語です。

-

Docker で開発する

Develop with Docker より抜粋して和訳:

-

1). Docker から最大限のメリットを得るには:

(1). Dockerfile を使用してイメージをビルドする 方法を学ぶ
(2). マルチステージ ビルド を使用して画像をスリムに保つ
(3). ボリュームバインド マウント を使用してアプリケーション データを管理する
(4). Kubernetes でアプリをスケーリング する
(5). アプリを Swarm サービスとしてスケーリング する
(6). 一般的なアプリケーション開発のベスト な実施

-

2). Docker を使って、プログラミング言語別のアプリの開発:

(1). Java 開発者向け Docker ラボ
(2). node.js アプリを Docker ラボに移植 する
(3). Docker ラボの Ruby on Rails アプリ
(4). 「.Net Core」アプリを Docker 化 する
(5). Docker Compose を使用して
  Linux 上の SQL Server で ASP.NET Core アプリケーションを Docker 化 する

-

3). SDK または API を使用した高度な開発:

「Dockerfiles」または「Compose ファイル」を記述して、Docker CLI を使用できるようになったら、

「Docker Engine SDK for Go/Python」を使用するか、「HTTP API」を直接使用して次のレベルに進みます。

-

Docker エンジン API を使用した開発セクションにアクセスして、

エンジン API を使用した開発の詳細、選択したプログラミング言語SDK の場所、およびいくつかの例を参照してください。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ---

9. 「Dockerfile」について:

-

Dockerfile reference から抜粋して和訳:

英語で使いづらいので和訳しました。長いので、途中までです。

-


Docker は、「Dockerfile」から指示を読み取ることによって、イメージを自動的に構築できます

-

「Dockerfile」は、イメージを組み立てるために、ユーザがコマンド ラインで呼び出すことができるすべてのコマンドを含む、テキスト ドキュメントです。

「docker build」を使用すると、複数のコマンドライン命令を連続して実行する、自動ビルドを作成できます。

-

このページを読み終わったら、「Dockerfile のベスト プラクティスのヒント集」 を参照してください。

-

使い方:

「docker build」コマンドは、「Dockerfile」とコンテキストからイメージをビルドします。

ビルドのコンテキストは、指定された場所 PATH または URL にある一連のファイルです。

PATH は、ローカル ファイル システム上のディレクトリです。 URL は Git リポジトリの場所です。

-

ビルド コンテキストは再帰的に処理されます。

したがって、PATH にはすべてのサブディレクトリが含まれ、URL にはリポジトリとそのサブモジュールが含まれます。

-

例:
「docker build」にて、現在のディレクトリ (.) をビルド コンテキストとして使う場合:
$ docker build .
Sending build context to Docker daemon  6.51 MB
...

→コマンドの行末に「.」があることに注意

-

ビルドは、CLI コマンドではなく、Docker デーモンによって実行されます。

ビルド プロセスが最初に行うことは、コンテキスト全体を (再帰的に) デーモンに送信することです。

-

ほとんどの場合、コンテキストとして空のディレクトリから開始し、「Dockerfile」をそのディレクトリに保持することをお勧めします。

「Dockerfile」のビルドに必要なファイルのみを追加します。

-

警告:

ルート ディレクトリ「/」をビルド コンテキストの PATH として使用しないでください。

ビルドによってハード ドライブの内容全体が Docker デーモンに転送されるためです。

-

ビルド コンテキストでファイルを使用するために、Dockerfile は、COPY 命令などの命令で指定されたファイルを参照します。ビルドのパフォーマンスを向上させるには、コンテキスト ディレクトリに「.dockerignore」ファイルを追加して、ファイルとディレクトリを除外します。

-

「.dockerignore」ファイルの作成方法については、このページのドキュメントを参照してください。

伝統的に、Dockerfile は Dockerfile と呼ばれ、コンテキストの「ルート」に配置されます。

-

「docker build」で「-f」フラグを使用して、ファイル システム内の任意の場所にある Dockerfile を指定します:

$ docker build -f /path/to/a/Dockerfile .

→コマンドの行末に「.」があることに注意

-

ビルドが成功した場合に新しいイメージを保存するリポジトリとタグを指定できます:

$ docker build -t shykes/myapp .

→行末に「.」があることに注意

-

ビルド後にイメージを複数のリポジトリにタグ付けするには、ビルド コマンドを実行するときに複数の「-t」パラメータを追加します:

$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .

→コマンドの行末に「.」があることに注意

-

Docker デーモンは、Dockerfile の命令を実行する前に、Dockerfile の予備検証を実行し、構文が正しくない場合はエラーを返します:

$ docker build -t test/myapp .
[+] Building 0.3s (2/2) FINISHED
 => [internal] load build definition from Dockerfile                       0.1s
 => => transferring dockerfile: 60B                                        0.0s
 => [internal] load .dockerignore                                          0.1s
 => => transferring context: 2B                                            0.0s
error: failed to solve: epc error: code = Unknown desc = failed to solce with frontend dockerfile.v0: filed to create LLB definition: ror line 2: unknown instruction: RUNCMD

→コマンドの行末に「.」があることに注意

-

Docker デーモンは、Dockerfile 内の命令を 1 つずつ実行し、必要に応じて各命令の結果を新しいイメージにコミットしてから、最終的に新しいイメージの ID を出力します。 Docker デーモンは、送信したコンテキストを自動的にクリーンアップします。

各命令は独立して実行され、新しいイメージが作成されることに注意してください。
そのため、RUN cd /tmp は次の命令には影響しません。

可能な限り、Docker は build-cache を使用して docker ビルド プロセスを大幅に高速化します。

これは、コンソール出力の CACHED メッセージで示されます。 (詳細については、Dockerfile のベスト プラクティス ガイドを参照してください)。

$  docker build -t svendowideit/ambassador .

→コマンドの行末に「.」があることに注意

出力される CACHED メッセージに着目してください。

-

デフォルトでは、ビルド キャッシュは、ビルドしているマシンでの以前のビルドの結果に基づいています。 「--cache-from」オプションを使用すると、イメージ レジストリを介して配布されるビルド キャッシュを使用することもできます。

docker build コマンド リファレンスの外部キャッシュ ソースの指定 に関するセクションを参照してください。

-

ビルドが完了、これで下記を行う準備が整いました:

docker scan を使用してイメージをスキャン

イメージを Docker Hub にプッシュ

-

BuildKit

-

(続く)...

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----

10. Docker の「データ共有」について:

-

Docker におけるデータ管理 から抜粋:

-

ファイル共有の方法:

Docker コンテナやサービスにおいてデータを保持するためには、「ボリューム」 でマウントするのが推奨されています。それは、「ボリューム」にすることで、Docker によって管理できます。

-


マウントタイプでの使い分け:

-

(1). ボリューム:

Docker によって管理されます。

Linux であれば、保存されるディレクトリは、/var/lib/docker/volumes/<ボリューム名> です。

Docker 以外のプロセスは、変更を行ってはなりません。

ボリュームは複数のコンテナーに対して同時にマウントすることができます。

未使用のボリュームはdocker volume pruneによって削除することができます。

ボリュームでは ボリュームドライバー の利用がサポートされます。

-

-

(2). バインドマウント:

ホストマシン 上のファイルやディレクトリがコンテナにマウントされます。 そのファイルやディレクトリは、ホストマシン上のフルパスによって参照されます。

ホストマシン上のファイルシステムに依存し、利用可能な所定のディレクトリ構造に従って動作します。

-

ホストシステム上の どこにでも 保存することができ、それが重要なシステムファイルやディレクトリであってもかまいません。 Docker ホスト上の Docker に無関係なプロセスや Docker コンテナであったとしても、これを修正することがいつでもできます。

コンテナ内に動作するプロセスを通じて ホスト のファイルシステムに変更がかけられるので、 セキュリティに影響を及ぼす可能性があります。

バインドマウントを直接管理するような Docker CLI コマンドはありません。

-

-

(3). tmpfs マウント:

ホストシステムのメモリ上にのみ保存されます。

Docker ホスト上もコンテナー上も、ディスクに長く保持できません。

-

-

(4). 名前つきパイプ(named pipe):

Docker ホストとコンテナーの間での通信のために利用されます。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- -----

11. コンテナを使ってみる:

-

コンテナを使えるようにしたけど、どう使うのかわからないので、色々とトライしました。

公式サイトのサンプルを参考にしました。

-


1). Docker ボリュームをコマンドで設定した例:

-

(1). Docker ボリュームの「test-vol-01」を作成:

作業前:

$ sudo ls -l /var/lib/docker/volumes/
:
brw------- 1 root root 252, 2 10月 17 00:00 backingFsBlockDev
-rw------- 1 root root  32768 10月 17 00:00 metadata.db

-

ボリュームを作成:

$ sudo docker volume create test-vol-01
:
test-vol-01

-

ファイルを確認:

$ sudo ls -l /var/lib/docker/volumes/
:
brw------- 1 root root 252, 2 10月 17 00:00 backingFsBlockDev
-rw------- 1 root root  32768 10月 17 00:07 metadata.db
drwx-----x 3 root root   4096 10月 17 00:07 test-vol-01   ←(作成)

-

フォルダの中を確認:

$ sudo ls -l /var/lib/docker/volumes/test-vol-01/
:
drwxr-xr-x 2 root root 4096 10月 17 00:07 _data
$ sudo ls -l /var/lib/docker/volumes/test-vol-01/_data
合計 0

→空です。

-

(2). コンテナ「test-vol-cont」を作成:

Docker ボリュームの「test-vol-01」をファイル共有するコンテナです:

$ sudo docker run -d --name test-vol-cont \
  --mount source=test-vol-01,target=/app \
  ubuntu

→「貼り付け」て、Enter

:
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
cf92e523b49e: Pull complete 
Digest: sha256:35fb073f9e56eb84041b0745cb714eff0f7b225ea9e024f703cab56aaa5c7720
Status: Downloaded newer image for ubuntu:latest
6ae59fb44466ed2ea9bf4a53b9c5f844bc5fdb01efe8fbc36563cd7627c383b0

-

確認:

$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→現在、何も起動されていません。

$ sudo docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS                     PORTS     NAMES
6ae59fb44466   ubuntu                   "bash"                   2 minutes ago   Exited (0) 2 minutes ago             test-vol-cont
7a4fff341468   docker/getting-started   "/docker-entrypoint.…"   2 days ago      Exited (0) 2 days ago                tender_roentgen
8568bab22f14   hello-world              "/hello"                 2 days ago      Exited (0) 2 days ago                dreamy_black

→「ubuntu のシェル」が起動して、すぐに終了しています。

-

(3). Docker オブジェクトの情報を確認:
$ sudo docker inspect --help
:
Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]

Return low-level information on Docker objects

Options:
  -f, --format string   Format the output using the given
                        Go template
  -s, --size            Display total file sizes if the
                        type is container
      --type string     Return JSON for specified type

→Docker オブジェクトに関する低レベルの情報を表示します。

-

コンテナの詳細表示:

$ sudo docker inspect test-vol-cont
[
    {
        "Id": "6ae59fb44466ed2ea9bf4a53b9c5f844bc5fdb01efe8fbc36563cd7627c383b0",
        "Created": "2022-10-16T15:13:52.369087148Z",
        "Path": "bash",
        "Args": [],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-10-16T15:13:53.776337144Z",
            "FinishedAt": "2022-10-16T15:13:53.786672048Z"
        },
        "Image": "sha256:216c552ea5ba7b0e3f6e33624e129981c39996021403518019d19b8843c27cbc",
        "ResolvConfPath": "/var/lib/docker/containers/6ae59fb44466ed2ea9bf4a53b9c5f844bc5fdb01efe8fbc36563cd7627c383b0/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/6ae59fb44466ed2ea9bf4a53b9c5f844bc5fdb01efe8fbc36563cd7627c383b0/hostname",
        "HostsPath": "/var/lib/docker/containers/6ae59fb44466ed2ea9bf4a53b9c5f844bc5fdb01efe8fbc36563cd7627c383b0/hosts",
        "LogPath": "/var/lib/docker/containers/6ae59fb44466ed2ea9bf4a53b9c5f844bc5fdb01efe8fbc36563cd7627c383b0/6ae59fb44466ed2ea9bf4a53b9c5f844bc5fdb01efe8fbc36563cd7627c383b0-json.log",
        "Name": "/test-vol-cont",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "private",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": null,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "Mounts": [
                {
                    "Type": "volume",
                    "Source": "test-vol-01",
                    "Target": "/app"
                }
            ],
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/0fb0a9d7ae70ad7f3ab4f7140b69d0ee6c8f7bf1407ba759fc6c022695b0fd64-init/diff:/var/lib/docker/overlay2/a65ef2169cad71e223105191e3494ae1f637cd9fd100acddc1e614d68bdd73a9/diff",
                "MergedDir": "/var/lib/docker/overlay2/0fb0a9d7ae70ad7f3ab4f7140b69d0ee6c8f7bf1407ba759fc6c022695b0fd64/merged",
                "UpperDir": "/var/lib/docker/overlay2/0fb0a9d7ae70ad7f3ab4f7140b69d0ee6c8f7bf1407ba759fc6c022695b0fd64/diff",
                "WorkDir": "/var/lib/docker/overlay2/0fb0a9d7ae70ad7f3ab4f7140b69d0ee6c8f7bf1407ba759fc6c022695b0fd64/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "test-vol-01",
                "Source": "/var/lib/docker/volumes/test-vol-01/_data",  ←★
                "Destination": "/app",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "6ae59fb44466",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "bash"           ←(実行コマンド)
            ],
            "Image": "ubuntu",       ←(コンテナイメージ)
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "26bc179a547cad49e31f8fff44c840183719f8ec488f4d8415ce89aaa74b8c85",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/26bc179a547c",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "bfcd336ddbbbb5aa12079d2944a51afbd6d5061a18d0373aea2964fd443f2e60",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]

→「★」: マウント元(ソース)となる、ホスト側のファイルパス

その部分を抜き出し:

                "Source": "/var/lib/docker/volumes/test-vol-01/_data",  ←★
                "Destination": "/app",

→その下の「/app」フォルダが、マウントの宛先となる、コンテナ側のフォルダ名

-

コンテナ内で、"bash" でファイル操作して、ファイルを残せば、ファイル共有ができます。

-


2). 上記のコマンドを「docker-compose.yml」で設定した場合:

Compose file version 3 reference (volumes)

→docker-compose のバージョンによって、ComposeFile の書き方が異なるので、注意

-

Docker のボリューム「test-vol-01」を共有したサービス「test-vol-cont」を作成:

-

long の書式で記述:

$ cat docker-compose.yml
version: "3.9"
services:
  test-vol-cont:
    image: ubuntu
    volumes:
      - type: volume
        source: test-vol-01
        target: /app
volumes:
  test-vol-01:

volumes で Docker ボリュームを作成して、これを source に指定。

target や type は、「docker run」コマンドと同じように指定。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- -

12. 「docker」コマンドの新旧の違い:

-

参考:

Dockerコマンド、新旧どちらを覚えるべきか? 」から抜粋:

-

Docker コマンドは、2017年 1月リリースの v1.13 (Docker CE 17.03) 以降、コマンドの命令体系が「再編成」されました。

理由は、トップレベル・コマンド群が増えすぎたことと、使用頻度にばらつきが出たことです。 新しいコマンド形式が推奨ですが、旧コマンドも使用できます。

→コマンドの利用目的が分かりやすくなりました。

-

1). コマンドの形式:

docker 対象 操作 オプション

  • 対象:
  • コンテナを管理する  「container」
  • イメージを管理する  「image」
  • 操作:
  • コンテナを実行する  「run」

  • 動作を制御する   「start/stop」

-

2). 旧コマンド →新コマンド の対応:

  • docker run   → docker container run (コンテナの実行)
  • docker ps   → docker container ls (コンテナの一覧)
  • docker images → docker image ls (イメージの一覧)
  • docker history → docker image history (イメージの履歴)

-

3). 「docker container」コマンドでコンテナを管理:

新コマンド 旧コマンド 説 明
docker container attach docker attach 実行中のコンテナにアタッチ
docker container commit docker commit コンテナに対する変更から新しいイメージを作成
docker container cp docker cp コンテナとローカル間でファイルとディレクトリのコピー
docker container create docker 新しいコンテナの作成
docker container diff docker diff イメージとコンテナの変更情報を調べる
docker container exec docker exec 実行中のコンテナ内でコマンド実行
docker container export docker export コンテナのファイルシステムをtarアーカイブ
docker container inspect docker container inspect コンテナの詳細情報を表示
docker container kill docker kill コンテナのプロセスを停止(kill)
docker container logs docker logs コンテナのログを表示
docker container ls docker ps コンテナ一覧の表示
docker container ps docker ps コンテナ一覧の表示
ddocker container pause docker pause コンテナのプロセスを一時停止(pause)
docker container port docker port コンテナが使用しているポート情報の表示
docker container prune (v1.13~) 停止中の全コンテナを削除
docker container rename docker rename コンテナの名称を変更
docker container restart docker restart コンテナを再起動
docker container rm docker rm コンテナの削除
docker container run docker run 新しいコンテナを実行
docker container start docker start 停止中のコンテナを起動
docker container stats docker stats コンテナのリソース使用状況を表示
docker container stop docker stop 実行中のコンテナを停止
docker container top docker top コンテナが実行しているプロセスを表示
docker container unpause docker unpause 一時停止中のコンテナを再開
docker container update docker update コンテナの(リソース)設定を変更
docker container wait docker wait コンテナが停止するまで待機

-

4). 「docker image」コマンドでイメージを管理:

新コマンド 旧コマンド 説 明
docker image build docker build Dockerfile からイメージを構築(ビルド)
docker image history docker history イメージの履歴を表示
docker image import docker import tar 形式のファイルを読み込み、イメージを作成
docker image inspect docker inspect イメージの詳細情報を表示
docker image load docker load tar 形式または標準入力からイメージを読み込む
docker image ls docker images イメージ一覧表示
docker image list docker images イメージ一覧表示
docker image prune (v1.13~) 使用していないイメージを削除
docker image pull docker pull イメージをレジストリから取得
docker image push docker push イメージをレジストリに送信
docker image rm docker rmi イメージを削除
docker image save docker save イメージを tar 形式または標準出力にストリーム
docker image tag docker tag イメージを参照する新しいタグを付ける

-


5). docker コマンドのヘルプ:

docker help     ←このヘルプのみ「ハイフン」がなくてもOK
docker --help
docker container --help
docker container run --help
docker container image --help
docker container image pull --help
:

-


6). 「docker」コマンドのヘルプ:

$ docker --help
:
Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files
                           (default "/home/ubn/.docker")
  -c, --context string     Name of the context to use to
                           connect to the daemon
                           (overrides DOCKER_HOST env var
                           and default context set with
                           "docker context use")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level
                           ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this
                           CA (default
                           "/home/ubn/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file
                           (default
                           "/home/ubn/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default
                           "/home/ubn/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  app*        Docker App (Docker Inc., v0.9.1-beta3)
  builder     Manage builds
  buildx*     Docker Buildx (Docker Inc., v0.9.1-docker)
  compose*    Docker Compose (Docker Inc., v2.11.2)
  config      Manage Docker configs
  container   Manage containers
  context     Manage contexts
  image       Manage images
  manifest    Manage Docker image manifests and manifest lists
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  scan*       Docker Scan (Docker Inc., v0.17.0)
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.

To get more help with docker, check out our guides at https://docs.docker.com/go/guides/

-


7). 「docker run」コマンドのヘルプ:

$ sudo docker run --help
:
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and
                                       1000, or 0 to disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight)
                                       (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
      --cgroup-parent string           Optional parent cgroup for the container
      --cgroupns string                Cgroup namespace to use (host|private)
                                       'host':    Run the container in the Docker
                                       host's cgroup namespace
                                       'private': Run the container in its own
                                       private cgroup namespace
                                       '':        Use the cgroup namespace as
                                       configured by the
                                                  default-cgroupns-mode option on
                                       the daemon (default)
      --cidfile string                 Write the container ID to the file
      --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int              Limit CPU real-time period in microseconds
      --cpu-rt-runtime int             Limit CPU real-time runtime in microseconds
  -c, --cpu-shares int                 CPU shares (relative weight)
      --cpus decimal                   Number of CPUs
      --cpuset-cpus string             CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string             MEMs in which to allow execution (0-3, 0,1)
  -d, --detach                         Run container in background and print
                                       container ID
      --detach-keys string             Override the key sequence for detaching a
                                       container
      --device list                    Add a host device to the container
      --device-cgroup-rule list        Add a rule to the cgroup allowed devices list
      --device-read-bps list           Limit read rate (bytes per second) from a
                                       device (default [])
      --device-read-iops list          Limit read rate (IO per second) from a
                                       device (default [])
      --device-write-bps list          Limit write rate (bytes per second) to a
                                       device (default [])
      --device-write-iops list         Limit write rate (IO per second) to a
                                       device (default [])
      --disable-content-trust          Skip image verification (default true)
      --dns list                       Set custom DNS servers
      --dns-option list                Set DNS options
      --dns-search list                Set custom DNS search domains
      --domainname string              Container NIS domain name
      --entrypoint string              Overwrite the default ENTRYPOINT of the image
  -e, --env list                       Set environment variables
      --env-file list                  Read in a file of environment variables
      --expose list                    Expose a port or a range of ports
      --gpus gpu-request               GPU devices to add to the container ('all'
                                       to pass all GPUs)
      --group-add list                 Add additional groups to join
      --health-cmd string              Command to run to check health
      --health-interval duration       Time between running the check (ms|s|m|h)
                                       (default 0s)
      --health-retries int             Consecutive failures needed to report unhealthy
      --health-start-period duration   Start period for the container to
                                       initialize before starting health-retries
                                       countdown (ms|s|m|h) (default 0s)
      --health-timeout duration        Maximum time to allow one check to run
                                       (ms|s|m|h) (default 0s)
      --help                           Print usage
  -h, --hostname string                Container host name
      --init                           Run an init inside the container that
                                       forwards signals and reaps processes
  -i, --interactive                    Keep STDIN open even if not attached
      --ip string                      IPv4 address (e.g., 172.30.100.104)
      --ip6 string                     IPv6 address (e.g., 2001:db8::33)
      --ipc string                     IPC mode to use
      --isolation string               Container isolation technology
      --kernel-memory bytes            Kernel memory limit
  -l, --label list                     Set meta data on a container
      --label-file list                Read in a line delimited file of labels
      --link list                      Add link to another container
      --link-local-ip list             Container IPv4/IPv6 link-local addresses
      --log-driver string              Logging driver for the container
      --log-opt list                   Log driver options
      --mac-address string             Container MAC address (e.g., 92:d0:c6:0a:29:33)
  -m, --memory bytes                   Memory limit
      --memory-reservation bytes       Memory soft limit
      --memory-swap bytes              Swap limit equal to memory plus swap: '-1'
                                       to enable unlimited swap
      --memory-swappiness int          Tune container memory swappiness (0 to 100)
                                       (default -1)
      --mount mount                    Attach a filesystem mount to the container
      --name string                    Assign a name to the container
      --network network                Connect a container to a network
      --network-alias list             Add network-scoped alias for the container
      --no-healthcheck                 Disable any container-specified HEALTHCHECK
      --oom-kill-disable               Disable OOM Killer
      --oom-score-adj int              Tune host's OOM preferences (-1000 to 1000)
      --pid string                     PID namespace to use
      --pids-limit int                 Tune container pids limit (set -1 for unlimited)
      --platform string                Set platform if server is multi-platform capable
      --privileged                     Give extended privileges to this container
  -p, --publish list                   Publish a container's port(s) to the host
  -P, --publish-all                    Publish all exposed ports to random ports
      --pull string                    Pull image before running
                                       ("always"|"missing"|"never") (default "missing")
      --read-only                      Mount the container's root filesystem as
                                       read only
      --restart string                 Restart policy to apply when a container
                                       exits (default "no")
      --rm                             Automatically remove the container when it exits
      --runtime string                 Runtime to use for this container
      --security-opt list              Security Options
      --shm-size bytes                 Size of /dev/shm
      --sig-proxy                      Proxy received signals to the process
                                       (default true)
      --stop-signal string             Signal to stop a container (default "SIGTERM")
      --stop-timeout int               Timeout (in seconds) to stop a container
      --storage-opt list               Storage driver options for the container
      --sysctl map                     Sysctl options (default map[])
      --tmpfs list                     Mount a tmpfs directory
  -t, --tty                            Allocate a pseudo-TTY
      --ulimit ulimit                  Ulimit options (default [])
  -u, --user string                    Username or UID (format:
                                       <name|uid>[:<group|gid>])
      --userns string                  User namespace to use
      --uts string                     UTS namespace to use
  -v, --volume list                    Bind mount a volume
      --volume-driver string           Optional volume driver for the container
      --volumes-from list              Mount volumes from the specified container(s)
  -w, --workdir string                 Working directory inside the container

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- --

13. コンテナの修正:

-

上記で作成したコンテナ「test-vol-cont」にて、ファイル操作するように、修正しました。

-


1). まずは、すべてのコンテナを削除:

-

(1). 現在のコンテナの状態を確認:
$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→コンテナはすべて停止してます。

$ sudo docker ps -a
[sudo] ubn のパスワード: 
CONTAINER ID   IMAGE                    COMMAND                  CREATED             STATUS                         PORTS     NAMES
6ae59fb44466   ubuntu                   "bash"                   About an hour ago   Exited (0) About an hour ago             test-vol-cont
7a4fff341468   docker/getting-started   "/docker-entrypoint.…"   2 days ago          Exited (0) 2 days ago                    tender_roentgen
8568bab22f14   hello-world              "/hello"                 2 days ago          Exited (0) 2 days ago                    dreamy_black

→コンテナは 3つ

-

(2). 停止しているコンテナを、ID 指定で削除:
$ sudo docker rm 6ae59fb44466
6ae59fb44466
$ sudo docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED      STATUS                  PORTS     NAMES
7a4fff341468   docker/getting-started   "/docker-entrypoint.…"   2 days ago   Exited (0) 2 days ago             tender_roentgen
8568bab22f14   hello-world              "/hello"                 2 days ago   Exited (0) 2 days ago             dreamy_black

-

(3). 試しに、すべてのコンテナを削除:
  • コンテナが停止していないと削除できません。

-

$ sudo docker rm $(sudo docker ps -q -a)
7a4fff341468
8568bab22f14
$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

-


2). コンテナがすぐに停止しないようにコマンドを修正:

  • docker-composeで「tty:true」とすると「起動されたまま」になります。

-

(1). コマンドでは、「-it」を追加して実行:
$ sudo docker run -itd --name test-vol-cont \
  --mount source=test-vol-01,target=/app \
  ubuntu
:
886e07f975f4c106e316834fb7d1028880d97ffc4492ce6ba2736be070d37721

→コンテナが起動されたままだと、上記のような表示みたい。

-

確認:

$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES
886e07f975f4   ubuntu    "bash"    About a minute ago   Up About a minute             test-vol-cont

→コンテナが起動されたままになりました。

-

(2). コンテナに入って、操作してみました:
  • 操作対象のコンテナは、起動 (STATUS=UP) してないと操作できません。

-

$ sudo docker exec -it 886e07f975f4 bash
:
root@886e07f975f4:/#

→管理者権限のシェルプロンプトが表示

-

通常のシェル コマンドが入力できました:

root@886e07f975f4:/# ls
app   dev   lib    libx32  opt   run   sys  var
bin   etc   lib32  media   proc  sbin  tmp
boot  home  lib64  mnt     root  srv   usr
root@886e07f975f4:/# pwd
/

-

(3). 試しにファイル操作:
root@886e07f975f4:/# touch test.txt
root@886e07f975f4:/# ls
app   dev   lib    libx32  opt   run   sys       usr
bin   etc   lib32  media   proc  sbin  test.txt  var
boot  home  lib64  mnt     root  srv   tmp

→やっぱり、「/」に作成されました。

-

(4). ベースOS に入れたけど、「共有ファイル」が見つかりません
  • ベースOS からは、「共有ファイル」にはアクセスできません。
 →コンテナ内でファイル操作する必要があるみたい。

-

追記:

スキル不足で、「root@886e07f975f4:/# ls」で「app」フォルダが追加されていることに、この時点では気付いていません。派手なフォルダ名だと気付いていたかも。埋もれてしまってます。

-

(5). コンテナを抜けます:
root@886e07f975f4:/# exit
exit
$ 

-

(6). すべてのコンテナを停止:
$ sudo docker stop $(sudo docker ps -q)
886e07f975f4

-

(7). すべてのコンテナを削除:
$ sudo docker rm $(sudo docker ps -q -a)
886e07f975f4

-

(8). 確認:
$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→すべてのコンテナがなくなりました。

-

-


3). 「Dockerfile」を作って、コンテナを作成し直すことにしました:

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ---

14. 「Dockerfile」の作成について:

-

作業は要りません。眺めるだけで良いです。

-


Dockerfile で利用できる命令:

参考:

わくわくBank. 作業の流れ Dockerfile作成 」 からの抜粋:

Dockerfileで利用できる命令 」を参照。

-


Dockerfile を作成するときの留意点:

参考:

効率的に安全な Dockerfile を作るには 」から抜粋:

-

作業の流れ:

(1). ベースにする Docker イメージを決めます
(2). docker run -it <docker-image> sh でコンテナ内部で作業
(3). 1行ずつ、うまくいったらどこかにメモ
(4). 失敗したらクリーンな環境でやり直し: exit して再度 docker run
(5). ファイルの取り込みやポートの外部公開が必要ならオプション付きで docker run
(6). 全部うまくいったら Dockerfile を作成

-

コツ:
  • 各ツールを対話なしで実行します:  (y オプション、yes)
  • ファイルの上書きなどで不慮のエラーが起きないよう強制オプション使用:  (cp -f、ln -f)
  • 不要なログを抑えます:  (curl -s、wget -q)

-

オプション付きで docker run が必要なケース

-

(1). 外からの接続を前提:

→ポートをホスト側に公開しておくと良いです:

$ sudo docker run -it -p 80:80 centos:7 /bin/bash

-

(2). 外部ファイルを取り込む:

Dockerfile でいう「ADD/COPY」が必要。

→ホスト側の作業フォルダをコンテナ内部にマウントしておくと良いです:

$ sudo docker run -it -v $(pwd):/tmp/share centos:7 /bin/bash

-

「docker run --rm ...」のように「--rm」を付けておくと、

シェルから抜けたときの Docker コンテナの残骸を後で docker rm で掃除する必要がなくなります。

ただし Dockerfile を作る場合に「commit」を使いながら作っていくときは付けません。

-

レイヤー削減のために RUN に「&&」を付けるときは、

処理が失敗したときにどこまで進んだかわかるように、 コマンドそのものを標準エラー出力に出すため 「set -x」 します。

-

「set -x」についての参考:

シェルスクリプトの一部分をデバッグするには

シェルスクリプトのデバッグ

-

ヘルプ表示:

$ set --help | grep -- -x
              xtrace       same as -x
      -x  Print commands and their arguments as they are executed.
          The -x and -v options are turned off.

→和訳: コマンドとその引数を実行時に出力します。

-

「set -x」の使用例:

-

フラグのセット:
$ set -x
+ set -x
$ date
+ date
2022年 10月 22日 土曜日 03:26:03 JST

$ echo $(date) | grep JST
+ grep --color=auto JST
++ date
+ echo 2022年 10月 22日 土曜日 03:32:08 JST
2022年 10月 22日 土曜日 03:32:08 JST

→対象の「JST」のみ赤色表示(grep の機能)

3つのコマンドで処理されているのがわかります。

-

フラグの解除:
$ set +x
+ set +x
$ echo $(date) | grep JST
2022年 10月 22日 土曜日 03:34:00 JST

→対象の「JST」のみ赤色表示(grep の機能)

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----

15. 「Dockerfile」の作成例:

-

作業は要りませんが、学習のため試してみました。

-

参考:

わくわくBank. 作業の流れ Dockerfile作成 」 から抜粋:

-


事前作業:

-

(1). すべてのコンテナを停止:
$ sudo docker stop $(sudo docker ps -q)
:
Stop one or more running containers

→すべてのコンテナがすでに停止していると(ひとつでもコンテナがないと)エラーしますが、無視。

-

(2). すべてのコンテナを削除:
$ sudo docker rm $(sudo docker ps -q -a)
afe667537986

-

(3). 確認:
$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→すべてのコンテナがなくなりました。

-

-


1). 「ベースイメージ」のコンテナ内で事前の確認作業:

ベースイメージは「centos:7」です。

-

(1). 下記を実行して、「ベースイメージ」のコンテナ内で必要な作業が正しく動作するか確認:
$ sudo docker container run -it centos:7 /bin/bash
:
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407
Status: Downloaded newer image for centos:7
[root@b622e0b33bb0 /]# 

→シェルが使える状態(管理者権限)で立ち上がりました。

-

(2). シェルを使ってみます:
[root@b622e0b33bb0 /]# ls
anaconda-post.log  etc   lib64  opt   run   sys  var
bin                home  media  proc  sbin  tmp
dev                lib   mnt    root  srv   usr
[root@b622e0b33bb0 /]# pwd
/
[root@b622e0b33bb0 /]# uname -r
5.15.0-50-generic
[root@b622e0b33bb0 /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@b622e0b33bb0 /]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

-

(3). 抜けました:
[root@b622e0b33bb0 /]# exit
exit
$ 

-

(4). 確認:
$ sudo docker ps -a
:
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS                          PORTS     NAMES
b622e0b33bb0   centos:7   "/bin/bash"   6 minutes ago   Exited (0) About a minute ago             festive_chatelet

→exit で抜けたので、コンテナ停止

-

確認:

$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→動いているコンテナはありません。

-

(5). すべてのコンテナを削除:
$ sudo docker rm $(sudo docker ps -q -a)
b622e0b33bb0

-

確認:
$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→すべてのコンテナがなくなりました。

-

(6). すべてのイメージを削除:
$ sudo docker stop $(sudo docker ps -q) && docker rmi $(sudo docker images -q) -f

→通常はコンテナが停止していないとDockerのイメージを削除することができません

「-f」は強制実行の指定です。

-

注意: コンテナの 「docker/getting-started」が残っていると、ブラウザ表示を邪魔します。

ブラウザの設定で、以前のページを保持しない設定にしておきます。

-

確認:

$ sudo docker images
:
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

-

(7). 一度再起動:
$ reboot

-

(8). 作業が正しく動作することを確認できたので、「Dockerfile」を作成します。

-


2). Dockerfile を作成:

-

作業フォルダの準備:
$ mkdir -p ~/ダウンロード/test-15
$ cd ~/ダウンロード/test-15/

-

Dockerfile を作成:
$ mousepad Dockerfile
FROM centos:7
  
RUN echo "now building..."
RUN yum -y install httpd
RUN sed -i '/#ServerName/a ServerName www.example.com:80' /etc/httpd/conf/httpd.conf

ADD ./index.html /var/www/html/

EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

-

コンテナ内に追加する index.html を作成:
$ mousepad index.html
hello

-

ファイルの確認:
$ cd ~/ダウンロード/test-15/
$ ls -1
:
Dockerfile
index.html

-


3). 作成した Dockerfile を元に Docker イメージ を作成:

$ sudo docker image build -t xxxx/sample:latest .
:
Sending build context to Docker daemon  3.072kB
Step 1/7 : FROM centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete 
Digest: sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407
Status: Downloaded newer image for centos:7
 ---> eeb6ee3f44bd
Step 2/7 : RUN echo "now building..."
 ---> Running in 8eacc1cabdc4
now building...
Removing intermediate container 8eacc1cabdc4
 ---> a152f968e3e7
Step 3/7 : RUN yum -y install httpd
 ---> Running in e8d0abd2950c
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * updates: ftp.jaist.ac.jp
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-97.el7.centos.5 will be installed
--> Processing Dependency: httpd-tools = 2.4.6-97.el7.centos.5 for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-7.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-97.el7.centos.5 will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch        Version                       Repository    Size
================================================================================
Installing:
 httpd             x86_64      2.4.6-97.el7.centos.5         updates      2.7 M
Installing for dependencies:
 apr               x86_64      1.4.8-7.el7                   base         104 k
 apr-util          x86_64      1.5.2-6.el7                   base          92 k
 centos-logos      noarch      70.0.6-3.el7.centos           base          21 M
 httpd-tools       x86_64      2.4.6-97.el7.centos.5         updates       94 k
 mailcap           noarch      2.1.41-2.el7                  base          31 k

Transaction Summary
================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 24 M
Installed size: 32 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/apr-util-1.5.2-6.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for apr-util-1.5.2-6.el7.x86_64.rpm is not installed
Public key for httpd-tools-2.4.6-97.el7.centos.5.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total                                              261 kB/s |  24 MB  01:35     
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-9.2009.0.el7.centos.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : apr-1.4.8-7.el7.x86_64                                       1/6 
  Installing : apr-util-1.5.2-6.el7.x86_64                                  2/6 
  Installing : httpd-tools-2.4.6-97.el7.centos.5.x86_64                     3/6 
  Installing : centos-logos-70.0.6-3.el7.centos.noarch                      4/6 
  Installing : mailcap-2.1.41-2.el7.noarch                                  5/6 
  Installing : httpd-2.4.6-97.el7.centos.5.x86_64                           6/6 
  Verifying  : httpd-tools-2.4.6-97.el7.centos.5.x86_64                     1/6 
  Verifying  : mailcap-2.1.41-2.el7.noarch                                  2/6 
  Verifying  : apr-1.4.8-7.el7.x86_64                                       3/6 
  Verifying  : apr-util-1.5.2-6.el7.x86_64                                  4/6 
  Verifying  : httpd-2.4.6-97.el7.centos.5.x86_64                           5/6 
  Verifying  : centos-logos-70.0.6-3.el7.centos.noarch                      6/6 

Installed:
  httpd.x86_64 0:2.4.6-97.el7.centos.5                                          

Dependency Installed:
  apr.x86_64 0:1.4.8-7.el7                                                      
  apr-util.x86_64 0:1.5.2-6.el7                                                 
  centos-logos.noarch 0:70.0.6-3.el7.centos                                     
  httpd-tools.x86_64 0:2.4.6-97.el7.centos.5                                    
  mailcap.noarch 0:2.1.41-2.el7                                                 

Complete!
Removing intermediate container e8d0abd2950c
 ---> 2371310bbba7
Step 4/7 : RUN sed -i '/#ServerName/a ServerName www.example.com:80' /etc/httpd/conf/httpd.conf
 ---> Running in cd72af3ffb6e
Removing intermediate container cd72af3ffb6e
 ---> eb55d22c45ca
Step 5/7 : ADD ./index.html /var/www/html/
 ---> db8b87127f18
Step 6/7 : EXPOSE 80
 ---> Running in f58094bb1150
Removing intermediate container f58094bb1150
 ---> 9dccafd47a91
Step 7/7 : CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
 ---> Running in 6a2dbf85b202
Removing intermediate container 6a2dbf85b202
 ---> 338cd01dd8ef
Successfully built 338cd01dd8ef
Successfully tagged xxxx/sample:latest

→コマンドの行末に「.」があるので注意。

-

作成された Dockerイメージ を確認:
$ sudo docker image ls
:
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
xxxx/sample   latest    338cd01dd8ef   3 minutes ago   419MB
centos        7         eeb6ee3f44bd   13 months ago   204MB

もしくは、

$ sudo docker images
:
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
xxxx/sample   latest    338cd01dd8ef   6 minutes ago   419MB
centos        7         eeb6ee3f44bd   13 months ago   204MB

→「xxxx/sample」があることを確認。

-


4). 作成したイメージでコンテナ起動:

$ sudo docker container run -d -p 3000:80 xxxx/sample
:
36e8d90245f7a44a7048040c89264eb35d3d665a0c35feaffe932b99efaf91e4

→ブラウザ表示できなかったので「-p 3000:80」に変更しています。

-

$ sudo docker container ls
:
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                   NAMES
36e8d90245f7   xxxx/sample   "/usr/sbin/httpd -D …"   2 minutes ago   Up 2 minutes   0.0.0.0:3000->80/tcp, :::3000->80/tcp   determined_haslett

もしくは、

$ sudo docker ps
:
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                   NAMES
36e8d90245f7   xxxx/sample   "/usr/sbin/httpd -D …"   2 minutes ago   Up 2 minutes   0.0.0.0:3000->80/tcp, :::3000->80/tcp   determined_haslett

-


5). ブラウザからアクセスできるかを確認:

コマンドに「-p 3000:80」を指定したので、

-

ブラウザに「http://localhost:3000」を入力:

→うまく表示できました。

-

-


6). 後始末:

-

(1). コンテナの停止:
$ sudo docker ps
:
CONTAINER ID   IMAGE         COMMAND                  CREATED       STATUS       PORTS                                   NAMES
36e8d90245f7   xxxx/sample   "/usr/sbin/httpd -D …"   2 hours ago   Up 2 hours   0.0.0.0:3000->80/tcp, :::3000->80/tcp   determined_haslett

$ sudo docker stop 36e8d90245f7
36e8d90245f7

$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

(2). コンテナの削除:
$ sudo docker ps -a
:
CONTAINER ID   IMAGE         COMMAND                  CREATED       STATUS                      PORTS     NAMES
36e8d90245f7   xxxx/sample   "/usr/sbin/httpd -D …"   2 hours ago   Exited (0) 18 seconds ago             determined_haslett

$ sudo docker rm 36e8d90245f7
36e8d90245f7

$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

(3). イメージの削除:

確認:

$ sudo docker images
:
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
xxxx/sample   latest    338cd01dd8ef   2 hours ago     419MB
centos        7         eeb6ee3f44bd   13 months ago   204MB

-

削除:

$ sudo docker rmi 338cd01dd8ef
Untagged: xxxx/sample:latest
Deleted: sha256:338cd01dd8ef384bc7edfbabf2ab2945ad1563449af40eaac282e0c318b56a17
Deleted: sha256:9dccafd47a91fbb1379279742c91ba5e460881259231c4b94edb377fcfde35c0
Deleted: sha256:db8b87127f188f9b471f1290c2758f4497335f16d08ec9f30678ee01c4192472
Deleted: sha256:1c8537197ddd6812b2fafca07f142d7421728a71bcaa3709f31d7d9fb99dc453
Deleted: sha256:eb55d22c45ca504e872f28d3fad2335156944d311fa382e409c1edab6cdad832
Deleted: sha256:0e9bbdbe1e96270b14b9965f6fa18898656d9b3a6296d8d96861aa8e4a1cf0e7
Deleted: sha256:2371310bbba7c933e73ba69c0eb724fd537abc36f8613af48e75617e10e86174
Deleted: sha256:a3bd3f8068a26a776d678518c500927146722b92cfd802a87bfff797b3461323
Deleted: sha256:a152f968e3e74371b5492e43c7ef745138c3073b39c2cca12d7c1ba8e861f0fd

$ sudo docker rmi eeb6ee3f44bd
Untagged: centos:7
Untagged: centos@sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407
Deleted: sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9
Deleted: sha256:174f5685490326fc0a1c0f5570b8663732189b327007e47ff13d2ca59673db02

-

確認:

$ sudo docker images
:
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

→削除されました。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- -----

16. 「Dockerfile」の作成:

-

実際に作成しました。「項番 13」の続きです。

-

参考:

わくわくBank. 作業の流れ Dockerfile作成

-


1). 作業フォルダを準備:

$ mkdir -p ~/ダウンロード/test-16

-


2). Dockerfile を作成:

$ mousepad ~/ダウンロード/test-16/Dockerfile
FROM ubuntu:latest
RUN echo '---------------------------'
RUN pwd
RUN touch test.txt
RUN ls -l 2>/dev/null
RUN echo '---------------------------'

→これで良いのかは、試してみないとわかりません。

-

追記: RUN 行を追記してもイメージ作成時にしか表示(実行)されないので、これだと無駄でした

→命令の実行のタイミングを考える必要があることがわかりました。無駄ではありませんでした。

-

ちなみに、イメージを作成する現時点で、「存在しないフォルダ」はエラーになり停止します

例えば、以下の行は入れられませんでした:

RUN ls /var/lib/docker/volumes/test-vol-01/_data/ 2>/dev/null

→それがわかっただけでも、OK

-

こちらのコンテナだけだと、先にイメージは作られているので、ボリュームが指定される前に、ファイル操作は終わっていそう。

なので、先にボリューム指定するコンテナを起動しっぱなしにしておき、
次に、こちらのファイル操作を行うコンテナを起動する必要があるかな。

-

書き方:

FROM:ベースイメージ (今回は ubuntu のベースイメージ) を指定

RUN:Docker イメージを作成するときに「だけ」実行するコマンドを指定

-


3). Dockerfile からイメージを作成:

docker image build -t イメージ名[:タグ名] [Dockerfileが配置されているディレクトリパス]

「-t」オプション でイメージ名を指定

-

イメージ名の付け方:

<アカウント名>/<イメージ名>:<タグ>

  • アカウント名:

    Docker Hubでのアカウント名を指定します。任意です。

  • イメージ名:

    イメージ名です。必須です。

  • タグ:

    バージョン 、または ラベル を設定します。任意です。

    設定しない場合、 latest タグ が付けられます。

-

カレントディレクトリ (.) にある Dockerfile を元にイメージ名「test-vol-cont」とタグ名「v1」のdockerイメージを作成:

$ cd ~/ダウンロード/test-16/
$ sudo docker image build -t test-vol-cont:v1 .
:
Sending build context to Docker daemon  2.048kB
Step 1/6 : FROM ubuntu:latest
latest: Pulling from library/ubuntu
cf92e523b49e: Pull complete 
Digest: sha256:35fb073f9e56eb84041b0745cb714eff0f7b225ea9e024f703cab56aaa5c7720
Status: Downloaded newer image for ubuntu:latest
 ---> 216c552ea5ba
Step 2/6 : RUN echo '---------------------------'
 ---> Running in 119b6b7ba1ea
---------------------------
Removing intermediate container 119b6b7ba1ea
 ---> 2b923c5baf50
Step 3/6 : RUN pwd
 ---> Running in f752a41027ea
/
Removing intermediate container f752a41027ea
 ---> 1f9a96c9ab53
Step 4/6 : RUN touch test.txt
 ---> Running in 1feef5fe8dbc
Removing intermediate container 1feef5fe8dbc
 ---> 8d56f9c44295
Step 5/6 : RUN ls -l 2>/dev/null
 ---> Running in fb4b18146c9f
total 48
lrwxrwxrwx   1 root root    7 Oct  3 21:41 bin -> usr/bin
drwxr-xr-x   2 root root 4096 Apr 18 10:28 boot
drwxr-xr-x   5 root root  340 Oct 17 16:27 dev
drwxr-xr-x   1 root root 4096 Oct 17 16:27 etc
drwxr-xr-x   2 root root 4096 Apr 18 10:28 home
lrwxrwxrwx   1 root root    7 Oct  3 21:41 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Oct  3 21:41 lib32 -> usr/lib32
lrwxrwxrwx   1 root root    9 Oct  3 21:41 lib64 -> usr/lib64
lrwxrwxrwx   1 root root   10 Oct  3 21:41 libx32 -> usr/libx32
drwxr-xr-x   2 root root 4096 Oct  3 21:41 media
drwxr-xr-x   2 root root 4096 Oct  3 21:41 mnt
drwxr-xr-x   2 root root 4096 Oct  3 21:41 opt
dr-xr-xr-x 259 root root    0 Oct 17 16:27 proc
drwx------   2 root root 4096 Oct  3 21:44 root
drwxr-xr-x   5 root root 4096 Oct  3 21:44 run
lrwxrwxrwx   1 root root    8 Oct  3 21:41 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Oct  3 21:41 srv
dr-xr-xr-x  13 root root    0 Oct 17 16:27 sys
-rw-r--r--   1 root root    0 Oct 17 16:27 test.txt
drwxrwxrwt   2 root root 4096 Oct  3 21:44 tmp
drwxr-xr-x  14 root root 4096 Oct  3 21:41 usr
drwxr-xr-x  11 root root 4096 Oct  3 21:44 var
Removing intermediate container fb4b18146c9f
 ---> c6ad3aab84fb
Step 6/6 : RUN echo '---------------------------'
 ---> Running in 3359ea75cb61
---------------------------
Removing intermediate container 3359ea75cb61
 ---> 3d3966eb881d
Successfully built 3d3966eb881d
Successfully tagged test-vol-cont:v1

→追記: イメージを作るときにだけ、RUN の行は実行されるみたい。

-

イメージが作成されたか確認:
$ sudo docker image ls
:
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
test-vol-cont   v1        3d3966eb881d   4 minutes ago   77.8MB
ubuntu          latest    216c552ea5ba   12 days ago     77.8MB

または、

$ sudo docker images
:
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
test-vol-cont   v1        3d3966eb881d   4 minutes ago   77.8MB
ubuntu          latest    216c552ea5ba   12 days ago     77.8MB

-


4). ファイルを確認:

$ sudo ls -l /var/lib/docker/volumes/
:
brw------- 1 root root 252, 2 10月 17 18:45 backingFsBlockDev
-rw------- 1 root root  32768 10月 17 18:45 metadata.db
drwx-----x 3 root root   4096 10月 17 00:07 test-vol-01   ←(注目)

-

もし、「test-vol-01」がない場合は、ボリュームを作成:

$ sudo docker volume create test-vol-01
:
test-vol-01

→なければ、自動で作られるようなので要らないかも。

-


5). 先にボリューム指定を行うコンテナを起動しっぱなしにします:

Docker ボリュームの「test-vol-01」をファイル共有するコンテナです:

$ sudo docker run -itd --name test-vol \
  --mount source=test-vol-01,target=/app ubuntu
:
290b1f1fcfba0d919b45678a317360fa516e0627891e977f51b7ff2b31b5153c

-

確認:

$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
290b1f1fcfba   ubuntu    "bash"    53 seconds ago   Up 52 seconds             test-vol

-


6). 作成したイメージでコンテナ起動:

Docker ボリュームの「test-vol-01」をファイル共有するコンテナです:

$ sudo docker container run -d --name test-vol-2 \
  --mount source=test-vol-01,target=/app test-vol-cont:v1
:
742ed5e0d16ccfe6673cc2392b766e72831bf682b83ed7b9630cb21406c96291

→イメージを実行するときに、「ls」を入れたので、何かしらの表示があると期待していたら、何も表示されません。

-

RUN 行は、「イメージを作成するときにだけ実行される」行だったようです。

それだと、「ベースOS のシステム更新」とか、「足りないパッケージのインストール」とか、そういう事前準備的な使い方になりそう。

特に、ファイルが存在しないときに、そのファイルを ls すると、エラーしてイメージの作成が中断されます。

-

確認:

$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
290b1f1fcfba   ubuntu    "bash"    2 minutes ago   Up 2 minutes             test-vol

$ sudo docker ps -a
CONTAINER ID   IMAGE              COMMAND   CREATED              STATUS                          PORTS     NAMES
742ed5e0d16c   test-vol-cont:v1   "bash"    About a minute ago   Exited (0) About a minute ago             test-vol-2
290b1f1fcfba   ubuntu             "bash"    3 minutes ago        Up 3 minutes                              test-vol
$ sudo docker images
:
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
test-vol-cont   v1        3d3966eb881d   10 minutes ago   77.8MB
ubuntu          latest    216c552ea5ba   12 days ago      77.8MB

-


7). ファイルを確認:

$ sudo ls -l /var/lib/docker/volumes/
:
brw------- 1 root root 252, 2 10月 17 18:45 backingFsBlockDev
-rw------- 1 root root  32768 10月 17 18:45 metadata.db
drwx-----x 3 root root   4096 10月 17 00:07 test-vol-01

-

$ sudo ls /var/lib/docker/volumes/test-vol-01/
:
_data

-

$ sudo ls /var/lib/docker/volumes/test-vol-01/_data/
$

→残念ながら、空です。

-


8). 失敗でした。

-

「共有フォルダ」の使い方の勉強が足りなかったみたい。

使用例がないか、探した方が良さそう。

-

失敗から得られることもあるので、ぼちぼちとトライして行くつもり。

-

-


9). 後始末:

-

(1). コンテナの停止:
$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→すべてのコンテナが停止されています。

-

もし、コンテナが残っていたら停止:

$ sudo docker stop 36e8d90245f7
36e8d90245f7

-

(2). コンテナの削除:
$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
$ sudo docker ps -a
CONTAINER ID   IMAGE              COMMAND   CREATED        STATUS                      PORTS     NAMES
742ed5e0d16c   test-vol-cont:v1   "bash"    29 hours ago   Exited (0) 29 hours ago               test-vol-2
290b1f1fcfba   ubuntu             "bash"    29 hours ago   Exited (137) 27 hours ago             test-vol

-

削除:

$ sudo docker rm 742ed5e0d16c
742ed5e0d16c

$ sudo docker rm 290b1f1fcfba
290b1f1fcfba

-

確認:

$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

(3). イメージの削除:
$ sudo docker images
:
REPOSITORY      TAG       IMAGE ID       CREATED        SIZE
test-vol-cont   v1        3d3966eb881d   29 hours ago   77.8MB
ubuntu          latest    216c552ea5ba   13 days ago    77.8MB

-

削除:

$ sudo docker rmi 3d3966eb881d
:
Untagged: test-vol-cont:v1
Deleted: sha256:3d3966eb881d7bf0f25c23f61fdc1df928e74a7f92147b4382e2cebf3fe32ae5
Deleted: sha256:c6ad3aab84fb6bd202d39510a43c862c23bed89d5286bf6f2ee0fef5de1792be
Deleted: sha256:8d56f9c44295f005362ffa249222698074199525f29c787869d516499fcf72ad
Deleted: sha256:c37d543eee1eb160bfd4b208a6f884c27093e0d3a5479a6575a2c443f5730814
Deleted: sha256:1f9a96c9ab530073f86d9fec336c8335c81d2f7d06074420718a419d8a4921a5
Deleted: sha256:2b923c5baf5097d41770fadd6eaf3f57172a0625442e05cbdc8a216765b524ff

$ sudo docker rmi 216c552ea5ba
:
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:35fb073f9e56eb84041b0745cb714eff0f7b225ea9e024f703cab56aaa5c7720
Deleted: sha256:216c552ea5ba7b0e3f6e33624e129981c39996021403518019d19b8843c27cbc
Deleted: sha256:17f623af01e277c5ffe6779af8164907de02d9af7a0e161662fc735dd64f117b

-

確認:

$ sudo docker images
:
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

-

-

(「項番 17 」に続く)...

-

-


参考: もし、成功していて、「Docker Hub」に Push する場合:

-

(1). 「Docker Hub」にログイン:
  • 事前に「Docker Hub」でユーザー登録を済ませておく必要があります。

-

$ sudo docker login

→ユーザ名、パスワード、メールアドレス、入力

-

(2). 「Docker Hub」に Push:
$ sudo docker push イメージ名

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----- -

17. 「Dockerfile」の作成、仕切り直し:

-

「項番 16」の続きです。Dockerfile はわかりやすい別の内容に変更しました。

作業の目標は、「コンテナを削除してもデータを残す」こと。

-

参考:

公式の volume コマンドの説明:

Dockerfile reference - volume 」から抜粋:

-


1). 作業フォルダを準備:

$ mkdir -p ~/ダウンロード/test-17

-


2). Dockerfile を作成:

  • docker でデータの保管領域をコンテナ内に持たないようにするために volume は使います。

-

$ mousepad ~/ダウンロード/test-17/Dockerfile
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/test01.txt
VOLUME /myvol

→コンテナ内の /myvol ディレクトリを volume として指定しました。

-

ファイルの確認:
$ cd ~/ダウンロード/test-17/
$ ls -1
:
Dockerfile

-


3). 作成した Dockerfile を元に Docker イメージ を作成:

$ sudo docker image build -t image01 .
:
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu
latest: Pulling from library/ubuntu
cf92e523b49e: Pull complete 
Digest: sha256:35fb073f9e56eb84041b0745cb714eff0f7b225ea9e024f703cab56aaa5c7720
Status: Downloaded newer image for ubuntu:latest
 ---> 216c552ea5ba
Step 2/4 : RUN mkdir /myvol
 ---> Running in dff60c118b1f
Removing intermediate container dff60c118b1f
 ---> ef79e9d97cde
Step 3/4 : RUN echo "hello world" > /myvol/test01.txt
 ---> Running in 6113ff0b7aec
Removing intermediate container 6113ff0b7aec
 ---> 07641153fee4
Step 4/4 : VOLUME /myvol
 ---> Running in 70df06bd09d7
Removing intermediate container 70df06bd09d7
 ---> bae92bd22744
Successfully built bae92bd22744
Successfully tagged image01:latest

→コマンドの行末に「.」があるので注意。

-

作成された Dockerイメージ を確認:
$ sudo docker image ls
:
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
image01      latest    bae92bd22744   41 seconds ago   77.8MB
ubuntu       latest    216c552ea5ba   13 days ago      77.8MB

もしくは、

$ sudo docker images
:
image01      latest    bae92bd22744   About a minute ago   77.8MB
ubuntu       latest    216c552ea5ba   13 days ago          77.8MB

→「image01」があることを確認。ベースOS で「ubuntu」の最新(latest)がダウンロードされています。

-


4). 作成したイメージでコンテナ起動:

-

(1). マウントするパスも、コンテナ名も、指定しないで起動した場合:
$ sudo docker run -d image01
:
91254e55d6699d9b94f755ca21bec371b0f7d756ce18a992b11496c87ff1a9f6

→コンテナ名を指定しなくても、コンテナは起動できるみたい。

-

(2). 確認:
$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→起動してすぐに終了したようです。

-

$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS                          PORTS     NAMES
91254e55d669   image01   "bash"    About a minute ago   Exited (0) About a minute ago             determined_yalow

→右が欠けて表示されていたら、右にスクロールしてください。

コンテナ名は自動で「determined_yalow」になりました。和訳は「決定済」です。

-

(3). Volume 指定されたディレクトリが、マウントされる(コンテナの外の)場所を確認してみました:

上記の Dockerfile で作成したイメージを docker run で「-v」オプションなしで起動した場合は、 docker サーバー内のコンテナ用の作業ディレクトリに Volume が自動でマウントされます。

-

(4). Volume のマウント状況の確認するには:

sudo docker inspect {コンテナID(先頭1桁以上)}

→ "Mounts" の "Source": を確認します。

-

(5). コンテナの詳細表示:
$ sudo docker inspect 9

→他にコンテナがなければ、先頭 1文字でも OK

-

もしくは、

$ sudo docker inspect 91254e55d669
:
[
    {
        "Id": "91254e55d6699d9b94f755ca21bec371b0f7d756ce18a992b11496c87ff1a9f6",  ←(コンテナ ID)
        "Created": "2022-10-18T21:43:30.411109562Z",    ←(コンテナ作成日時)
        "Path": "bash",
        "Args": [],
        "State": {
            "Status": "exited",        ←(コンテナ停止中)
: (省略)

        "Image": "sha256:bae92bd22744bfbfe68bc576af8a686f08ab29e4b4eeaad5eab96a4063e9b10e",
        "ResolvConfPath": "/var/lib/docker/containers/91254e55d6699d9b94f755ca21bec371b0f7d756ce18a992b11496c87ff1a9f6/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/91254e55d6699d9b94f755ca21bec371b0f7d756ce18a992b11496c87ff1a9f6/hostname",
        "HostsPath": "/var/lib/docker/containers/91254e55d6699d9b94f755ca21bec371b0f7d756ce18a992b11496c87ff1a9f6/hosts",
        "LogPath": "/var/lib/docker/containers/91254e55d6699d9b94f755ca21bec371b0f7d756ce18a992b11496c87ff1a9f6/91254e55d6699d9b94f755ca21bec371b0f7d756ce18a992b11496c87ff1a9f6-json.log",
        "Name": "/determined_yalow",        ←(コンテナ名)
: (省略)

        "Mounts": [
            {
                "Type": "volume",        ←(マウントタイプは、ボリューム)
                "Name": "964e5b9d0b56252d4c7cccb52d01687b2c942e4ec2f0d5bd26b954e2d6b1ae95",
                "Source": "/var/lib/docker/volumes/964e5b9d0b56252d4c7cccb52d01687b2c942e4ec2f0d5bd26b954e2d6b1ae95/_data",
                "Destination": "/myvol",     ←(ボリューム名)
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "91254e55d669",
: (省略)

            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "bash"
            ],
            "Image": "image01",      ←(イメージ名)
            "Volumes": {
                "/myvol": {}     ←(ボリューム名)
            },
: (省略)

→色々な情報が確認できますが、見るのは大変です。

-

(6). コンテナの詳細表示の中の大分類で、 "Mounts"(マウント指定)の部分をベタ表示:
$ sudo docker inspect -f '{{json .Mounts}}' 91254e55d669
:
[{"Type":"volume","Name":"964e5b9d0b56252d4c7cccb52d01687b2c942e4ec2f0d5bd26b954e2d6b1ae95","Source":"/var/lib/docker/volumes/964e5b9d0b56252d4c7cccb52d01687b2c942e4ec2f0d5bd26b954e2d6b1ae95/_data","Destination":"/myvol","Driver":"local","Mode":"","RW":true,"Propagation":""}]

もしくは、

$ sudo docker inspect -f '{{.Mounts}}' 91254e55d669
:
[{volume 964e5b9d0b56252d4c7cccb52d01687b2c942e4ec2f0d5bd26b954e2d6b1ae95 /var/lib/docker/volumes/964e5b9d0b56252d4c7cccb52d01687b2c942e4ec2f0d5bd26b954e2d6b1ae95/_data /myvol local  true }]

→「json」がないと、内容だけの表示になり見づらいです。

-

(7). 他のキー(大分類)でも確認:
$ sudo docker inspect -f '{{json .Id}}' 9
"91254e55d6699d9b94f755ca21bec371b0f7d756ce18a992b11496c87ff1a9f6"

→配下がなければ、分類キーは表示されません。

-

$ sudo docker inspect -f '{{json .Image}}' 91254e55d669
"sha256:bae92bd22744bfbfe68bc576af8a686f08ab29e4b4eeaad5eab96a4063e9b10e"

-

$ sudo docker inspect -f '{{json .Config}}' 91254e55d669
{"Hostname":"91254e55d669","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["bash"],"Image":"image01","Volumes":{"/myvol":{}},"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}}

-

(8). ボリュームの状態を「ls」で確認:
$ sudo docker exec 91254e55d669 ls -l /myvol
:
Error response from daemon: Container 91254e55d6699d9b94f755ca21bec371b0f7d756ce18a992b11496c87ff1a9f6 is not running

→コンテナが起動していないと、実行できないみたい。

-

(9). 動作しているコンテナを確認:
$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

(10). すべてのコンテナを確認:
$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED        STATUS                    PORTS     NAMES
91254e55d669   image01   "bash"    11 hours ago   Exited (0) 11 hours ago             determined_yalow

→右が欠けて表示されていたら、右にスクロールしてください。

-

参考: 動作しているコンテナを確認(新コマンド):
$ sudo docker container ls
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

または、

$ sudo docker container list
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

参考: すべてのコンテナを確認(新コマンド):
$ sudo docker container ls -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED        STATUS                    PORTS     NAMES
91254e55d669   image01   "bash"    11 hours ago   Exited (0) 11 hours ago             determined_yalow

または、

$ sudo docker container list -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED        STATUS                    PORTS     NAMES
91254e55d669   image01   "bash"    11 hours ago   Exited (0) 11 hours ago             determined_yalow

もしくは、

$ sudo docker container list --all
:
CONTAINER ID   IMAGE     COMMAND   CREATED        STATUS                    PORTS     NAMES
91254e55d669   image01   "bash"    11 hours ago   Exited (0) 11 hours ago             determined_yalow

→新コマンドは、何をしているのかがわかりやすいけど、キー入力が多くなるのが難点。

-


5). コンテナを起動し放しで起動:

-

(1). マウントするパスも、コンテナ名も、指定しないで起動した場合:
$ sudo docker run -itd image01
:
6e44c359c05013af13f3499c6ccd4b60b361e28a50601a9c348ed180e84ab919

→コンテナ名を指定しなくても、コンテナは起動できました。

-

(2). 確認:
$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES
6e44c359c050   image01   "bash"    About a minute ago   Up About a minute             peaceful_shockley

→右側が表示しきれないので、右にスクロールしてください。

→起動しても終了しません。

コンテナ名は自動で「peaceful_shockley」になりました。和訳は「平和なショックレー」です。 「ショックレー」はダイオードの発明者だったと思いますが、別の意味があるのかは不明。 ランダムに選ばれるみたい。

-

$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                     PORTS     NAMES
6e44c359c050   image01   "bash"    15 seconds ago   Up 14 seconds                        peaceful_shockley
91254e55d669   image01   "bash"    11 hours ago     Exited (0) 3 minutes ago             determined_yalow

→右側が表示しきれないので、右にスクロールしてください。

→同じイメージで起動してすぐに停止した、コンテナの「determined_yalow」がそのまま残っていますが、無視。

-

(2). 起動しているコンテナのボリュームの状態を「シェルコマンド」で確認:
  • こちらのコマンドは、1行実行するたびに終了します:

行末が実行したい「シェルのコマンド」です。

$ sudo docker exec 6e44c359c050 ls -l /myvol
total 4
-rw-r--r-- 1 root root 12 Oct 18 21:32 test01.txt
$ sudo docker exec 6e44c359c050 pwd
/
$ sudo docker exec 6e44c359c050 ls -l /
total 52
lrwxrwxrwx   1 root root    7 Oct  3 21:41 bin -> usr/bin
drwxr-xr-x   2 root root 4096 Apr 18  2022 boot
drwxr-xr-x   5 root root  360 Oct 19 09:03 dev
drwxr-xr-x   1 root root 4096 Oct 19 09:03 etc
drwxr-xr-x   2 root root 4096 Apr 18  2022 home
lrwxrwxrwx   1 root root    7 Oct  3 21:41 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Oct  3 21:41 lib32 -> usr/lib32
lrwxrwxrwx   1 root root    9 Oct  3 21:41 lib64 -> usr/lib64
lrwxrwxrwx   1 root root   10 Oct  3 21:41 libx32 -> usr/libx32
drwxr-xr-x   2 root root 4096 Oct  3 21:41 media
drwxr-xr-x   2 root root 4096 Oct  3 21:41 mnt
drwxr-xr-x   2 root root 4096 Oct 19 09:03 myvol   ←(注目)
drwxr-xr-x   2 root root 4096 Oct  3 21:41 opt
dr-xr-xr-x 250 root root    0 Oct 19 09:03 proc
drwx------   2 root root 4096 Oct  3 21:44 root
drwxr-xr-x   5 root root 4096 Oct  3 21:44 run
lrwxrwxrwx   1 root root    8 Oct  3 21:41 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Oct  3 21:41 srv
dr-xr-xr-x  13 root root    0 Oct 19 09:03 sys
drwxrwxrwt   2 root root 4096 Oct  3 21:44 tmp
drwxr-xr-x  14 root root 4096 Oct  3 21:41 usr
drwxr-xr-x  11 root root 4096 Oct  3 21:44 var

-

$ sudo docker exec 6e44c359c050 ls -l /myvol/
total 4
-rw-r--r-- 1 root root 12 Oct 18 21:32 test01.txt
$ which grep
/usr/bin/grep

$ sudo docker exec 6e44c359c050 ls -l | /usr/bin/grep myvol
drwxr-xr-x   2 root root 4096 Oct 19 09:03 myvol

→パスが通っていないので注意。

-

$ sudo docker exec 6e44c359c050 ls -l /myvol/test01.txt
-rw-r--r-- 1 root root 12 Oct 18 21:32 /myvol/test01.txt
$ sudo docker exec 6e44c359c050 cat /myvol/test01.txt
hello world

→ボリュームにあるファイルの中身が見れました。

-

(3). 何かしらの「エディタ」がインストールされていないか確認:
$ sudo docker exec 6e44c359c050 which nano
$ sudo docker exec 6e44c359c050 which vi
$ sudo docker exec 6e44c359c050 which which
/usr/bin/which

→インストールされていません。

-

(4). しかたないので、echo で既存のファイルに行を追加してみました:
$ sudo docker exec 6e44c359c050 echo ' -test- ' >> /myvol/test01.txt
bash: /myvol/test01.txt: そのようなファイルやディレクトリはありません

→ファイルの変更ができません。

-

$ sudo docker exec 6e44c359c050 ls -l /myvol/test01.txt
-rw-r--r-- 1 root root 12 Oct 18 21:32 /myvol/test01.txt

→root であれば、変更できそうなのですが…。

-

(5). ホストのマウントポイントを確認:
$ sudo docker inspect -f '{{json .Mounts}}' 6e44c359c050
:
[{"Type":"volume","Name":"6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431",
"Source":"/var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data",
"Destination":"/myvol","Driver":"local","Mode":"","RW":true,"Propagation":""}]

→右側が表示しきれないので、右にスクロールしてください。

-

(6). ホスト側からファイル操作:
$ sudo ls -l /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/
:
-rw-r--r-- 1 root root 12 10月 19 06:32 test01.txt

→ファイルは見えています。

-

(7). ファイル内容を表示:
$ sudo cat /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt
:
hello world

-

(8). ホスト側の nano エディタで、ファイル内容を変更:
$ sudo nano /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt

→ 1行追記しました。

-

(9). 修正内容の確認:
$ sudo cat /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt
:
hello world
add test      ←(追記)

→ホスト側から、ファイルの修正ができました。

-

(10). 「項番 (4).」でエラーしたやり方で修正できるか、ホスト側で確認:
$ sudo echo ' -test- '
 -test- 
$ sudo echo ' -test- ' >> /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt
:
bash: /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt: 許可がありません

→エラー表示は違いますが、このやり方ではダメでした。

-

(11). 修正のやり方を変えて、トライ:
$ sudo bash -c "echo ' -test- '"
 -test- 
$ sudo bash -c "echo ' -test- ' >> /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt"

-

(12). 修正内容の確認:
$ sudo cat /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt
:
hello world
add test

 -test-       ←(注目)

→改行が余計でした(nano で追加?)が、うまく修正できました。

-

(13). 上記のやり方で、ファイル操作:
$ sudo docker exec 6e44c359c050 bash -c "echo ' -test2- ' >> /myvol/test01.txt"

-

(14). 修正内容の確認:
$ sudo docker exec 6e44c359c050 cat /myvol/test01.txt
:
hello world
add test

 -test- 
 -test2-        ←(注目)

→うまく行きました。

-

(15). コンテナを停止:
$ sudo docker stop 6e44c359c050
6e44c359c050
$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

$ sudo ls /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt
:
/var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt

→ファイルは残っています。

-

(16). コンテナを削除:
$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED        STATUS                       PORTS     NAMES
6e44c359c050   image01   "bash"    6 hours ago    Exited (137) 4 minutes ago             peaceful_shockley
91254e55d669   image01   "bash"    17 hours ago   Exited (0) 6 hours ago                 determined_yalow
$ sudo docker rm 6e44c359c050
6e44c359c050

$ sudo docker rm 91254e55d669
91254e55d669
$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

$ sudo ls /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt
:
/var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt

→ファイルは残っています。

-

$ sudo cat /var/lib/docker/volumes/6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431/_data/test01.txt
:
hello world
add test

 -test- 
 -test2- 

→コンテナを削除しても、ファイル内容は残っています。

-

「コンテナを削除してもデータを残す」ことの目標を達成

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----- --

18. 「バインド マウント」を使ったコンテナの使用:

-

「バインド マウント」と「ボリューム」マウントの違いがわからないので、調べてみました。

-

参考:

Use bind mounts 」からの抜粋:

-

「バインド マウント」は、Docker の初期の頃から存在しています。
「ボリューム」マウントに比べて機能が制限されているので、オススメされていません。

-


「バインド マウント」について:

  • 「バインド マウント」を使用すると、ホスト マシン上のファイル またはディレクトリが、コンテナにマウントされます。

  • ファイル またはディレクトリは、ホスト マシン上の絶対パスによって参照されます。

  • 「バインド マウント」は、ホスト マシンのファイル システムに依存しています。

 →新しい Docker アプリケーションを開発する場合は、
  代わりに「名前付きボリューム」を使うのがオススメです。

  • Docker CLI コマンドを使用して「バインド マウント」を直接管理することはできません。

-

-


1). 「バインド マウント」(bind mount) して、コンテナを起動する場合:

使用例:

開発ホストに、ディレクトリ source があり、ソース コードをビルドするときに成果物を開発ホストの別のディレクトリ source/target/ に保存します。

開発ホストでソースをビルドするたびに、コンテナの /app/ で、新しいビルドにアクセスできるように、 開発ホストの target/ ディレクトリをコンテナの /app/ に「バインド マウント」します。

-

ソース ディレクトリ「source」内からコマンドを実行します。

$(pwd) のコマンドは、Linux ホストの「現在の作業ディレクトリ」になります。

-

(1).「--mount」フラグを使う場合のコンテナの起動コマンド:

作業ディレクトリの準備:

$ sudo mkdir -p /tmp/source/target
$ cd /tmp/source/

-

コンテナの起動:

$ sudo docker run -d -it --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest
:
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
bd159e379b3b: Pull complete 
6659684f075c: Pull complete 
679576c0baac: Pull complete 
22ca44aeb873: Pull complete 
b45acafbea93: Pull complete 
bcbbe1cb4836: Pull complete 
Digest: sha256:5ffb682b98b0362b66754387e86b0cd31a5cb7123e49e7f6f6617690900d20b2
Status: Downloaded newer image for nginx:latest
30f553076c91c139d7f6c9755f6875dee1133a81dd2e8ca09091e4cb7cc8fce7

→「nginx:latest」のイメージのダウンロードメッセージが表示されています。

-

もしくは、

-

(2).「-v」フラグを使う場合のコンテナの起動コマンド:
$ sudo docker run -d -it --name devtest \
  -v "$(pwd)"/target:/app \
  nginx:latest
:
f02bcd3e4e230976a8a47ba7028f2ab20ae4a221fc75c6586fc07dce083cd8f4

-

確認:

$ sudo docker ps
:
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
30f553076c91   nginx:latest   "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   80/tcp    devtest
$ sudo docker volume list
:
DRIVER    VOLUME NAME

-

2). コンテナにて、バインド マウントが正しく作成されたことを確認:

(マウント セクション)を表示:

両方ともに結果は同じで、下記のようになります。

$ sudo docker inspect devtest
:
        "Mounts": [
            {
                "Type": "bind",              ←(注目)
                "Source": "/tmp/source/target",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
:

-

もしくは、

$ sudo docker inspect -f '{{json .Mounts}}' devtest
:
[{"Type":"bind","Source":"/tmp/source/target","Destination":"/app","Mode":"","RW":true,"Propagation":"rprivate"}]
$ sudo docker inspect -f '{{json .Mounts}}' 30f553076c91
:
[{"Type":"bind","Source":"/tmp/source/target","Destination":"/app","Mode":"","RW":true,"Propagation":"rprivate"}]

-

3). 両方の、どちらかのコンテナを実行する場合は、コンテナを削除:

$ sudo docker container stop devtest
devtest
$ sudo docker container rm devtest
devtest

→最初のコンテナを実行した後に devtest コンテナを削除しない限り、両方を実行することはできません。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----- ---

19. 「ボリューム」マウントを使ったコンテナの使用:

-

「バインド マウント」と「ボリューム」マウントの違いがわからないので、調べてみました。

-

参考:

Use volumes 」からの抜粋:

-

「ボリューム」マウントは、Docker コンテナによって生成および使用されるデータを永く保存したいときに推奨されています。

-


「ボリューム」を使う利点:

  • ホスト マシンのディレクトリ構造と OS に依存せず、Docker によって完全に管理されます。

  • ボリュームは、バインド マウントよりもバックアップや移行が簡単です。

  • Docker CLI コマンド 、または Docker API を使用してボリュームを管理できます。

  • ボリュームは、Linux コンテナと Windows コンテナの両方で機能します。

  • ボリュームは、複数のコンテナ間でより安全に共有できます。

  • ボリューム ドライバーを使用すると、リモート ホストまたはクラウド プロバイダーにボリュームを格納して、ボリュームの内容を暗号化したり、他の機能を追加したりできます。

  • 新しいボリュームには、コンテナによって事前に設定されたコンテンツを含めることができます。

  • Docker デスクトップ上のボリュームは、Mac および Windows ホストからのバインド マウントよりもはるかに高いパフォーマンスを発揮します。

  • 「ボリューム」は、それを使うコンテナのサイズを増加させません。

  • 「ボリューム」のコンテンツは特定のコンテナの寿命と関係なく存在するので、コンテナの書き込み可能なレイヤーにデータを永続化するよりも適切です。

-

コンテナが永続的ではないデータを生成する場合は、「tmpfs 」マウントを使うことでコンテナのパフォーマンスを向上できます。(データを永続的に保存せず、コンテナの書き込み可能なレイヤーへの書き込みもしません)

ボリュームは「rprivate」バインド伝達 (bind propagation) を使用し、ボリュームに対してバインド伝達を構成することはできません。

-

-


1). 「ボリューム」マウントして、コンテナを起動する場合:

使用例:

まだ存在しないボリュームでコンテナを開始すると、Docker によってボリュームが作成されます。

作成されたボリューム「myvol2」をコンテナの /app/ にマウントします。

-

(1).「--mount」フラグを使う場合のコンテナの起動コマンド:
$ sudo docker run -d --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest
:
20191a46c97d16e8dfd757d066d143d09f6fe4487842b5cdf685bdb9818b831b

-

もしくは、

-

(2).「-v」フラグを使う場合のコンテナの起動コマンド:
$ sudo docker run -d --name devtest \
  -v myvol2:/app \
  nginx:latest
:
c35266cb219d06dab66952aaa283acef91593b02eaeb3e5c7bbfa138b4e5d631

-

確認:

$ sudo docker ps
:
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
20191a46c97d   nginx:latest   "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   80/tcp    devtest
$ sudo docker volume list
:
DRIVER    VOLUME NAME
local     myvol2

-

2). コンテナにて、バインド マウントが正しく作成されたことを確認:

(マウント セクション)を表示:

両方ともに結果は同じで、下記のようになります。

$ sudo docker inspect devtest
:
"Mounts": [
    {
        "Type": "volume",       ←(注目)
        "Name": "myvol2",
        "Source": "/var/lib/docker/volumes/myvol2/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    }
],
:

→マウントがボリュームであること、正しいソースと宛先を示していること、およびマウントが読み書き可能であることを示しています。

-

もしくは、

$ sudo docker inspect -f '{{json .Mounts}}' devtest
:
[{"Type":"volume","Name":"myvol2","Source":"/var/lib/docker/volumes/myvol2/_data","Destination":"/app","Driver":"local","Mode":"z","RW":true,"Propagation":""}]

-

3). 参考: 「ボリューム」の詳細表示:

$ sudo docker volume inspect myvol2
[
    {
        "CreatedAt": "2022-10-21T01:05:06+09:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvol2/_data",
        "Name": "myvol2",
        "Options": null,
        "Scope": "local"
    }
]

→「ボリューム」マウントの時だけ表示されます。

-

4). ファイル操作をしてみる:

-

(1). ホスト側で、確認:
$ sudo ls -la /var/lib/docker/volumes/myvol2/_data/
:
drwxr-xr-x 2 root root 4096 10月 21 01:05 .
drwx-----x 3 root root 4096 10月 21 01:05 ..

→マウント時のソースになります。

フォルダにファイルがありません。空です。

-

(2). コンテナ側で、確認:
$ sudo docker exec 20191a46c97d ls /app/
$

→マウント時の宛先になります。

フォルダにファイルがありません。空です。

-

  • 項番(1) の「_data/」と項番(2) の「/app」のフォルダの内容は同じはずです。

-

(3). ホスト側で、ファイルの追加:
$ sudo bash -c "echo 'docker volume test' >> /var/lib/docker/volumes/myvol2/_data/test01.txt"
$ sudo ls /var/lib/docker/volumes/myvol2/_data/test01.txt
:
/var/lib/docker/volumes/myvol2/_data/test01.txt

$ sudo cat /var/lib/docker/volumes/myvol2/_data/test01.txt
:
docker volume test

-

(4). コンテナ側で、ファイルの編集:
$ sudo docker exec 20191a46c97d ls /app/
:
test01.txt

$ sudo docker exec 20191a46c97d cat /app/test01.txt
:
docker volume test
$ sudo docker exec 20191a46c97d bash -c "echo 'OK' >> /app/test01.txt"

-

(5). コンテナ側で、確認:
$ sudo docker exec 20191a46c97d cat /app/test01.txt
:
docker volume test
OK

→出来上がり

-

5). 両方の、どちらかのコンテナを実行する場合は、コンテナを停止し、ボリュームを削除:

注 ボリュームの削除は別の手順です。

$ sudo docker container stop devtest
devtest

$ sudo docker container rm devtest
devtest

$ sudo docker volume rm myvol2
myvol2

→最初のコンテナを実行した後に devtest コンテナと myvol2 ボリュームを削除しない限り、両方を実行することはできません。

-

-


6). 参考: 「--volume」(-v) フラグと「--mount」フラグについて:

「docker run」コマンド において、 「--volume」(-v) または「--mount」フラグのどちらかを選べます:

--volume (-v) 構文は、すべてのオプションを 1 つのフィールドに結合します。
--mount 構文は、オプションを分離します。

-

「--volume」(-v) フラグ:

コロン (:) で区切られた 3つのフィールドで構成されます。

フィールドは正しい順序である必要があり、各フィールドの意味はすぐにはわかりません。

名前付きボリュームの場合、最初のフィールドはボリュームの名前で、特定のホスト マシン上で一意です。
匿名ボリュームの場合、最初のフィールドは省略されます。

2 番目のフィールドは、コンテナ内でファイルまたはディレクトリがマウントされているパスです。

3 番目のフィールドは、オプションで、ro などのオプションのコンマ区切りリストです。

-

「--mount」フラグ:

コンマ (,) で区切られた複数のキーと値のペアで構成され、それぞれが = タプルで構成されます。

「--mount」構文は、キーの順序は重要ではなく、フラグの値は理解しやすくなっています。

「type」: マウントのタイプ。バインド (bind)、ボリューム (volume)、tmpfs から選択。

「source」: マウントのソース。名前付きボリュームの場合、これはボリュームの名前です。
匿名ボリュームの場合、このフィールドは省略されます。 source または src として指定できます。

destination」: ファイル または ディレクトリ がコンテナにマウントされているパスです。 destination、dst、target、として指定できます。

「readonly」オプションが存在する場合は、「バインド マウント」がコンテナに「読み取り専用」としてマウントされます。 readonly または ro として指定できます。

「volume-opt」オプションは、複数回指定可能で、オプション名とその値で構成されるキーと値のペアを取ります。

-

-


7). 参考: Docker CLI コマンドの使用例:

  • コンテナを起動しなくても、「ボリューム」マウントのボリューム操作ができます。

-

注意: ちなみに、今回の投稿とは関係ないデータです。

-

(1). 「ボリューム」の作成:
$ sudo docker volume create test-vol-01

-

(2). 「ボリューム」の一覧表示:
  • 「バインドマウント」は表示されません。

-

$ sudo docker volume list
:
DRIVER    VOLUME NAME
local     6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431
local     964e5b9d0b56252d4c7cccb52d01687b2c942e4ec2f0d5bd26b954e2d6b1ae95
local     test-vol-01
local     my-vol

→上 2つは、(作成時に名前を指定しなかった)名前なしのボリュームです。

VOLUME NAME として使うときは、すべての桁が必要です。省略できません。

-

(3). 「ボリューム」が正しく作成されているかの検査:
$ docker volume inspect my-vol
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

→「ボリューム」マウントの詳細(ボリューム名、マウントポイント、ドライバー名)確認に使えます。

-

(4). 「ボリューム」の削除:
$ docker volume rm my-vol

-

(5). 「未使用ボリューム」をすべて削除:

コンテナの確認:

$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

→コンテナはありません。削除されています。つまり、すべてのボリュームが未使用です。

-

未使用ボリュームを削除:

$ sudo docker volume prune
:
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N]   ←(y)
Deleted Volumes:
6d00612fee054b032831e57e53188ba61144bae1d3b1175cad45071883759431
test-vol-01
964e5b9d0b56252d4c7cccb52d01687b2c942e4ec2f0d5bd26b954e2d6b1ae95

Total reclaimed space: 53B

→「prune」はすべての未使用ボリュームが対象なので、警告が表示されています。

今回は、3つのボリュームが対象です。

-

(6). 確認:
$ sudo docker volume list
:
DRIVER    VOLUME NAME

→すべてのボリュームが削除されました。

-

-


8). 参考: マウント関連の「docker run」コマンドの使用例:

【Docker】Dockerでホストのディレクトリをマウントする

→参考になりそうな、マウント関連の「docker run」コマンドの使用例が書かれています。感謝。

-

-


--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----- ----

20. コンテナ間で「データを共有」する:

-

参考:

Data Volume と Data Volume Container 」から抜粋:

→「docker run」コマンドで、「--volumes-from」フラグを使って、コンテナ間でデータ共有するやり方が書かれています。

-

古い記事なので「ubuntu:14.04」が使われています。確認テストに使うだけなのでサイズでは有利です。ただし、セキュリティから「ubuntu:18.04」以降に修正しました。

-

「--volumes-from」フラグを使って、コンテナ間でデータ共有:

  • アタッチ (docker attach) が使いやすい(使うコンテナがわかりやすい?)ように「コンテナID」を bash の「シェル変数」に登録してます。

-

1). 作業前のコンテナを確認:

$ sudo docker ps
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

$ sudo docker ps -a
:
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

$ sudo docker volume list
:
DRIVER    VOLUME NAME

-

2). /tmp をボリュームとした、データ用のコンテナ (data) を作成:

$ DATA_CONTAINER_ID=$(sudo docker run -i -t -d -P --name data -v /tmp ubuntu:18.04 /bin/bash)
:
Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
e706e0a9f423: Pulling fs layer
e706e0a9f423: Download complete
e706e0a9f423: Pull complete
Digest: sha256:40b84b75884ff39e4cac4bf62cb9678227b1fbf9dbe3f67ef2a6b073aa4bb529
Status: Downloaded newer image for ubuntu:18.04

→シェル変数へ登録されるだけと思っていたら、「ubuntu:18.04」がダウンロードされました。
いつもとの違いは、いつも表示される、最後のコンテナID の表示がありません。

-

追記: コンテナが起動されました。

-

3). コンテナ (data) のボリュームをマウントした、データを参照する側のコンテナ (app1) を作成:

$ APP1_CONTAINER_ID=$(sudo docker run -i -t -d -P --name app1 --volumes-from data ubuntu:18.04 /bin/bash)
$ 

→すでに上記で、「ubuntu:18.04」はダウンロード済なので、ダウンロードはされません。
こちらも上記と同じで、いつも表示される、最後のコンテナID の表示がありません。

-

  • 「--volumes-from」フラグを使っていることに注目。この場合はコンテナ (data) で定義しているボリュームが使えるようになります。

-

追記: コンテナが起動されました。

-

4). 「コンテナ」の確認:

$ sudo docker ps
:
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
6be2c7745f32   ubuntu:18.04   "/bin/bash"   3 minutes ago   Up 3 minutes             app1
3a3c38f91db6   ubuntu:18.04   "/bin/bash"   4 minutes ago   Up 4 minutes             data
$ sudo docker ps -a
:
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
6be2c7745f32   ubuntu:18.04   "/bin/bash"   3 minutes ago   Up 3 minutes             app1
3a3c38f91db6   ubuntu:18.04   "/bin/bash"   5 minutes ago   Up 4 minutes             data

→時間を見ると、コンテナの「data」が起動され、次に「app1」が起動されていました。 たぶん、投入する順番は大切です(コンテナが起動してすぐに停止したとしても、コンテナが存在することが大切)。

いつも表示される、最後のコンテナID の表示がなかったのは、影響ないみたい。

-

5). 登録したシェル変数を確認しました:

$ echo ${DATA_CONTAINER_ID}
:
3a3c38f91db69b4e3c4b47807a8e64e43063a59529df70b9f77cee33d84ec5f5
$ echo ${APP1_CONTAINER_ID}
:
6be2c7745f32fa13c6fd1fe02e663756a8d90f48f9d03d7a0fadf7b48f465c76

→変数に代入する時は「実行されない」と思っていたら、実行されました。

ただし、コンテナID を使う場合は、システムに一意であれば 1桁でもOK なので、 普通に使う、「docker ps -a」で表示される12桁の「コンテナID」や「コンテナ名」を使うやり方でも良さそう。

ただし、わかりやすい「コンテナ名」にするのが良いです。

-

変数を使う利点は、コンテナID に好きな名前を付けられるし、大文字なので、どのコンテナに対するコマンドか、わかりやすくできること

ボリューム名を付け忘れた場合、ボリューム名の桁は長いけど省略できませんし、ボリューム名を変更するコマンドはなかったと思います。このときの方が「変数に登録するやり方」が便利かも。

-

6). 「ボリューム」の確認:

(1). 「ボリューム」の一覧表示:
$ sudo docker volume list
:
DRIVER    VOLUME NAME
local     2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7

→ボリュームが確認できました。ボリューム名はなし。

-

(2). 「ボリューム」の詳細表示:

表示するには、ボリューム名の指定が必要です。

$ sudo docker volume inspect 2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7
[
    {
        "CreatedAt": "2022-10-22T05:14:18+09:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7/_data",
        "Name": "2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7",
        "Options": null,
        "Scope": "local"
    }
]

→「ボリューム」マウントの時だけ表示されるコマンドです。 「バインドマウント」の時は表示されません。

-

(3). 「コンテナ」の検証を使っての、「ボリューム」の詳細表示:

「マウント」セクションのみの、ベタ表示を指定:

コンテナ名があれば表示できることと、マウントの「宛先」がわかるのが利点。

$ sudo docker inspect -f '{{json .Mounts}}' data
[{"Type":"volume","Name":"2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7","Source":"/var/lib/docker/volumes/2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7/_data","Destination":"/tmp","Driver":"local","Mode":"","RW":true,"Propagation":""}]
$ sudo docker inspect -f '{{json .Mounts}}' app1
[{"Type":"volume","Name":"2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7","Source":"/var/lib/docker/volumes/2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7/_data","Destination":"/tmp","Driver":"local","Mode":"","RW":true,"Propagation":""}]

→どちらも同じ表示です。つまり、同じボリュームが見えています。コンテナ名があれば表示できます。

-

上記から、ボリュームの詳細がわかります:
  • マウントタイプ: volume

  • ボリューム名: 2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7

  • マウントのソース: /var/lib/docker/volumes/2141372c9e30b287fae4b75fce0f2661e3eafe98ee6285e8d1e4c2ec4db26ac7/_data

  • マウントの宛先: /tmp  ←(コンテナ側のマウント場所)

  • ドライバー: local

  • 書き込み RW: true

-

7). コンテナ「app1」で作成したファイルが、コンテナ「data」に反映されるか確認:

コンテナを起動:

$ sudo docker attach ${APP1_CONTAINER_ID}
:
root@6be2c7745f32:/# 
root@6be2c7745f32:/# echo "write from app1" > /tmp/message.txt

root@6be2c7745f32:/# exit
exit
$

-

$ sudo docker ps
:
CONTAINER ID   IMAGE          COMMAND       CREATED       STATUS       PORTS     NAMES
3a3c38f91db6   ubuntu:18.04   "/bin/bash"   4 hours ago   Up 4 hours             data

→exit したので、「app1」は停止しました。

-

コンテナを起動:

$ sudo docker attach ${DATA_CONTAINER_ID}
:
root@3a3c38f91db6:/# 
root@3a3c38f91db6:/# cat /tmp/message.txt
write from app1

root@3a3c38f91db6:/# exit
exit
$

→データが共有されました。

-

$ sudo docker ps
:
CONTAINER ID   IMAGE          COMMAND       CREATED       STATUS       PORTS     NAMES

→exit したので、「data」も停止しました。

-

8). 逆に、コンテナ「data」で作成したファイルが、コンテナ「app1」に反映されるか確認:

-

コンテナを起動:

$ sudo docker attach ${DATA_CONTAINER_ID}
:
You cannot attach to a stopped container, start it first

→停止していると実行できません。

-

コンテナを起動:

$ sudo docker start ${DATA_CONTAINER_ID}
:
3a3c38f91db69b4e3c4b47807a8e64e43063a59529df70b9f77cee33d84ec5f5
$ sudo docker ps
:
CONTAINER ID   IMAGE          COMMAND       CREATED       STATUS          PORTS     NAMES
3a3c38f91db6   ubuntu:18.04   "/bin/bash"   4 hours ago   Up 31 seconds             data

→以前と同じコンテナID で起動されました。

-

コンテナを起動:

$ sudo docker attach ${DATA_CONTAINER_ID}
:
root@3a3c38f91db6:/# 
root@3a3c38f91db6:/# echo "write from data" >> /tmp/message.txt

root@3a3c38f91db6:/# cat /tmp/message.txt
write from app1
write from data

root@3a3c38f91db6:/# exit
exit
$

-

コンテナを起動:

$ sudo docker start ${APP1_CONTAINER_ID}
:
6be2c7745f32fa13c6fd1fe02e663756a8d90f48f9d03d7a0fadf7b48f465c76
$ sudo docker ps
:
CONTAINER ID   IMAGE          COMMAND       CREATED       STATUS          PORTS     NAMES
6be2c7745f32   ubuntu:18.04   "/bin/bash"   4 hours ago   Up 38 seconds             app1

→以前と同じコンテナID で起動されました。

-

コンテナを起動:

$ sudo docker attach ${APP1_CONTAINER_ID}
:
root@6be2c7745f32:/# 
root@6be2c7745f32:/# cat /tmp/message.txt
write from app1
write from data

root@6be2c7745f32:/# exit
exit
$ 

→データが共有されました。

-

-

9). 同じように対話形式で使える「docker exec -it コンテナID /bin/bash」を使って、違いを確認:

-

$ sudo docker ps
:
[CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-

コンテナを起動:

$ sudo docker exec -it  ${APP1_CONTAINER_ID} /bin/bash
:
Error response from daemon: Container 6be2c7745f32fa13c6fd1fe02e663756a8d90f48f9d03d7a0fadf7b48f465c76 is not running

→やはり、コンテナが停止していると使えません。

-

コンテナを起動:

$ sudo docker start ${APP1_CONTAINER_ID}
:
6be2c7745f32fa13c6fd1fe02e663756a8d90f48f9d03d7a0fadf7b48f465c76

→コンテナが起動しました。

-

コンテナを起動:

$ sudo docker exec -it  ${APP1_CONTAINER_ID} /bin/bash
:
root@6be2c7745f32:/# 
root@6be2c7745f32:/# cat /tmp/message.txt
write from app1
write from data

root@6be2c7745f32:/# exit
exit
$ 

→プロンプトが返ってくるので、動き(出来ること)は同じです。exit で抜けました。

-

$ sudo docker ps
:
CONTAINER ID   IMAGE          COMMAND       CREATED       STATUS         PORTS     NAMES
6be2c7745f32   ubuntu:18.04   "/bin/bash"   4 hours ago   Up 2 minutes             app1

→こちらは、exit でコンテナが停止していません。

-

10). 「/bin/bash」にシェルコマンドを追加(付加)してみました:

-

コンテナを起動:

$ sudo docker exec -it ${APP1_CONTAINER_ID} /bin/bash -c "ls"
:
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
$ 

→「/bin/bash」にシェルコマンドを追加すると、コマンドを実行してすぐに終了しました。

  • 行末の指定が「/bin/bash」のみだと、シェルコマンドの入力待ちになるみたい。

-

コマンドを実行するたびに、コンテナを起動:

$ sudo docker exec -it ${APP1_CONTAINER_ID} /bin/bash -c "ls /tmp"
message.txt
$ 

→コマンドを実行してすぐに終了しました。

-

コマンドを実行するたびに、コンテナを起動:

$ sudo docker exec -it ${APP1_CONTAINER_ID} /bin/bash -c "cat /tmp/message.txt"
:
write from app1
write from data
$ 

→コマンドを実行してすぐに終了しました。

対話形式で続けての入力はできないけど、専有されないので、次に別のコマンドを入力したい場合は便利です。

ただし、専有されても端末画面をもうひとつ起動すればいいだけなので、メリットというほどではないかな。

-


11). 参考: 「docker attach」について:

Dockerコンテナ内で操作 attachとexecの違い 」を参照:

-

(1). 「docker attach コンテナID」を使う場合:

「コンテナID」、または「コンテナ名」を指定します。

ターミナルの標準入力、標準出力、標準エラー出力(あるいはその組み合わせ)を、実行中のコンテナにアタッチ(接続)できるので、処理中の内容を確認したり、対話的な制御を可能にすることができます。

-

(2). 「docker exec -it コンテナID /bin/bash」を使う場合:

同じように、ターミナルにて、対話的な制御ができます。 その違いは、exit したときのコンテナの挙動らしいです。

-

-


12). 参考: 上記で使われている、「$( )」と「${ }」 の違い:

[シェル] カッコの意味と役割まとめ [Bash, Linux] から抜粋:

シェルスクリプトで使用されるカッコいろいろ

-

$( )」 ドル丸括弧、ドルパーレン:

カッコ内のコマンドを実行して、実行結果を文字列として展開します。

-

${ }」 ドル波括弧、ドルブレース:

変数を文字列内に埋め込んだ時に、変数名の区切りがうまく処理できない場合に使います。

-

$( )」の使用例:
$ HOGE=$(date)
$ 

→シェル変数にセットされるだけ

追記; (と思っていたけど、)すぐに実行されて、その結果が格納されるみたい。

-

「set -x」で、確認:

フラグセット:

$ set -x
$ date
+ date
2022年 10月 22日 土曜日 15:15:36 JST
$ HOGE=$(date)
++ date
+ HOGE='2022年 10月 22日 土曜日 15:15:54 JST'

→すぐに「date」が実行されて、その結果が「$HOGE」に格納されました。

-

フラグ解除:

$ set +x
+ set +x

-

-

簡単な確認のやり方:
$ date
2022年 10月 22日 土曜日 15:24:39 JST
$ echo $HOGE
2022年 10月 22日 土曜日 15:15:54 JST

→変数に入っているのは、過去の時間です。

-

ダメ押しの確認:

$ echo $HOGE
2022年 10月 22日 土曜日 15:15:54 JST

→変化なし。つまり、中身はただの文字列です。

-

${ }」の使用例:
$ echo ${HOGE}
2022年 10月 22日 土曜日 15:15:54 JST

しばらく待って、

$ echo ${HOGE}
2022年 10月 22日 土曜日 15:15:54 JST

→日時は更新されません。中身はただの文字列です。

{ }」でかこむと、変数を確実に指示できる機能があるだけで、結果は同じです。

-

ちなみに、下記のやり方は、命令がないのでエラー:
$ echo $(HOGE)
HOGE: コマンドが見つかりません

→中に入れられるのは、パスの通った「命令」のみです。ぱっと見は似ているので注意。

-

-

「コンテナ ID」をシェル変数に記憶させる手法は、スマートで目からウロコでした。

作成するリストがややこしい場合は、リストを「見やすく」できます。
見やすいので、コピペしてリストを作成する場合でも、ミスを減らせるかも。

  • ポイントは、変数を代入するときも、コンテナが起動されること。

-

勉強になりました。感謝。

-

-


まとめ

ゲストOS の「Xubuntu 22.04.1 LTS」に、「Docker for Linux」(Docker エンジン)をインストールしてみました。 インストールは簡単です。投稿では長々と書いていますが、実質は数行のコマンドです。

ただし、使っていくには、色々と知っておくべきことがたくさんあって奥が深いです。 だから長くなりました。

-

ちなみに、「Docker」についてオンライン検索するときは、現在は存在しない「CoreOS」と「Fedora Atomic Host」の(2018年頃の)情報が今もヒットします。注意です。

せっかく両方を調べたのに、後になって「Fedora CoreOS」として統合されたことを知りました。なので、最終的には、2つを吸収した「Fedora CoreOS」も学ぶことになりました。どのように発展してきたかの勉強にはなったけど、かなりの遠回りでした。

-

  • 教訓: 最新の情報が欲しいときは英語版。日本語版なら更新日付に注意。

-

-

-


-

-

    目次

-

「投稿の先頭 へ」

-

-


-

「この目次 の先頭へ」

「本編の目次 に戻る」

-