登録日: 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 です。
-
(注)リンクを戻るときはブラウザの左上の「←」をクリック
-
-
目次
-
今回の作業:
-
コマンド関連:
-
-
-
-
--- - --- - --- - --- - --- - --- - --- - --- - --- - -
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、Fedora、Debian、Ubuntu)だけでなく、軽量な「Alpine Linux」や「Busybox」、OS からコンテナで使われない部分を削除してコンパクトにした「Debian slim」、コンテナ専用として開発の「Fedora CoreOS」(旧 CoreOS + 旧 Fedora Atomic Host)などがあります。
-
参考:
-
-
「コンテナ」の現在のバージョンを表示:
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 )
-
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 コマンド リファレンスの外部キャッシュ ソースの指定 に関するセクションを参照してください。
-
ビルドが完了、これで下記を行う準備が整いました:
-
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 ホスト上もコンテナー上も、ディスクに長く保持できません。
-
- tmpfs マウント について学ぶ
-
(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). 旧コマンド →新コマンド の対応:
-
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 を作成
-
コツ:
-
オプション付きで 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
3つのコマンドで処理されているのがわかります。
-
フラグの解除:
$ set +x + set +x
$ echo $(date) | grep JST 2022年 10月 22日 土曜日 03:34:00 JST
-
-
--- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----
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」の続きです。
-
参考:
-
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 を使用してボリュームを管理できます。
ボリュームは、複数のコンテナ間でより安全に共有できます。
ボリューム ドライバーを使用すると、リモート ホストまたはクラウド プロバイダーにボリュームを格納して、ボリュームの内容を暗号化したり、他の機能を追加したりできます。
新しいボリュームには、コンテナによって事前に設定されたコンテンツを含めることができます。
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」も学ぶことになりました。どのように発展してきたかの勉強にはなったけど、かなりの遠回りでした。
-
- 教訓: 最新の情報が欲しいときは英語版。日本語版なら更新日付に注意。
-
-
-
-
-
目次
-
-
- 目次
- --- - --- - --- - --- - --- - --- - --- - --- - --- - -
- Xubuntu 22.04.1 LTS のデスクトップ画面:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - --
- 「Xubuntu」について:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ---
- 「コンテナ」について:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----
- 「Docker for Linux」の「Xubuntu 22.04.1 LTS」への対応:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - -----
- 1. 古いバージョンの Docker のクリア処理:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- -
- 2. 「Docker for Linux」をインストール:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- --
- 3. 「Docker」コマンドを使ってみる(その1):
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ---
- 4. 「Docker」でコンテナが動くことを確認:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----
- 5. sudo を使わずに実行したいときの設定:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- -----
- 6. Docker をチュートリアルで学ぶ:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- -
- 7. 「Docker」コマンドを使ってみる(その2):
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- --
- 8. Docker で開発する:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ---
- 9. 「Dockerfile」について:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----
- 10. Docker の「データ共有」について:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- -----
- 11. コンテナを使ってみる:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- -
- 12. 「docker」コマンドの新旧の違い:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- --
- 13. コンテナの修正:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ---
- 14. 「Dockerfile」の作成について:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----
- 15. 「Dockerfile」の作成例:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- -----
- 16. 「Dockerfile」の作成:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----- -
- 17. 「Dockerfile」の作成、仕切り直し:
- 1). 作業フォルダを準備:
- 2). Dockerfile を作成:
- 3). 作成した Dockerfile を元に Docker イメージ を作成:
- 4). 作成したイメージでコンテナ起動:
- 5). コンテナを起動し放しで起動:
- (1). マウントするパスも、コンテナ名も、指定しないで起動した場合:
- (2). 確認:
- (2). 起動しているコンテナのボリュームの状態を「シェルコマンド」で確認:
- (3). 何かしらの「エディタ」がインストールされていないか確認:
- (4). しかたないので、echo で既存のファイルに行を追加してみました:
- (5). ホストのマウントポイントを確認:
- (6). ホスト側からファイル操作:
- (7). ファイル内容を表示:
- (8). ホスト側の nano エディタで、ファイル内容を変更:
- (9). 修正内容の確認:
- (10). 「項番 (4).」でエラーしたやり方で修正できるか、ホスト側で確認:
- (11). 修正のやり方を変えて、トライ:
- (12). 修正内容の確認:
- (13). 上記のやり方で、ファイル操作:
- (14). 修正内容の確認:
- (15). コンテナを停止:
- (16). コンテナを削除:
- 「コンテナを削除してもデータを残す」ことの目標を達成
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----- --
- 18. 「バインド マウント」を使ったコンテナの使用:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----- ---
- 19. 「ボリューム」マウントを使ったコンテナの使用:
- --- - --- - --- - --- - --- - --- - --- - --- - --- - ----- ----- ----- ----- ----
- 20. コンテナ間で「データを共有」する:
- 「--volumes-from」フラグを使って、コンテナ間でデータ共有:
- 1). 作業前のコンテナを確認:
- 2). /tmp をボリュームとした、データ用のコンテナ (data) を作成:
- 3). コンテナ (data) のボリュームをマウントした、データを参照する側のコンテナ (app1) を作成:
- 4). 「コンテナ」の確認:
- 5). 登録したシェル変数を確認しました:
- 6). 「ボリューム」の確認:
- 7). コンテナ「app1」で作成したファイルが、コンテナ「data」に反映されるか確認:
- 8). 逆に、コンテナ「data」で作成したファイルが、コンテナ「app1」に反映されるか確認:
- 9). 同じように対話形式で使える「docker exec -it コンテナID /bin/bash」を使って、違いを確認:
- 10). 「/bin/bash」にシェルコマンドを追加(付加)してみました:
- 11). 参考: 「docker attach」について:
- 12). 参考: 上記で使われている、「$( )」と「${ }」 の違い:
- まとめ
- -
-
-
-