Docker基本コマンド
1.はじめに
Dockerコンテナのライフサイクル(作成→起動→終了→削除)に必要な基本コマンドを一通り試していきます。
環境
Docker Toolbox
2.イメージ取得~削除まで
まずはイメージ一覧の確認コマンドです。取得済のイメージが表示されます。
■イメージ一覧:docker images
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE
Docker Hubから公式イメージを取得してみます。
■イメージ一覧:docker pull {イメージ名:タグ}
$ docker pull httpd:2 2: Pulling from library/httpd (省略)
もう一度イメージ一覧を確認してみると、取得したイメージが追加されています。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2 ccbcea8a6757 2 weeks ago 166MB
取得したイメージを削除してみます。
■イメージの削除:docker rmi {イメージ名orイメージID}
$ docker rmi ccbcea8a6757
イメージ一覧から消えていることが確認できます。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE
次はdockerfileからイメージを作成してみます。 例として公式のイメージhttpd:2にVimを追加しただけのイメージを作ります。以下のファイルを準備します。
FROM httpd:2 RUN apt-get update && \ apt-get install -y vim
下記コマンドで実行できます。-t オプションで名前とタグを設定できます。今回はイメージ名をtest、タグを001で設定しました。
■dockerfileからイメージの作成:docker build -t {イメージ名:タグ名} {dockerfileへのパス}
$ docker build -t test:001 ./ Sending build context to Docker daemon 4.096kB Step 1/2 : FROM httpd:2 (省略)
イメージ一覧を確認してみます。 基となった公式イメージと作成したイメージの2つが追加されています。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test 001 323103358339 31 seconds ago 216MB httpd 2 ccbcea8a6757 2 weeks ago 166MB
3.コンテナ起動~コンテナ内へログイン
作成したイメージを基にコンテナを起動してみます。 起動前にコンテナ一覧を確認してみます。-aオプションなしの場合は起動中コンテナのみ表示されます。
■コンテナ一覧の確認 docker ps -a
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
何もない状態です。ではコンテナを起動します。オプションの内容については下記の通りです。
- -d 起動をバックグラウンドで実施
- --name コンテナ名を指定
- -p ポートフォワーディング設定
■コンテナの起動:docker run -d --name コンテナ名 -p {ホストのポート番号}:{コンテナのポート番号} {イメージID or イメージ名}
$ docker run -d --name test -p 80:80 ccbcea8a6757 9fd0e3afea1b95c2b06116b5f5f07da8bafe7d3e3f1bb9f4d7c7158193525115
コンテナ一覧を確認してみます。 起動したコンテナが表示されています。STATUSがUPになっていれば起動中です。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9fd0e3afea1b ccbcea8a6757 "httpd-foreground" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp test
起動したコンテナ内へアクセスしてみます。 WindowsでDockerを使用している場合はコマンドのはじめにwinptyが必要です。
■コンテナへアクセス:[winpty] docker exec -it {コンテナ名orコンテナID} bash
$ winpty docker exec -it test bash root@9fd0e3afea1b:/usr/local/apache2#
アクセスできました。 ログアウトするにはコンテナ内でexitします。
■コンテナからログアウト:exit
root@9fd0e3afea1b:/usr/local/apache2# exit exit
4.コンテナ停止・起動・再起動
作成したコンテナを停止します。
■コンテナの停止:docker stop {コンテナ名orコンテナID}
$ docker stop 9fd0e3afea1b 9fd0e3afea1b
コンテナ一覧で確認するとSTATUSがExitedになっています。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9fd0e3afea1b ccbcea8a6757 "httpd-foreground" 18 hours ago Exited (0) About a minute ago test
停止したコンテナを起動します。
■コンテナの起動:docker start {コンテナ名orコンテナID}
$ docker start 9fd0e3afea1b 9fd0e3afea1b
コンテナ一覧で確認するとSTATUSがUPになっています。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9fd0e3afea1b ccbcea8a6757 "httpd-foreground" 22 minutes ago Up 36 seconds 0.0.0.0:80->80/tcp test
コンテナの再起動をします。1コマンドでコンテナのstop→startを実行できます。
■コンテナの再起動:docker restart {コンテナ名orコンテナID}
$ docker restart 9fd0e3afea1b 9fd0e3afea1b
5.ホストとコンテナ間でのコピー
ホスト側からコンテナへファイルをコピーしてみます。 ここではtest.txtという空ファイルを準備してコンテナのルートディレクトリへコピーしています。
■ホストからコンテナへのコピー:docker cp {コピーするファイル名} {コンテナID}:{コピー先パス}
$ docker cp test.txt 9fd0e3afea1b:./
コンテナ内に入ってコピーできているか確認します。
$ winpty docker exec -it 9fd0e3afea1b bash root@9fd0e3afea1b:/# find ./test.txt ./test.txt
コピーできていることを確認できたので、次はコンテナからホスト側へコピーをしてみます。 exitでコンテナからログアウトします。
■コンテナからホストへのコピー docker cp {コンテナID}:{コピーするファイル名} {コピー先パス}
docker cp 9fd0e3afea1b:./test.txt ./cp_test.txt
カレントディレクトリをlsで確認するとcp_test.txtが確認できます。
6.コンテナ削除
次はコンテナを削除してみます。 コンテナの起動中は削除できないので、一旦コンテナを停止します。
■コンテナの削除:docker rm {コンテナ名orコンテナID}
(docker stopで停止した後に) $ docker rm 9fd0e3afea1b 9fd0e3afea1b
-fオプションを使用すれば、起動中のコンテナも削除できます。
$ docker rm -f 9fd0e3afea1b 9fd0e3afea1b
コンテナ一覧から削除されているか確認します。 -f id={コンテナID}オプションで、コンテナIDに一致するコンテナのみ表示できます。
$ docker ps -a -f id=9fd0e3afea1b CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7.おわりに
コンテナのライフサイクル(作成→起動→終了→削除)を通して基本コマンドを一通り試すことができました。 他にも便利なコマンドやオプションがありますので、Docker公式ドキュメント(docs.docker.com)等をご確認ください。