Docker

今から始めるDockerを始める人のためのDockerコマンド~入門編~

今から始めるDockerを始める人のためのDockerコマンド~入門編~

Dockerをこれから学習していく方のために、Dockerのコマンドを紹介していきたいと思います。今回は、入門編ということで大きく下記の内容について紹介したいと思います。

  1. Docker Hubからイメージを取得
  2. 取得したイメージからコンテナを起動
  3. 起動したコンテナのにログインしてカスタマイズ
  4. カスタマイズしたコンテナからイメージを作成
  5. 作成しイメージを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. See

docker login
Login Succeeded

ログインするにあたっては、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のユーザ名とアップロードするイメージのユーザ名は同じにしないとアップロードできないので留意ください。

タイトルとURLをコピーしました