🐡

【学習メモ】Dockerを本気で理解しにかかる〜#1-2 Dockerコマンド〜

2024/01/27に公開

概要

こちらの記事の#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 イメージは容量が大きくて、ほったらかしにするとローカルストレージを圧迫するので以下で定期的に削除することをお勧めします。

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 コマンドについてよく使用されるコマンドをまとめました!
次回は、今回も少し触れましたがストレージの共有、ボリュームのマウントについて、まとめようと思います!(自分が理解し切れていないので...)

GitHubで編集を提案

Discussion