Dockerとは、Docker社が開発したコンテナ型仮想化を用いて、アプリケーションの開発、実行ができるOSS(オープンソフトウェア)です。
コンテナ型仮想化では、従来のOS仮想化(仮想マシン)とは違い、OSのメイン部分であるカーネルをコンテナと共有することで、軽量化と高速化を実現します。
従来の仮想マシン(VM)との違い
OSは、大きく分けて、ハードウェアの制御を行うカーネルとそれ以外(ディストリビューションのライブラリなどのプログラム)に分かれます。OSの中でカーネルの占める容量の割合は大きく、起動や処理に時間がかかります。
従来の仮想マシンは、ハイパーバイザにより物理的なハードウェアを仮想化することで、仮想マシン(ゲスト)を実装します。仮想マシン内のOSは、大容量のカーネルを含める必要があり、ハードウェアを圧迫します。
Dockerコンテナの場合、Docker Engineをインストールすることで、OSのカーネルを分離し、その他ライブラリとアプリケーションをコンテナとして、まとめます。各コンテナは、ホストOSのカーネルを共有して使用します。
コンテナにはカーネルが含まれていないので、処理が軽いです。そして、それぞれのコンテナは隔離されているので、同じアプリケーションを入れることができるなど、独立した空間で、1つの物理サーバに複数のコンテナを作成することができます。コンテナはイメージ化でき、他の環境に複製することで、開発環境を統一することもできます。
この記事では、WebサーバであるNginxのイメージからコンテナを作成し、ローカルPCよりWebアクセスできるところを確認します。その後、コンテナ、およびイメージを削除します。
Dockerのインストール
私はMACを使用していますので、以下のサイトのInstall Docker Desktop on Mac よりダウンロード&インストールします。
>> Get Docker (https://docs.docker.com/get-docker/)イメージのダウンロード
公開されているDockerイメージをリポジトリ(Docker HUB)からダウンロードします。ダウンロードできるイメージは以下のリンクから確認できます。
>> https://hub.docker.com/search?q=&type=image今回はNginx(最新版)をダウンロードします。
$ docker pull nginx:latest latest: Pulling from library/nginx f7ec5a41d630: Already exists aa1efa14b3bf: Already exists b78b95af9b17: Already exists c7d6bca2b8dc: Already exists cf16cd8e71e0: Already exists 0241c68333ef: Already exists Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest $
イメージがダウンロードされたか確認するには、docker image ls 、もしくは docker images コマンドを実行します。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 62d49f9bab67 4 days ago 133MB
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 62d49f9bab67 4 days ago 133MB
イメージからコンテナを起動
ダウンロードしたnginxのイメージからコンテナを作成し、起動するには、docker runコマンドを実行します。
- -d:バックグラウンドで起動(detach)
- -p : ポート番号を指定。<ローカルホスト側のポート番号>:<コンテナ側のポート番号>と表記。ローカルPCからポート番号8000番への接続をnginx起動時に公開されているポート番号80にマッピング
- — name :作成時のコンテナの名前 を指定
Nginxのコンテナを作成し、起動してみます。
$ docker run -d -p 8000:80 --name nginx_1 nginx:latest c932e5f486f5e60c4764d93aae20bdffc264f351668f2a2d938bfd8243aa1f06
ホスト側のポート番号8000をコンテナ側のポート番号80とつないでいます。
起動中のコンテナを確認するには、docker ps を実行します。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c932e5f486f5 nginx:latest "/docker-entrypoint.…" 39 seconds ago Up 37 seconds 0.0.0.0:8000->80/tcp nginx_1
コンテナへのアクセス確認
ローカルホスト(MAC)のブラウザからhttp://localhost:8000 でアクセスすると、nginxのトップ画面が表示されます。
コンテナ(nginx_1)のログを確認するには docker logs コマンドを実行します。
$ docker logs nginx_1 /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 172.17.0.1 - - [18/Apr/2021:05:33:03 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" "-" 172.17.0.1 - - [18/Apr/2021:05:33:03 +0000] "GET /favicon.ico HTTP/1.1" 404 556 "http://localhost:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" "-"
コンテナ内のシェルへ入る
コンテナでのコマンド実行は、docker exec コマンドを使用します。
- -i (interactive) : 標準入力(stdin)をオープンにしたままにする
- -t(tty): :擬似的な端末デバイス(TTY:teletypewriter)の割り当て
$ docker exec -it nginx_1 bash root@c932e5f486f5:/#
-it で SSHで接続したかのようになり、 接続後、bashが実行されます。
コンテナのシェルから抜けるには、exit を実行します。
$ docker exec -it nginx_1 bash root@c932e5f486f5:/# exit exit $
コンテナのメタデータの確認
コンテナのメタデータを確認するには、docker inspect コマンドを実行します。
$ docker inspect nginx_1 [ { "Id": "c932e5f486f5e60c4764d93aae20bdffc264f351668f2a2d938bfd8243aa1f06", "Created": "2021-04-18T05:30:00.191827607Z", "Path": "/docker-entrypoint.sh", "Args": [ "nginx", "-g", "daemon off;" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, ・・・
コンテナの停止
コンテナを停止するには、docker stop コマンドを実行します。
nginx_1を停止します。
$ docker stop nginx_1 nginx_1 $
docker ps を確認すると、起動中のコンテナがないことを確認できます。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $
停止中のコンテナも確認するには、docker ps にオプション -a (all)をつけて実行します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c932e5f486f5 nginx:latest "/docker-entrypoint.…" 2 hours ago Exited (0) About a minute ago nginx_1
コンテナの削除
コンテナを削除するには、docker rm コマンドを実行します。
$ docker rm nginx_1 nginx_1 $
docker ps -a を実行すると、nginx_1が削除されていることを確認できます。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES $
イメージの削除
nginxのイメージを削除するには、docker rmi コマンドを実行します。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 62d49f9bab67 4 days ago 133MB $ docker rmi nginx Untagged: nginx:latest Untagged: nginx@sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Deleted: sha256:62d49f9bab67f7c70ac3395855bf01389eb3175b374e621f6f191bf31b54cd5b $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE $
まとめ
Dockerのコンテナ型仮想化について解説しました。Dockerコンテナは、従来のOS仮想化に比べて軽量で高速であり、ホストOSのカーネルを共有するため、独立した空間で同じアプリケーションを複数のコンテナに展開することができます。この記事では、Nginxのイメージを使用してコンテナを作成し、ローカルPCからWebアクセスする方法や、コンテナの起動、停止、削除方法などが紹介しました。
コメント