Dockerの基礎知識
ここでは、簡単な Docker の使い方を説明します。 まずは慣れてみましょう。
基本的な使い方
簡単な例1: Hello world
なにはともあれ、"Hello world"してみましょう。Docker がまさしくインストールされていれば、下のコマンドが動くはずです。
docker run hello-world
それぞれのオプションの詳しい意味は、以下の通りです。
docker run
:新しいコンテナを作成して起動するコマンドhello-world
:使用するDockerイメージ名(「hello-world」イメージ)。このイメージは、Dockerの動作確認用で、実行すると「Hello from Docker!」などのメッセージを表示する
もし、以下のようなメッセージが出て、うまく起動できていなさそうな場合は、本ページの一番下のDockerを一般ユーザで実行するをやってみてください。
$ docker run hello-world
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/containers/json: dial unix /var/run/docker.sock: connect: permission denied
初回実行時には以下のようなログが流れるはずです。"hello-world"の Docker イメージをダウンロードしてから実行しています。
[keimiya@akipon ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:f2266cbfc127c960fd30e76b7c792dc23b588c0db76233517e1891a4e357d519
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/
もう一度、同じコマンドを実行してみると少しログの内容が変わります。 最初の"Unable to find image 'hello-world:latest' locally"から始まる 5 行がなくなって、起動も速くなりました。 これは、"hello-world"のコンテナイメージが 1 回目の実行でダウンロードされており、2 回目の実行ではそれを再利用するからです。
[keimiya@akipon ~]$ docker run hello-world
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/
簡単な例2: Webサーバの起動
次は、以下のコマンドで Web サーバを起動させてみましょう。
-d
オプションは、デタッチドモードでコンテナを起動するオプションです。
これを利用した場合、そのイメージはバックグラウンドで常時動き続けます。
docker container run -d --rm --name sono1 -p 8080:80 nginx:latest
仮想マシン上のブラウザで http://127.0.0.1:8080
にアクセスしてみてください。うまく行っていれば、Welcome to nginx! というページが表示されます。
コマンドの説明
このDockerコマンドでは、新しいコンテナをバックグラウンドで実行しています。
具体的には、nginxの最新版(nginx:latest
)をバックグラウンド(-d
)で実行し、ホストの8080ポートからコンテナの80ポートにアクセスできるように設定(-p 8080:80
)し、コンテナが終了したら自動的に削除するように設定(--rm
)しています。また、このコンテナはsono1
という名前で識別されます(--name sono1
)。
それぞれのオプションの詳しい意味は、以下の通りです。
docker container run
: 新しいDockerコンテナを作成して起動-d
: コンテナをバックグラウンドモードで実行--rm
: コンテナが終了したときに自動的にコンテナを削除。これは停止したコンテナを残したくないときに付与する--name sono1
: コンテナにsono1
という名前を付ける-p 8080:80
: ポートマッピングを行う。ホストの8080ポートをコンテナの80ポートにマッピング。これでホストマシンの8080ポート経由でコンテナのサービス(nginx)にアクセスできるようになります。nginx:latest
: 実行するDockerイメージを指定。ここではnginx
のlatest
タグを持つイメージを使用しています。これは、nginxの最新版を意味します。
簡単な例3: 2つ目のWebサーバの起動
別の Web サーバを起動させてみましょう。新しくコンソールを起動して、以下のコマンドを実行してみてください。-p
のあとの数字が違うことに気を付けてください。
docker container run -d --rm --name sono2 -p 8081:80 nginx:1.18
ブラウザで http://127.0.0.1:8081
にアクセスしてみてください。うまく行っていれば、Welcome to nginx! というページが表示されます。
今回は以下の部分を変更して、新しいコンテナをバックグラウンドで実行しています。
-p 8081:80
: ポートマッピングを行う。ホストの8081ポートをコンテナの80ポートにマッピングnginx:1.18
: 実行するDockerイメージを指定。ここではnginx
の1.18
タグを持つイメージを使用
起動しているコンテナの確認
docker ps
コマンドで起動しているコンテナを確認してみてください。以下のように、2 つのコンテナが起動しているはずです。
これは、デタッチドモードでコンテナを起動しているためです。
IMAGE
とPORTS
、NAMES
は一緒なはずですが、それ以外の項目の値は違っても問題ありません。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5cc738dc030 nginx "/docker-entrypoint.…" 7 seconds ago Up 5 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp sono1
269b1c385d68 nginx:1.18 "/docker-entrypoint.…" 30 seconds ago Up 29 seconds 0.0.0.0:8081->80/tcp, :::8081->80/tcp sono2
チェックポイント:できたら見せてください
起動しているコンテナの停止
docker stop sono1
とdocker stop sono2
のコマンドでコンテナを停止します。
また、docker container rm sono1
とdocker container rm sono2
というコマンドでコンテナを破棄します。
ブラウザで http://127.0.0.1:8080
と http://127.0.0.1:8081
を開き、エラーになることを確認してみてください。
もしかすると、ブラウザのキャッシュの機能で、正しくエラーにならないかもしれません。
その際はプライベートモードでブラウザを起動し、アクセスしてみてください。
また、docker ps
コマンドで何もコンテナが起動していないことを確認してみてください。
ここまで、Docker とコンテナがなんとなく分かったかなと思います。 それでは、次に Docker とコンテナの概要をざっと説明します。
コンテナの基本的な話
ここでは、次に Docker とコンテナの概要をざっと説明します。
コンテナのライフサイクル
コンテナのライフサイクルと状態、それに関するコマンドの関係を示したものは以下の図です。(教科書 P.36 を少しいじったもの) コンテナはイメージという形で、Docker 社が提供するサーバに保管されています。このサーバを Docker Hub リポジトリと呼びます。
イメージを利用する典型的な手順は、以下のようなものです。
- Docker Hub リポジトリから、手元のマシンにイメージがダウンロードされる(ローカルイメージ化)
- イメージは
run
コマンドにより実行される - 実行が終わったら、もしくは、停止させたい場合は、
stop
コマンドで停止させる - イメージが不必要になったら、
rm
やprune
コマンドで破棄する
ここでポイントなのは、Docker イメージはスナップショットである、ということです。
単に実行中のコンテナをstop
するだけでは、実行データが消えてしまう、ということです。
イメージを変更するには、commit
コマンドやmount
機能などを利用し、新しいイメージを作成しなければなりません。
Dockerの基本的なコマンド
Docker にはいろいろなコマンドあります。以下に基本的なコマンドを列挙しますので、必要に応じて参照したり実行してみてください。
コンテナ操作
-
Docker コンテナの作成
docker container run --name sono1 nginx
-
Docker コンテナでコマンドを実行
docker container run nginx date
-
Docker コンテナの一覧の表示
docker container ls
-
Docker コンテナ情報の確認
docker container stats --no-stream
-
Docker コンテナの起動
docker container start sono1
-
Docker コンテナの停止
docker container stop sono1
-
Docker コンテナの破棄: コンテナ停止と同時にコンテナを破棄
docker container rm sono1
イメージ操作
-
ローカルの Docker イメージの一覧表示
docker image ls
-
イメージの削除
docker image rm hello-world
-
名前なしイメージの削除(あまり使わない)
docker image prune -f
コンテナへのアクセス
-
Docker コンテナをすべて表示
docker ps -a
-
稼働しているコンテナへの接続(ログ確認など)
docker attach sono1
-
稼働しているコンテナへの接続
docker exec sono1 date
docker exec -it sono1 bash
※docker start sono1
などとして、コンテナを稼働させておくこと
Docker Hubとは
Docker Hubは Docker 社が提供しているクラウドサービスです。Docker Hub はクラウド上のレジストリ・サービスであり、アプリケーションやサービス・コンテナの構築と配信を行います。コンテナ化されたイメージを見付け足り、配布したり、変更の管理、ユーザーやチームのコラボレーション、開発パイプラインを通したワークフローの自動化といったことができます。
たとえば、プログラミング言語 (Python, Java)、Linux のディストリビューション (Ubuntu, Fedora)、Web サーバ (nginx, Apache)、ホームページ作成環境(Wordpress, drupal)、データベース (PostgreSQL, mongoDB)などが登録されています。
Docker Hubのイメージを探す
Docker Hub のページ上部にある、検索ボックスからイメージを検索をできます。"Python"や"CentOS"など気になるものを検索してみましょう。
また、コマンドを用いて、Docker Hub 上にあるコンテナイメージを検索したり取得できます。 タグの検索を行うコマンドはないので、少し不便ですが。
-
イメージの検索
docker search python
-
イメージの取得
docker pull python
Docker Hubへのユーザー登録
-
- Docker ID: (好きなアカウント名)
- Email: (大学のとか、Gmail とか)
- Password: (わかりにくいやつ)
-
Free プランを選んでください。
- 登録したメールに確認メールが来ていることを確認して、リンクをクリックしたら登録完了です。