【Docker】技術書「Docker&Kubernetsのきほんのきほん」学習記録(実践編)

こんにちは、キクです。

本記事は、僕が自己学習で学んだことをブログでアウトプットするシリーズになります。
今回は技術書「Docker&Kubernetsのきほんのきほん」を参考にして学んだ『Docker(実践編)』について書いていこうと思います。

前回の記事では「基礎編」としてDockerの基礎的な概要について整理しましたが、「実践編」では実際にDockerを操作した内容をいくつかの事例に分けて整理していきます。

それでは、よろしくお願いします。

注意事項

本記事は自己学習としてのアウトプットが目的となります。

そのため、本記事には誤った情報が含まれる可能性もありますが、ご了承ください。

基本的な操作編

1. コンテナ作成/起動/停止/削除

1. コンテナ作成 / 起動

$ docker run --name コンテナ名 -d イメージ名

メモ

初回はイメージのダウンロードがあるため、上記のようにいくつかログが出力されるのと、やや時間がかかる

2. コンテナのステータス確認

$ docker ps

3. コンテナ停止

$ docker stop コンテナ名

4. コンテナのステータス確認

$ docker ps
$ docker ps -a

5. コンテナ削除

$ docker rm コンテナ名

6. コンテナのステータス確認

$ docker ps -a

2. コンテナと通信

1. コンテナ作成 / 起動

$ docker run --name コンテナ名 -d -p ホスト側ポート:コンテナ側ポート イメージ名

2. コンテナのステータス確認

$ docker ps

3. Webサーバへの接続確認

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8080

4. 後片付け

4-1. コンテナ停止

$ docker stop コンテナ名

4-2. コンテナ削除

$ docker rm コンテナ名

4-3. コンテナのステータス確認

$ docker ps -a

3. MySQLのコンテナ作成

1. コンテナ作成 / 起動

$ docker run --name コンテナ名 -dit -e MYSQL_ROOT_PASSWORD=MySQLのrootパスワード mysql

メモ

データベース機能を提供するソフトウェアのコンテナにおいては、コンテナ作成時にデータベースの「ルートパスワード」を設定する必要がある

2. コンテナのステータス確認

$ docker ps

3. 後片付け

3-1. コンテナ停止

$ docker stop コンテナ名

3-2. コンテナ削除

$ docker rm コンテナ名

3-3. コンテナのステータス確認

$ docker ps -a

4. イメージの削除

1. イメージ一覧確認

$ docker image ls

2. コンテナの確認

削除するイメージを利用中のコンテナが存在しないことを確認する

$ docker ps -a

深掘り

削除対象イメージから作成されたコンテナが存在する状態でイメージを削除しようとすると、以下のようにエラーが表示されて失敗となる

(base) MacBook-Pro:~ user$ docker image rm ubuntu
Error response from daemon: conflict: unable to remove repository reference "httpd" (must force) - container ad2457683f54 is using its referenced image 50a1bd9b297f

3. イメージ削除

$ docker image rm イメージ名

もしくは

$ docker image rm イメージID

メモ

今回は「httpd」という名前指定で削除したが、より確実に対象を削除するためにはイメージID指定の方が良い

4. イメージ一覧確認

$ docker image ls

深掘り

同じ名前のイメージ(REPOSITORY列)が複数存在する状態で「名前指定での削除」を実施したらどうなるか気になったので確認した

(base) MacBook-Pro:~ user$ docker image ls
REPOSITORY                      TAG       IMAGE ID       CREATED       SIZE
ubuntu                          updated   89cce6ac7789   3 years ago   73.9MB
ubuntu                          latest    1d622ef86b13   3 years ago   73.9MB
(base) MacBook-Pro:~ user$ docker image rm ubuntu
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
(base) MacBook-Pro:~ user$ docker image ls
REPOSITORY                      TAG       IMAGE ID       CREATED       SIZE
ubuntu                          updated   89cce6ac7789   3 years ago   73.9MB
(base) MacBook-Pro:~ user$ docker image rm ubuntu
Error response from daemon: No such image: ubuntu:latest

結果としては「ubuntu」のように名前のみ指定した場合にはタグが「latest」のものが操作対象になる
そのため「ubuntu:updated」は「docker image rm ubuntu」コマンドでは削除されなかった

以下のようにタグまで指定すれば削除できた

