今から始めるDockerを始める人のためのDockerコマンド~入門編~
Dockerをこれから学習していく方のために、Dockerのコマンドを紹介していきたいと思います。今回は、入門編ということで大きく下記の内容について紹介したいと思います。
- Docker Hubからイメージを取得
- 取得したイメージからコンテナを起動
- 起動したコンテナのにログインしてカスタマイズ
- カスタマイズしたコンテナからイメージを作成
- 作成しイメージをDocker Hubへアップ
もし、Dockerの用語がわからない場合は、Dockerのコンポーネントについても紹介していますので、下記に目を通しておくことをお勧めします。
Dockerのコマンド体系はv1.13 以降新しいコマンド体系を採用しています。v1.13より前のコマンドも利用する事は可能ですが、これから学習する場合は新しいコマンド体系で学習していきましょう。今回紹介するコマンドは新しい体系のコマンドとなっています。
Docker Hubからイメージを取得
ローカルにあるDocker イメージの確認
# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE
当然ですが、何もないので何も表示されません。
Docker イメージの検索
# docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 5945 [OK] ansible/centos7-ansible Ansible on Centos7 128 [OK] consol/centos-xfce-vnc Centos container with "headless" VNC session… 114 [OK] jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 114 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 74 imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 58 [OK] tutum/centos Simple CentOS docker image with SSH access 45 centos/postgresql-96-centos7 PostgreSQL is an advanced Object-Relational … 43 kinogmt/centos-ssh CentOS with SSH 29 [OK] pivotaldata/centos-gpdb-dev CentOS image for GPDB development. Tag names… 11 guyton/centos6 From official centos6 container with full up… 10 [OK] centos/tools Docker image that has systems administration… 6 [OK] drecom/centos-ruby centos ruby 6 [OK] pivotaldata/centos Base centos, freshened up a little with a Do… 4 pivotaldata/centos-mingw Using the mingw toolchain to cross-compile t… 3 darksheer/centos Base Centos Image -- Updated hourly 3 [OK] mamohr/centos-java Oracle Java 8 Docker image based on Centos 7 3 [OK] pivotaldata/centos-gcc-toolchain CentOS with a toolchain, but unaffiliated wi… 3 miko2u/centos6 CentOS6 日本語環境 2 [OK] mcnaughton/centos-base centos base image 1 [OK] indigo/centos-maven Vanilla CentOS 7 with Oracle Java Developmen… 1 [OK] blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK] pivotaldata/centos7-dev CentosOS 7 image for GPDB development 0 smartentry/centos centos with smartentry 0 [OK] pivotaldata/centos6.8-dev CentosOS 6.8 image for GPDB development 0
Docker Hubにあるcentosのイメージを検索しました。
NAMEは、基本的に<ユーザ名>/<イメージ名>となっていて、ユーザ名がないものについては、公式のイメージとなります。
OFFICIALがOK:Docker Hub公式のイメージ
AUTOMATEDがOK:Docker Hubの自動ビルド機能が使われたイメージ
Docker イメージの検索(公式イメージのみ)
# docker search -f is-official=true centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 5945 [OK]
特段意図がなければ、Docker Hub公式のイメージを利用する事をお勧めします。公式イメージのみ検索したい場合は -f is-official=true オプションをつけます。
ローカルにcentosのイメージをダウンロード
# docker pull centos Using default tag: latest latest: Pulling from library/centos 8a29a15cefae: Pull complete Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest
これで、CentOSのイメージがダウンロードできました。
もう一度、同じものを(centos)をダウンロードすると
# docker pull centos Using default tag: latest latest: Pulling from library/centos Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700 Status: Image is up to date for centos:latest # ← もうあるという事で同じものはダウンロードはしない docker.io/library/centos:latest
すでにあるものはダウンロードしない。docker賢い!
ローカルにあるDocker イメージの確認
# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 470671670cac 7 weeks ago 237MB
ダウンロードしたCentOSのイメージがあることが確認できます。
取得したイメージからコンテナを作成
ローカルにあるDocker イメージを利用してコンテナを起動状態で作成
# docker run -d --name centos01 centos:latest /sbin/init 3f72e554062c2cfa35bdb05beef39c948eb74dfb697ba8b9dcdf115fe1bda270
d:デタッチ
name :作成するコンテナ名
/sbin/init :CentOSの場合systemctl を使用するため必須。付けないと起動できません。
【補足】
docker run は、起動状態のコンテナを作成。
docker create は、停止状態のコンテナを作成。
作成したコンテナの確認
# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f72e554062c centos:latest "/sbin/init" 5 seconds ago Up 4 seconds centos01
出来ていますね。またSTATUSがUPとなっているので、コンテナが起動していることもわかります。
起動させたコンテナの詳細を確認
[root@vm11 ~]# docker container inspect centos01 [ { "Id": "3f72e554062c2cfa35bdb05beef39c948eb74dfb697ba8b9dcdf115fe1bda270", "Created": "2020-04-18T05:44:55.472822706Z", "Path": "/sbin/init", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 11160, "ExitCode": 0, "Error": "", "StartedAt": "2020-04-18T05:44:55.706886876Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee", ~~ 省略 ~~ "NetworkSettings": { "Bridge": "", "SandboxID": "86356c904decd1c38991784eb0c8cc8055f0538a8ffa38e686f5ca925a60a0bc", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/86356c904dec", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "e808ae7ba1c6523e68849792111c46347c075e8116778c1a0a34f03843584e82", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "75e39a7b4369a73810d751e11dfc80900fe761c4479a7c58c2c18dde1b6aa0fa", "EndpointID": "e808ae7ba1c6523e68849792111c46347c075e8116778c1a0a34f03843584e82", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } } } } ]
inspect :詳細を確認するためのオプション
長いので、一部省略していますが、詳細を確認するためのinspectオプションは大事なので覚えておきましょう。
起動したコンテナのにログインしてカスタマイズ
起動させたcentos01コンテナにログイン
# docker exec -it -u root centos01 /bin/bash [root@3f72e554062c /]#
it:疑似的で対話的なセッションを作成
u:ユーザ指定
centos01にログインしたので、プロンプトが変わっていることが確認できます。
コンテナのカスタマイズ
[root@3f72e554062c /]# uname -a Linux 3f72e554062c 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux [root@3f72e554062c /]# [root@3f72e554062c /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:21 ? 00:00:00 /sbin/init root 6 0 0 08:22 pts/0 00:00:00 /bin/bash root 19 6 0 08:22 pts/0 00:00:00 ps -ef [root@3f72e554062c /]# [root@3f72e554062c /]# hostname 3f72e554062c [root@3f72e554062c /]# [root@3f72e554062c /]# yum -y update ~~ 省略 ~~ Complete! [root@3f72e554062c /]# [root@3f72e554062c /]#
centos01にログインした後、psコマンド、hostnameコマンド、yum アップデートを実行した例となります。
今回は、yum updateしパッケージを更新しました。
コンテナからのログアウト
[root@3f72e554062c /]# exit exit #
ログインしたコンテナからログアウトするには、通常OSからログアウトするとの同じexitコマンドを利用します。
ログアウトしたので、プロンプトが戻っていることが確認できます。
【番外編】コンテナ内の標準入出力にアタッチする
docker exec でコンテナにログインする手順書を紹介しましたが、標準入出力にアタッチすることでログインする方法あるので紹介します。
# docker attach centos01
固まってしまって、コマンドを一切うけつけなくなってしまいました。。。
# docker container stop centos01 centos01
別ターミナルを開いて、centos01のコンテナを停止したら、無事応答が返ってきました。
# docker container start centos01 centos01
停止させたコンテナを起動させました。
docker attachは、PID=1の標準入出力にアタッチするコマンドです。今回においては、/sbin/init にアタッチされたため、コマンドを受けつかなったようです。/bin/bash などでコンテナを起動した場合(PID=1が /bin/bash)は、コマンドを受け付けてくれます。
PID=1にアタッチしているの、exitでログアウトするとコンテナ自体も止ってしまいます。
コンテナを止めずにログアウトする際は、Ctrl + P か Ctrl + Q のどちらかでログアウトしてください。
起動しているコンテナの停止とその確認
#docker container stop centos01 centos01
これで、centos01 コンテナを停止することができます。
# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ls だけでは、表示されません。ls は起動しているコンテナのみ表示させます。
# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f72e554062c centos:latest "/sbin/init" 3 minutes ago Exited (137) 5 seconds ago centos01
-a をつけることで、停止しているコンテナも表示されます。
STATUSが Exited 担っているので、停止していることを確認できます。
停止しているコンテナの起動
# docker container start centos01 centos01
停止させたコンテナを起動させました。
# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f72e554062c centos:latest "/sbin/init" 3 hours ago Up 2 seconds centos01
起動しているので、ls だけで表示されました。
カスタマイズしたコンテナからイメージを作成
コンテナをカスタマイズしたら、それをイメージにすることができます。
今回は、centos01 のコンテナからイメージを作成したいと思います。
コンテナの停止
#docker container stop centos01 centos01
まずは、centos01 コンテナを停止します。
起動したままでも、イメージ作成可能ですが、停止させてた方が静止点をとれるので、停止した状態でイメージ作成することをお勧めします。
# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f72e554062c centos:latest "/sbin/init" 3 hours ago Exited (137) 6 seconds ago centos01
停止されました。
イメージの作成
# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 470671670cac 3 months ago 237MB
今は、公式イメージのcentosしかないことが確認できます。
# docker commit -m "for test" -a "kubalog" centos01 kubalog/centos:202004 sha256:f601b3b684da1e8fcd7507dd6ded665f21c49ed1b6725941b7fa0684371515be
m:コメント
a:作成者
これで、イメージが作成されました。
# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE kubalog/centos 202004 f601b3b684da 5 seconds ago 393MB centos latest 470671670cac 3 months ago 237MB
イメージが作成されたことが確認できます。
最初はpullしてきたcentos:latestのイメージしかなかったですが、”docker commit”でコンテナから新しいイメージが作成できたことがわかります。
作成しイメージをDocker Hubへアップ
Docker Hubへログイン
# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: kubalog Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. SeeLogin Succeededdocker login
ログインするにあたっては、Docker Hub のアカウントが必要です。もし、まだアカウントをもっていない場合は作成してから、ログイン下さい。
Docker Hubへアップロードする
# docker push kubalog/centos:202004 The push refers to repository [docker.io/kubalog/centos] 135ccfeaceb0: Pushed 0683de282177: Pushed 202004: digest: sha256:bb5c8f799a482cb952011fdbcedb1c63f123efc417c76da3ad271eead4546dce size: 741
docker push を行う場合の引数は下記です。
docker push <DockerHubのユーザ名>/<DockerHubのリポジトリ名>:<タグ名>
Docker Hubのユーザ名とアップロードするイメージのユーザ名は同じにしないとアップロードできないので留意ください。