(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Docker】Ubuntuのテスト環境を用意するハンズオン

スポンサーリンク

はじめに

本記事では初めてDockerを触る方を対象に
コンテナ上でテスト環境を用意する」流れを説明しています。また、その流れでよく使うコマンドも紹介しています。

以下がイメージ図です。
Dockerで用意するのはホスト上に影響を与えないテスト環境のため、好き勝手にいじることがき、不要になればサクッと削除できます。
f:id:mtiit:20190429193708p:plain

dockerのインストールに関しては環境毎に方法が異なるので事前にお願いします。

コマンド実行環境
ホスト環境 Red Hat Enterprise Linux Server 7.6

Docker Hands-On

準備確認

Dockerの起動確認を行い、activeであることを確認します。

# systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since XXX UTC; 4 days ago
     Docs: http://docs.docker.com
...

docker infoコマンドにてコンテナ数、イメージ 数を確認します。

# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.13.1
...

既に起動したコンテナ等があればこちらにその数が表示されます。

ubuntuを用意しテスト環境とする

コンテナの作成とイメージ/コンテナの確認

コンテナを作成するべくdocker runコマンドを実行してみます。
構文は「docker run ubuntu (コンテナ上で発行したいコマンド)」です。

# docker run ubuntu hostname
Unable to find image 'ubuntu:latest' locally
Trying to pull repository registry.access.redhat.com/ubuntu ... 
...
Status: Downloaded newer image for docker.io/ubuntu:latest
ba95f4f47622

初回起動時はubuntuのイメージが存在しないため、リポジトリに探しに行きます。
ダウンロードが完了した後、hostnameコマンドの結果である「ba95f4f47622」が表示されています。

再度docker infoコマンドを打つと変化が確認できます。

# docker info
Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 1
...

イメージ数が増え、コンテナが終了した状態で1つ増えています。

イメージの情報が見たければdocker images

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              d131e0fa2585        2 days ago          102 MB

コンテナの情報が見たければdocker ps -aコマンドを押下します。

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
ba95f4f47622        ubuntu              "hostname"          3 minutes ago       Exited (0) 3 minutes ago                       dreamy_volhard

-aをつけなければ起動中のコンテナしか表示されない点も合わせて覚えておくと良いです。

コンテナとホストでカーネルを共有していることを確認

カーネルを共有していることを確認するためuname -rコマンドをホストとコンテナ上で実行してみてください。

# uname -r
3.10.0-957.10.1.el7.x86_64
# docker run ubuntu uname -r
3.10.0-957.10.1.el7.x86_64

ホスト上で実行したコマンドとコンテナ上で実行したコマンドの結果が一致していることがわかります。

なお、今回は既にイメージが手元にあるのでインストール作業が行われません。

もう一度docker infoを行うと

# docker info
Containers: 2
 Running: 0
 Paused: 0
 Stopped: 2
Images: 1
...

イメージ数は変わらず、コンテナ数が増えています。

コンテナの状態を確認しても二つになっています。

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
56f018c00caf        ubuntu              "uname -r"          2 minutes ago       Exited (0) 2 minutes ago                       silly_sammet
ba95f4f47622        ubuntu              "hostname"          7 minutes ago       Exited (0) 7 minutes ago                       dreamy_volhard

コンテナが終了した際に自動的に削除する場合はdocker run --rm としてください。

# docker run --rm ubuntu whoami
root
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
56f018c00caf        ubuntu              "uname -r"          3 minutes ago       Exited (0) 3 minutes ago                       silly_sammet
ba95f4f47622        ubuntu              "hostname"          9 minutes ago       Exited (0) 9 minutes ago                       dreamy_volhard

上のように新たに追加されず、停止しているコンテナ数は変わっていません。

コンテナを削除する

停止しているコンテナはdocker rmで削除可能です。

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
56f018c00caf        ubuntu              "uname -r"          7 minutes ago       Exited (0) 52 seconds ago                           silly_sammet
ba95f4f47622        ubuntu              "hostname"          13 minutes ago      Exited (0) About a minute ago                       dreamy_volhard
# docker rm 56f018c00caf
56f018c00caf
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
ba95f4f47622        ubuntu              "hostname"          13 minutes ago      Exited (0) About a minute ago                       dreamy_volhard
# docker rm ba95f4f47622
ba95f4f47622
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

ちなみに、イメージに紐づく全てのコンテナを削除するとdocker rmi IMAGEID でimageも削除可能です。

コンテナ環境にログインしたままにする

これまではコマンド発行後は終了していました。
docker run -t -i とすることで対話形式としてコンテナ上にログインしたままとなります。
また、ホストに戻ってくる場合はexitコマンドにてコンテナを終了させることができます。

# docker run -t -i ubuntu
root@a0b8fce71874:/# 
root@a0b8fce71874:/# exit
exit
# 

ちなみにexitコマンドで終了するとコンテナが停止してしまいますが「CTRL-p CTRL-q」を押すとコンテナを起動させたままでコンテナを抜けることができます。

そうすればdocker psコマンドを押下にて起動しているコンテナ情報として確認できます。

また、停止しているコンテナに再接続を行う場合はdocker startにてコンテナを起動し、docker attachにて再ログインします。

コンテナ内に加えた変更はもちろんそのまま反映されています。
試しにhogeという空ファイルを作成してみました。

# docker start a0b8fce71874
a0b8fce71874
# docker attach a0b8fce71874
root@a0b8fce71874:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@a0b8fce71874:/# touch hoge
root@a0b8fce71874:/# exit
exit
# docker start a0b8fce71874
a0b8fce71874
# docker attach a0b8fce71874
root@a0b8fce71874:/# ls
bin  boot  dev  etc  hoge  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

該当ファイルが一度停止した後に再接続しても存在しています。

終わりに

Dockerは、ハイパーバイザ型と比較すると容易かつ高速に仮想環境を準備できることが実感できたと思います。
本記事の内容はDockerの初歩の動きの確認ですが、それでもDockerの便利さが伝われば幸いです。

以上、コンテナを用いてホストの上にテスト環境を用意するハンズオンでした。