(base) MacBook-Pro:~ user$ docker image rm ubuntu:updated
Untagged: ubuntu:updated
Deleted: sha256:89cce6ac7789ab5340dc677f642f52d737c394c4ec5b666df98a009a69514e0a
Deleted: sha256:3cc914ab4602ba29ce61a0a385bd0274915ebfd73d210c157b6ec3562c5886b1
Deleted: sha256:1d622ef86b138c7e96d4f797bf5e4baca3249f030c575b9337638594f2b63f01

5. WordPressコンテナとMySQLコンテナの連携

1. ネットワーク作成

$ docker network create ネットワーク名

2. ネットワーク一覧確認

$ docker network ls

3. MySQLコンテナ作成 / 起動

$ docker run --name コンテナ名 -dit --net=ネットワーク名 -e MYSQL_ROOT_PASSWORD=MySQLのrootパスワード -e MYSQL_DATABASE=データベース領域名 -e MYSQL_USER=MySQLのユーザ名 -e MYSQL_PASSWORD=MySQLのパスワード mysql --character-set-server=文字コード --collation-server=照合順序 --default-authentication-plugin=認証方式

4. コンテナのステータス確認

$ docker ps

5. WordPressコンテナ作成 / 起動

$ docker run --name コンテナ名 -dit --net=ネットワーク名 -p ホスト側ポート:コンテナ側ポート -e WORDPRESS_DB_HOST=データベースのコンテナ名 -e WORDPRESS_DB_NAME=データベース領域名 -e WORDPRESS_DB_USER=データベースのユーザ名 -e WORDPRESS_DB_PASSWORD=データベースのパスワード wordpress

6. コンテナのステータス確認

$ docker ps

7. 接続確認

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8085

メモ

WordPress管理画面まで問題なく設定を進めることができたことからも、コンテナ同士が正常に接続できていることを確認できた

8. 後片付け

8-1. コンテナ停止

$ docker stop コンテナ名

8-2. コンテナ削除

$ docker rm コンテナ名

8-3. イメージ削除

$ docker image rm イメージ名

8-4. ネットワーク削除

$ docker network rm ネットワーク名

6. RedmineコンテナとMySQLコンテナの連携

1. ネットワーク作成

$ docker network create ネットワーク名

2. ネットワーク一覧確認

$ docker network ls

3. MySQLコンテナ作成 / 起動

$ docker run --name コンテナ名 -dit --net=ネットワーク名 -e MYSQL_ROOT_PASSWORD=MySQLのrootパスワード -e MYSQL_DATABASE=データベース領域名 -e MYSQL_USER=MySQLのユーザ名 -e MYSQL_PASSWORD=MySQLのパスワード mysql --character-set-server=文字コード --collation-server=照合順序 --default-authentication-plugin=認証方式

4. コンテナのステータス確認

$ docker ps

5. Redmineコンテナ作成 / 起動

$ docker run --name コンテナ名 -dit --network ネットワーク名 -p ホスト側ポート:コンテナ側ポート -e REDMINE_DB_MYSQL=データベースのコンテナ名 -e REDMINE_DB_DATABASE=データベース領域名 -e REDMINE_DB_USERNAME=データベースのユーザ名 -e REDMINE_DB_PASSWORD=データベースのパスワード redmine

メモ

ネットワーク割り当てオプションは「--net=ネットワーク名」「--network ネットワーク名」のどちらでもいいみたい

苦戦メモ

Redmineコンテナの作成と起動において、何度かエラーにより失敗した
原因は「スペルミス」「オプション(-dit)漏れ」など簡単なものだった

失敗時の挙動としては「コンテナは作成されるが起動はしない」というものだった

データベースに接続できない場合などには、「コンテナが起動できない」という動きになるも模様

6. コンテナのステータス確認

$ docker ps

7. 接続確認

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8086

8. 後片付け

8-1. コンテナ停止

$ docker stop コンテナ名

8-2. コンテナ削除

$ docker rm コンテナ名

8-3イメージ削除

$ docker image rm イメージ名

8-4. ネットワーク削除

$ docker network rm ネットワーク名

応用的な操作編

1. コンテナとホスト間でのファイルコピー

ホスト側で用意した「index.html」をコンテナ上にコピーする

1. コンテナ作成 / 起動

$ docker run --name コンテナ名 -d -p ホスト側ポート:コンテナ側ポート イメージ名

2. Webサーバへの接続確認

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8089

確認事項

コンテナ作成時の初期index.htmlの内容「It works!」が表示されたこと

3. ホストからコンテナへのファイルコピー

$ docker cp ホスト側ファイルパス コンテナ名:コンテナ側ファイル格納先パス

4. コンテナ内部でのファイル確認

