【学習メモ】Dockerを本気で理解しにかかる〜#1-2 Dockerコマンド〜
概要
こちらの記事の#1-2 です。
前回は概要をまとめていったので、今回は Docker コマンドについてまとめていきます。
Docker コマンド
docker login
こちらは DockerDesktop から簡単にログインできるのであまり使うことないかもしれませんが、DockerHub のアカウントにログインするコマンドです。
docker login
ID, Password を聞かれるので、入力することでログインできます。
docker pull
git pull
で GitHub からリポジトリを pull してくるイメージと同様に DockerHub(Docker Registry)からイメージを取得できます。
例:nginx のイメージを取得する
docker pull nginx
前回の記事で少し記載しましたが、イメージにタグをつけない場合、latest(最新バージョン)を取得してくることになります。
タグをつけた場合は以下です。
例:nginx のイメージを取得する(タグあり)
docker pull nginx:1.25.3
タグの調べ方については DockerHub で検索し、Tags から欲しいバージョンを指定するで OK です。
また、余談ですが docker イメージは容量が大きくて、ほったらかしにするとローカルストレージを圧迫するので以下で定期的に削除することをお勧めします。
docker images
docker pull
などで取得したイメージの一覧を確認することができます。つまり、ローカルに落としてきたイメージの全件表示です。
docker images
コマンドで表示される項目は以下です。
REPOSITORY
TAG
IMAGE ID
CREATED
SIZE
こちらで分かるとおり、イメージには一意の ID を持っているため、以下でイメージ削除する場合はこちらの ID を使用すると良いです!
docker rmi
取得したイメージの削除です。
docker rmi {IMAGE ID}
注意点としては起動中コンテナのイメージは削除できません。そのため、また後で説明するコマンドを使ってコンテナを削除してからイメージの削除を実行してください。
また、完全に覚えておく必要はありませんが、イメージには依存関係があり、その依存関係のベースイメージから削除することはできません。なので、イメージの削除に失敗した場合は、依存関係により削除する順番があるということを頭の片隅にでも入れておけば OK です!
イメージが容量を圧迫しているので、一旦全部削除したいということであれば以下のコマンドで全てのイメージを削除できます。
# 全てのイメージを削除
docker rmi $(docker images -q)
docker run
コンテナ起動のためのコマンドです!
コンテナ起動するために必要なイメージがローカルになかった場合、イメージの取得も併せて行ってくれます!
docker run --name nginx -p 80:80 nginx
上記オブションの説明は以下
- -p : ポートフォワーディング。ホスト OS 側のポート:コンテナ側のポート
- --name : 起動するコンテナに任意の名前をつける
--name の後に指定しているのはコンテナ名としての「nginx」です。そのためこちらは任意の名前で OK となります。
末尾の「nginx」はイメージの指定をしています。上述しましたが、ローカルに指定したイメージがなければ、取得(pull)も併せて行ってくれます。
バックグラウンドでコンテナ起動
上記のコマンドではフォアグランドでコンテナ起動してしまうため、ターミナル操作ができなくなってしまいます。
バックグランドで実行するためのオブションは以下です。
docker run --name nginx -p 80:80 --detach nginx
or
docker run --name nginx -p 80:80 -d nginx
停止と同時にコンテナ削除
後述しますが、docker rm
コマンドを使用してコンテナの削除をすることができますが、コンテナを停止と同時に削除するためのオプションもあります。
それが--rm
オプションです
docker run --name nginx -p 80:80 -d --rm nginx
上記のコンテナが停止されると同時に削除もしてくれます。
起動時にコンテナ内に入る。
コンテナ内に入って操作したい場合もあるかと思います。その場合は-it
オプションでコンテナ内に入れます。
docker run -it --name centos centos:8 /bin/bash
末尾の/bin/bash
はコンテナ内に入って操作するためのシェルを指定しています。
docker ps
起動中コンテナの一覧表示。こちらは Linux の ps コマンドと同様、process 確認用のコマンドとなっております。
起動中のコンテナ一覧
docker ps
表示される項目の一覧です。
CONTAINER ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
以下でコンテナの停止等、コンテナを指定して何か操作する場合には「NAMES」もしくは「CONTAINER ID」でコンテナを指定してあげれば OK です!
起動中 + 停止中のコンテナ一覧
停止中のコンテナも含めて表示する場合は、オプション a をつけます
docker ps -a
or
docker ps --all
docker start
停止中のコンテナを起動するコマンドです。
docker start {CONTAINER ID}
docker stop
起動中のコンテナを停止します!
docker stop {CONTAINER ID}
docker restart
起動中のコンテナを再起動します!
docker restart {CONTAINER ID}
docker rm
コンテナ削除のためのコマンドです。
docker rm {CONTAINER ID}
注意点としては停止中のコンテナしか削除できないため、先に停止してあげる必要があります!(-f オプションで強制削除できますが、予期せぬトラブルに遭遇しないように基本使用しない方が良いでしょう)
docker logs
起動中コンテナのログを表示する
docker logs {CONTAINER ID}
-f オプションをつけることでリアルタイム表示が可能。(Linux コマンドでいうtail -f
の Docker 版)
docker exec -it
起動中のコンテナに入る
docker exec -it {CONTAINER ID} {シェル名}
例:
docker exec -it {CONTAINER ID} /bin/bash
-it オプションとは
このオプションの意味が最初は分かりにくいなと思いましたが、以下のオプションがくっついています。
- --interactive
- --tty
ただ、コンテナの中に入って何か作業する時には多用するコマンドなので、詳しく意味を知らなくてもexec -it
は一連の流れで覚えておけば良いと思います。
docker cp
ホスト側のファイルをコンテナにコピー、もしくはその逆ができるコマンドです。
docker cp {コピー元} {コピー先}
例:ホストにあるファイルをコンテナにコピー
docker cp ./test.txt centos:/testdir
上記は centos という名前をつけたコンテナの/testdir
ディレクトリに対して、./test.txt
をコピーする
例:コンテナ側にあるファイルをホストにコピー
docker cp centos:/testdir/test2.txt ./
docker inspect
コンテナのメタデータを確認することができます。
docker inspect {CONTAINER ID}
コンテナ名やコンテナ ID だけでなく、IP アドレスなどもこちらのコマンドで確認できます。
コンテナの詳細を見たい場合はこちら確認すると良いでしょう。
docker commit
コンテナからイメージを作るためのコマンド。以下の push で DockerHub にアップできるが、まああまりやることないと思うので詳細は割愛します。
docker push
DockerHub にイメージをアップするためのコマンド。
こちらも詳細は割愛します。
docker history
イメージのレイヤー構造を確認できるコマンドです。
docker history {イメージ名:タグ}
詳細オプション
上記では、ざっとよく使用する Docker コマンドをまとめていきました。
その中でオプションも少し解説していきましたが、ここからはオプションの詳細を見ていこうと思います!
ホストからコンテナ内へ Vlume をマウントする --volume(-v)
ストレージを共有するためのオプションを見ていきたいと思います。
docker run --volume {HOST}:{CONTAINER} nginx
上記の HOST にはホスト側のディレクトリを指定し、CONTAINER にはコンテナ側のマウントしたいディレクトリを指定します。
これにより、ホストからコンテナに Volume がマウントされます。
マウントとは
そもそもマウントは「取り付ける」という意味があるそうです。要はホスト側のストレージの一部をコンテナ側に取り付けることにより、ストレージを共有しているイメージになります。このストレージのことを vlume と呼びます。要はストレージを共有しているので、ホスト側で何らかのファイル変更を行なった場合、コンテナ側のファイルにも反映されますし、コンテナ側で行なっても変更も、ホスト側のファイルに反映されます。
このマウント方法ですが、さらに詳細に見ると 3 種類あるようです。
- バインドマウント
- ボリュームマウント
- 一次ファイルシステムのマウント
これ以降詳細は一旦、割愛します。余裕があれば詳細まとめようかなと思います!
ちなみに今までマウントと言ってきたのは、バインドマウントです!(--volume)
コンテナの環境変数を設定 --env
docker run -d --env HOGE_ENV=hoge nginx
上記実行後、コンテナに入り、env
コマンドを実行すると指定した環境変数が定義されているのが分かると思います!
ポートのマッピング(ポートフォワーディング) -p
上述しましたが、-p でポートのマッピングが可能です。
docker run --name nginx -p 80:80 nginx
この場合、ローカルの 80 番ポートに接続するとコンテナの 80 番ポートに繋がります。{ローカルのポート番号}:{コンテナのポート番号}
コンテナ側の NGINX はデフォルトで 80 番ポートで待ち受けているので、固定ですが、ローカルは他のコンテナを起動していたり、アプリケーション起動していたりする関係で 80 番ポートを使用できない場合があると思います。そのような場合に重複を避けてポート指定することが可能です!
コンテナのライフサイクルとコマンドの整理
分かりにくくなったらこの図で整理すれば良さそう。
まとめ
今回は Docker コマンドについてよく使用されるコマンドをまとめました!
次回は、今回も少し触れましたがストレージの共有、ボリュームのマウントについて、まとめようと思います!(自分が理解し切れていないので...)
Discussion