◇コンテナとは?
VMwareやKVMと言った物理的なコンピューターの上で仮想マシンを作成する技術の他、仮想化技術の一つとして近年発達した技術に「コンテナ」があります。物理的なコンピューター上で稼働するOSのリソースの一部を隔離し、仮想的に作り出された実行環境の事です。
コンテナを利用すれば実行環境や依存関係、ソースコード、設定情報などをパッケージ化して、分離出来ます。それにより、どこの環境でも同じように素早く、効率的にプロセスを実行することが出来ます。
仮想マシンとの違いは、ハイパーバイザーが存在しない事で、コンテナがインストールされている環境であればどこでも同じように起動する事が出来ますし、サーバーを効率よく、無駄なく使用出来ます。OSが共有されているので、OSの起動を待つ事も無く数秒で起動し、OSだけでなくBin/Libも必要に応じて共有します。
本稿ではCentOS8からDockerに代わり提供されているPodmanでコンテナ環境を作成してみます。
◇本稿のPodmanの設定
・ホスト名:Docker.server
・アドレス:192.168.128.105/24
・DNS:192.168.128.1
・ゲートウェイ:192.168.128.1
*本稿では単体で検証を行うのでルーターのDNSを使用しています。仮想マシンのDNSを使用する場合はそちらのIPアドレスを指定してください。
◇Podmanのインストール
以下の様に、Dockerをインストールしようとすると、互換のコンテナツールであるPodmanがインストールされますが、PodmanでもDocker同等の機能がサポートされているので、Podmanをインストールします。
[root@Docker ~]# dnf install -y docker
メタデータの期限切れの最終確認: 0:29:53 時間前の 2022年06月14日 15時22分31秒 に 実施しました。
依存関係が解決しました。
================================================================================
パッケージ Arch バージョン リポジトリー サイズ
================================================================================
インストール:
podman-docker noarch 2:4.1.0-4.el9 appstream 41 k
トランザクションの概要
================================================================================
インストール 1 パッケージ
(略)
インストール済み:
podman-docker-2:4.1.0-4.el9.noarch
完了しました!
[root@Docker ~]# docker -v
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
podman version 4.1.0
・Dockerのイメージを作成する。
先ずはイメージを設置するディレクトリを作成します。
[root@Docker ~]# mkdir ~/work
[root@Docker ~]# mkdir ~/work/docker_test/
[root@Docker ~]# cd ~/work/docker_test/
続いて以下の様にコンテナ構成情報を記載したファイルを作成します。OSはubuntuを指定しています。
[root@Docker docker_test]# cat > Dockerfile
FROM ubuntu
RUN apt-get update -y && apt-get install -y apache2
COPY index.html /var/www/html
EXPOSE 80
CMD ["apachectl", "-D", "FOREGOUND"] ←ここまで入力したら改行しCtrl+D
[root@Docker docker_test]# echo -n 'First Container' > index.html
[root@Docker docker_test]# cat index.html
First Container
[root@Docker docker_test]# ls
Dockerfile index.html ←この二つのファイルを作成した事を確認。
[root@Docker docker_test]# podman build -t docker_test . ←イメージのビルド
STEP 1/5: FROM ubuntu
Resolved "ubuntu" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/ubuntu:latest...
Getting image source signatures
Copying blob 405f018f9d1d done
Copying config 2794180907 done
Writing manifest to image destination
Storing signatures
STEP 2/5: RUN apt-get update -y && apt-get install -y apache2
Get:1 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
(略)
STEP 3/5: COPY index.html /var/www/html
--> 4fc1e777c61
STEP 4/5: EXPOSE 80
--> 81c8bfbbdbf
STEP 5/5: CMD ["apachectl", "-D", "FOREGOUND"]
COMMIT docker_test
--> 58b97fed61e
Successfully tagged localhost/docker_test:latest
58b97fed61e645ccf9b28d4ca55b3f281a459fef841d60d60699513fbc505e43
上記でイメージの準備ができました。以下のコマンドでイメージを確認します。
[root@Docker docker_test]# cd
[root@Docker ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/docker_test latest 58b97fed61e6 36 seconds ago 225 MB
docker.io/library/ubuntu latest 27941809078c 7 days ago 80.3 MB
以上でイメージを確認出来ました。
・コンテナの起動。
続いてイメージからコンテナを起動します。
[root@Docker ~]# podman run --name docker_test -d -p 80:80 docker_test:latest
432a6806a2778fa0029416de8d4133d60a637226a055aeca3253adc3bf6b2b50
・コンテナが起動の確認します。
[root@Docker ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
432a6806a277 localhost/docker_test:latest apachectl -D FORE... 20 seconds ago Exited (0) 20 seconds ago 0.0.0.0:80->80/tcp docker_test
・イメージの操作
イメージからコンテナを作成して bash を起動してログインします。
-it オプションで作成したコンテナへのコマンド⼊⼒と実⾏結果の出⼒ができるようになります。
[root@Docker ~]# podman run -i -t docker_test:latest /bin/bash
root@10510ad7faaf:/# ←この様に表示されればbashにログイン出来ました。
root@10510ad7faaf:/# cat /etc/issue
Ubuntu 22.04 LTS \n \l ←Ubuntuがインストールされている事を確認。
root@10510ad7faaf:/# cat /var/www/html/index.html
First Container ←ローカルで作成されたindex.htmlファイルの設置を確認。
root@10510ad7faaf:/# exit
exit ←exit を実⾏するとコンテナは停⽌してホスト OS に操作が戻ります。
[root@Docker ~]#
以下のコマンドでコンテナが停止している事が分かります。
[root@Docker ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
〇podman(docker)各種コマンド
・起動中のコンテナ⼀覧を表⽰
[root@Docker ~]# docker ps
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
・停⽌中も含めたコンテナ⼀覧を表⽰
[root@Docker ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
432a6806a277 localhost/docker_test:latest apachectl -D FORE... 17 minutes ago Exited (0) 17 minutes ago 0.0.0.0:80->80/tcp docker_test
10510ad7faaf localhost/docker_test:latest /bin/bash 16 minutes ago Exited (0) 12 minutes ago hungry_euclid
1188cc052d13 localhost/docker_test:latest /bin/bash 10 minutes ago Exited (0) 9 minutes ago vibrant_shaw
・停⽌中のコンテナを起動
podman start [CONTAINER ID]
[root@Docker ~]# podman start 1188cc052d13
1188cc052d13
・コンテナの停止
podman stop [CONTAINER ID]
[root@Docker ~]# podman stop 1188cc052d13
1188cc052d13
・コンテナの再起動
podman restart [CONTAINER ID]
[root@Docker ~]# podman restart 1188cc052d13
1188cc052d13f6e175bd4992f9261446876e8f74b7cdb435f0bc00017b05d0b3
・コンテナの一時停止
podman pause [CONTAINER ID]
[root@Docker ~]# podman pause 1188cc052d13
1188cc052d13f6e175bd4992f9261446876e8f74b7cdb435f0bc00017b05d0b3
[root@Docker ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1188cc052d13 localhost/docker_test:latest /bin/bash 20 minutes ago Paused vibrant_shaw ←STATUSがPausedである事を確認出来ます。
・一時停止したコンテナの再開
podman unpause [CONTAINER ID]
[root@Docker ~]# podman unpause 1188cc052d13
1188cc052d13f6e175bd4992f9261446876e8f74b7cdb435f0bc00017b05d0b3
[root@Docker ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
432a6806a277 localhost/docker_test:latest apachectl -D FORE... 28 minutes ago Exited (0) 28 minutes ago 0.0.0.0:80->80/tcp docker_test
10510ad7faaf localhost/docker_test:latest /bin/bash 27 minutes ago Exited (0) 23 minutes ago hungry_euclid
1188cc052d13 localhost/docker_test:latest /bin/bash 21 minutes ago Up 4 minutes ago vibrant_shaw ←STATUSがUPである事を確認出来ます。
・起動中のコンテナの強制停止
podman kill [CONTAINER ID]
[root@Docker ~]# podman kill 1188cc052d13
1188cc052d13
[root@Docker ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1188cc052d13 localhost/docker_test:latest /bin/bash 23 minutes ago Exited (137) 5 seconds ago vibrant_shaw ←STATUSがExitedである事を確認出来ます。
・コンテナへ接続
podman attach [CONTAINER ID]
[root@Docker ~]# podman attach 1188cc052d13
root@1188cc052d13:/#
root@1188cc052d13:/# ps a
PID TTY STAT TIME COMMAND
1 pts/0 Ss 0:00 /bin/bash ←PID1で/bin/bash実行中
4 pts/0 R+ 0:00 ps a
attach状態でexitするとコンテナも終了しますが、Ctrl+p,Ctrl+q を押すことでコンテナを終了させず、切断してホストOSに戻る事が出来ます。
root@1188cc052d13:/# ←Ctrl+p,Ctrl+q を押すと
[root@Docker ~]# ←ホスト OS に戻りました。
[root@Docker ~]# docker ps
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1188cc052d13 localhost/docker_test:latest /bin/bash 31 minutes ago Up 36 seconds ago vibrant_shaw ←コンテナがUP状態である事を確認
[root@Docker ~]# podman exec -it 1188cc052d13 /bin/bash 新規にbin/bashでログイン。
root@1188cc052d13:/# ps ax
PID TTY STAT TIME COMMAND
1 pts/0 Ss+ 0:00 /bin/bash
4 pts/1 Ss 0:00 /bin/bash ←PID1とは別のIDでログインしています。
7 pts/1 R+ 0:00 ps ax
この状態でexitしてもPID4がexitされる為、コンテナは停止しません。
root@1188cc052d13:/# exit
exit
[root@Docker ~]# docker ps
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1188cc052d13 localhost/docker_test:latest /bin/bash 38 minutes ago Up 8 minutes ago vibrant_shaw ←コンテナがUP状態である事を確認出来ます。
・コンテナの削除
稼働中のコンテナを終了後に削除します。
[root@Docker ~]# podman stop 1188cc052d13
1188cc052d13
続いてpodman attach [CONTAINER ID]でコンテナを削除します。
[root@Docker ~]# podman rm 1188cc052d13
1188cc052d13f6e175bd4992f9261446876e8f74b7cdb435f0bc00017b05d0b3
[root@Docker ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ←コンテナの情報が無くなっている事が確認出来ます。