4-1. コンテナへの接続

$ docker exec -it コンテナ名 シェル名

4-2. ファイルの有無確認

# ls -al コピーしたファイルの格納先パス

4-3. ファイルの中身確認

# cat コピーしたファイルの格納先パス/index.html

5. ブラウザ確認

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8089

確認事項

index.htmlが差し替わり「It works!(デフォルト状態)」から「Docker学習中!」に変更されたこと

2. バインドマウント

ホスト側で用意した「Mount_Test」ディレクトリをマウントし、ディレクトリ内にある「index.html」がディレクトリインデックスとして表示されるかを確認する

1. テスト用ディレクトリ/ファイルの準備

ファイル情報

ディレクトリ:/Users/user/Documents/Docker学習/20240302/Mount_Test
ファイル名 :index.html
ファイル内容:以下の内容を記述

<html>
    <meta charset="utf-8">
    <body>
        <div>マウント成功!</div>
    </body>
</html>

2. コンテナ作成 / 起動

$ docker run --name コンテナ名 -d -p ホスト側ポート:コンテナ側ポート -v ホスト側マウント元パス:コンテナ側マウント先パス イメージ名

3. ブラウザ確認①

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8090

確認事項

マウントしたディレクトリ配下に格納しているindex.htmlの内容が表示されたこと

4. テスト用ファイル「index.html」を削除

5. ブラウザ確認②

接続先:http://localhost:8090

メモ

ドキュメントルートである「/usr/local/apache2/htdocs」に表示できるファイルが存在しないと「Index of /」と表示される

なお、ドキュメントルートやディレクトリインデックスの設定は「/usr/local/apachce2/conf/httpd.conf」で確認や変更が可能

3. コンテナをcommitしてイメージ化

1. コンテナ作成 / 起動

$ docker run --name コンテナ名 -d -p ホスト側ポート:コンテナ側ポート イメージ名

2. Webサーバへの接続確認

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8092

3. テスト用ファイル「index.html」の格納

3-1. コンテナへのファイルコピー

$ docker cp ホスト側コピー対象ファイルパス コピー先コンテナ名:コンテナ側コピー先パス

3-2. コンテナへの接続

$ docker exec -it コンテナ名 シェル名

3-3. ファイルの有無確認

# ls -al コピーしたファイルの格納先パス

3-4. ファイルの中身確認

# cat コピーしたファイルの格納先パス/index.html

4. ブラウザ確認①

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8092

5. コンテナのイメージ化

$ docker commit コンテナ名 コミット後のイメージ名

6. イメージ一覧の確認

$ docker image ls

7. 作成したイメージからのコンテナ作成/起動

$ docker run --name コンテナ名 -d -p ホスト側ポート:コンテナ側ポート 作成したイメージ名

8. ブラウザ確認②

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8093

確認事項

元コンテナに格納したindex.htmlと同じ内容(コンテナのイメージ化)が表示されたこと

4. Dockerfileからのイメージ化

ホスト側で用意した「Build_Test」ディレクトリに「Dockerfile」と素材「index.html」を格納し、buildしてイメージ化する

1. テスト用ディレクトリ/ファイルの準備

ファイル情報1

ディレクトリ:/Users/user/Documents/Docker学習/20240303/Build_Test
ファイル名 :Dockerfile
ファイル内容:以下の内容を記述

FROM httpd
COPY index.html /usr/local/apache2/htdocs/

メモ

FROMで指定した「イメージ」は、デフォルトでDocker Hubを参照する模様
ただ、ローカル上の「testapache_image」を指定してもビルドできたので、ローカルのイメージも指定できるっぽい

ファイル情報2

ディレクトリ:/Users/user/Documents/Docker学習/20240303/Build_Test
ファイル名 :index.html
ファイル内容:以下の内容を記述

<html>
    <meta charset="utf-8">
    <body>
        <div>DockerfileをBuildしてイメージ化</div>
    </body>
</html>

2. Dockerfileのビルド

$ docker build -t ビルド後のイメージ名 Dockerfileの格納先パス

3. イメージ一覧確認

$ docker image ls

4. コンテナ作成 / 起動

$ docker run --name コンテナ名 -d -p ホスト側ポート:コンテナ側ポート 作成したイメージ名

5. ブラウザ確認

コンテナが稼働するホストからブラウザにて下記URLに接続

接続先:http://localhost:8094

確認事項

ビルドしたイメージから作成したコンテナにて、事前に用意した「index.html」の内容が表示されたこと

参考情報

-学習記録, Docker
-,