Help us understand the problem. What is going on with this article?

【入門】はじめての Docker Desktop for Windows のインストールと CentOS の仮想環境構築のセットアップ

【入門】はじめての Docker Desktop for Windows のインストールと CentOS の仮想環境構築のセットアップ

最近では、Linuxの環境を利用したいときに 無償の Docker Desktop (for Mac and Windows ) で Linuxコンテナを使うというのがお手軽になりつつあります。
今回、Windows 10のノートPCに Doker Desktop for Windows をインストールし、CentOSの仮想環境を構築する手順について、はじめがからていねいにまとめて、ご紹介します。

なお、途中で Dockerコマンドなどについても詳しく説明していくので、 Docker初心者で CentOSの仮想環境を構築したいという方は是非参考にしていただければ幸いです。

  • 前提条件
  • 事前準備
  • Docker Desktop for Windows のインストール
  • CentOS コンテナ (仮想環境) の構築
  • CentOS コンテナ (仮想環境)の整備
  • 作業済み CentOS コンテナ (仮想環境)の保存

前提条件

Docker Desktop for Windowsは Windows ネイティブの Hyper-V 仮想化とネットワークを使用します。Windows 10 上で Hyper-V を使用するためには、Windows 10 の Professional 以上のエディションが必要で、Windows 10 Home には対応していません。

Windows 10 上で Hyper-V を使用するための要件は、Microsoft のサイトの「Windows 10 上に Hyper-V をインストールする」に記載されています。

なお、今回インストールしたデバイスの仕様とWindowsの仕様は次の通りです。

  • プロセッサ Intel(R) COre(TM) i5-6300U CPU @ 2.40GHz 2.50DHz
  • 実装RAM 8.00 GB
  • システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ
  • エディション Windows 10 Pro

事前準備

Docker Desktop for Windows をインストールする事前準備として、インストールする Windows マシンの Hyper-V を有効化しておく必要があります。また、Docker公式サイトにて、Docker ID というアカウントを取得して必要があります。

Hyper-Vの有効化 にする

Docker Desktop for Windows は Hyper-V を使用するので、無効となっている場合は有効にします。

Hyper-V を有効にするには複数の方法があります。ここでは、「コントロール パネル\すべてのコントロール パネル項目\プログラムと機能」の方法で有効化します。

[設定] で Hyper-V ロールを有効にする

  1. Windows ボタンを右クリックし、[アプリと機能] を選択します。
  2. [関連設定] の下にある [プログラムと機能] を選択します。
  3. [Windows の機能の有効化または無効化] を選択します。
  4. [Hyper-V] を選択して、[OK] をクリックします。

有効化するには Windows マシンの再起動が必要です。

Docker IDの取得 する

Docker Desktop をインストールするには、Docker IDというアカウントが必要となります。もし、お持ちでなければ、Docker Desktop for Windows のインストールの途中でアカウントの作成も可能ですが、事前に、Docker 公式サイトにて、Docker IDのアカウントを取得しておくことがよいでしょう。

次のURLからサインアップしアカウントを作成してください。

https://hub.docker.com/signup

Docker Desktop for Windows のインストール

インストール

インストーラーをダウンロードする

インストールは次のサイトで Docker for Windows インストーラーをダウンロードしてインストールしていくことができます。

https://www.docker.com/products/docker-desktop

[Download Desktop for Mac and Windows] ボタンをクリックします。

次の画面で、 [Download Desktop for Windows] ボタンをクリックします。
これで、[Docker for Windows Installer.exe] ファイルがダウンロードできます。ファイルは1つだけです。

ここまでで Windowsマシンへのダウンロードまでが完了です。

Windowsマシンへのインストールする

次はインストールを行います。ダウンロードした [Docker for Windows Installer.exe] ファイルを、エクスプローラーから実行してください。
ダウンロードが完了すると、Configraton の画面が出ます。そのまま「OK」を押してください。
[Use Windows containers instead of Linux containers (this can be chananged after installation] の行にはチェックボックスが付いていません。これはコンテナで Windows を動かす場合のオプションです。今回は CentOS を動かしたいのでこのチェックボックスは不要です。

インストールが始まります。しばらく待機してください。

ここまでで Docker Desktop for Windows のインストールは完了です。

動作確認

Docker のバージョンの確認をしてみる

まずは、インストールされた Docker のバージョンを確認してみましょう。
Windows PowerShell を起動して、docker version コマンドでバージョン情報が表示されます。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

> docker version
Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfc
 Built:             Thu Aug 29 05:26:49 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.2
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.8
  Git commit:       6a30dfc
  Built:            Thu Aug 29 05:32:21 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
>

Hello Worldを動かしてみる

では、早速、プログラマにはおなじみの hello world をやってみましょう。

docker run コマンドは、イメージからコンテナを起動するコマンドです。

> docker run hello-world

上記のコマンドの場合、hello-world というイメージからコンテナを作成して起動するという意味になります。ただし、ローカルに hello-world イメージがないため、Docker デーモンが hello-world イメージを Docker Hub(Docker社が運営する、インターネット上でイメージを公開・共有したりする Docker Registry サービス)からダウンロードし、イメージからコンテナを起動します。一般的には、イメージはファイルシステムとアプリケーションやミドルウェア、実行時に必要とするパラメータから構成されます。

このコンテナは次のような標準出力を出して終了します。

> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:451ce787d12369c5df2a32c85e5a03d52cbcef6eb3586dd03075f3034f10adcd
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

>

CentOS コンテナ (仮想環境) の構築

先ほどの hello-world の例で、コマンドラインでイメージの取得とコンテナの作成・起動・実行が簡単にできることがおわかりいただけたと思います。
では、本題の CentOS のイメージを取得し、CentOS のコンテナ (仮想環境) を作成・起動させてみましょう。

CentOS の イメージの取得

イメージを取得する

CentOS のコンテナのイメージも Docker Hub の CentOS のリポジトリの中で、CentOS のバージョンごとにタグ付けされて管理されています。

それでは CentOS7 の Docker イメージを取得しましょう。 Docker イメージの取得は docker pull コマンドを利用します。なお、すでに Docker ID を取得しログインしているので、この DokerHub サービスを利用することができます。

> docker pull centos:centos7
centos7: Pulling from library/centos
d8d02d457314: Pull complete
Digest: sha256:307835c385f656ec2e2fec602cf093224173c51119bbebd602c53c3653a3d6eb
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7

これで CentOS イメージのダウンロードが終わりました。環境に依存しますが数十秒で終了します。なお、pull コマンドの「centos:centos7」の意味は、centosリポジトリの、centos7タグが付いたイメージという意味です。これを理解すればいろいろなリポジトリからいろいろなイメージをダウンロードできるようになります。

取得した イメージを確認する

取得した Docker イメージは docker images コマンドで一覧表示できます。

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              centos7             67fa590cfc1c        2 weeks ago         202MB
hello-world         latest              fce289e99eb9        8 months ago        1.84kB

centos リポジトリの centos7 タグが付いたイメージが IMAGE ID 67fa590cfc1c で、そして Hello Worldを動かしてみる時に使用した hello-worldリポジトリのlatestタグが付いたイメージが IMAGE ID fce289e99eb9 で保管されていることを示しています。

CentOS コンテナ の作成・起動

コンテナ を作成・起動する

CentOS7 のイメージが取得できたら、さっそく CentOS コンテナを作成して起動してみましょう。

Docker イメージからコンテナを作成して起動するには docker run コマンドを利用します。次のように docker run コマンドを実行して、コンテナを作成・起動してみます。ここでは新しく作成するコンテナに "centos7f" という名前を付けています。CentOS7 のイメージから CentOS7 コンテナを作成し、同時にコンテナも起動し、そのタイミングで自動的にログインし、そのまま bash シェルに接続します。

> docker run -it --name="centos7f" centos:centos7 /bin/bash
#

このように、いきなり Centos コンテナ起動し、ログインした状態になります。このまま exit コマンドを実行すれば、このコンテナは停止します。

# exit
exit
>

起動または存在しているコンテナの確認をする

docker ps コマンドを実行してみてください。

docker ps コマンドは、コンテナリストを表示・取得するコマンドです。現在起動または存在しているコンテナをリストにしてくれます。オプションなしの場合は、現在起動中のコンテナを表示してくれます。

> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

今回は、停止された状態なので、現在起動中のコンテナはありません。

下記のように -a、--allオプションをつけた場合は、停止中のコンテナを含めたすべてのコンテナを表示してくれます。

> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
1851a1d32ae2        centos:centos7      "/bin/bash"         About a minute ago   Exited (0) 51 seconds ago                       centos7f
92d27e9b6d02        hello-world         "/hello"            6 minutes ago        Exited (0) 6 minutes ago                        laughing_lehmann

イメージの centos:centos7 からコンテナが"centos7f"という名前で作成・起動され、bin/shコマンドを実行し、現在は、停止した状態であることを示しています。

Centos コンテナ (仮想環境) の再開・接続

停止中のコンテナを再開する

停止したコンテナを docker start コマンドで再開できます。

"centos7f" を再開させます。

> docker start centos7f
centos7f

docker ps コマンドでコンテナ"centos7f"が確かに再開していることを確認しましょう。

> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
1851a1d32ae2        centos:centos7      "/bin/bash"         3 minutes ago       Up 15 seconds                                  centos7f

起動中のコンテナへ接続する

起動させたコンテナに接続して操作する場合は、docker attach コマンドまたは docker execコマンド を用います。

docker attach コマンドの場合は、次のようになります。

> docker attach centos7f
#

ただし docker attach コマンドでコンテナに接続後、exit コマンドで接続から抜けると、コンテナが停止してしまいます。 コンテナを稼動させたままにしたい場合は、Ctrl + P、Ctrl + Q を続けて押して抜ける必要があります。

ここでは、Ctrl + P、Ctrl + Q を続けて押して、コンテナを稼動させたまま抜けてみます。次のようなメッセージが出力されます。

# read escape sequence
>

ここで、docker ps コマンドでコンテナの状況を確認してみましょう。
CentOS コンテナ "centos7f" は稼働中です。

> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
1851a1d32ae2        centos:centos7      "/bin/bash"         6 minutes ago       Up 3 minutes                                    centos7f
92d27e9b6d02        hello-world         "/hello"            12 minutes ago      Exited (0) 12 minutes ago                       laughing_lehmann
>

この状態であれば、再度、CentOS コンテナ (centos7f) に接続することができます。

今度は、docker attach コマンドではなく docker exec コマンドも用いてコンテナに接続して操作してみましょう。ただし、動作に微妙な違いがあります。

> docker exec -it centos7f /bin/bash
#

docker attach コマンド と docker exec コマンドの動作の違いは次の通りです。

attach コマンド exec コマンド
稼働中のコンテナで起動している PID=1 のプロセスの標準入出力 (STDIN/STDOUT) に接続 (attach) する。 コンテナ内でシェルが動作していなければ接続することができない。
attachコマンドで抜けるとコンテナが停止してしまう exitコマンドで抜けるてもコンテナは停止しない

Centos コンテナ (仮想環境) の作成・起動 (バックグランド)

コンテナを作成しバックグラウンドで起動する

別の Windows PowerShell を起動します。
次のように docker run コマンドを -d で実行して、コンテナを作成しコマンドプロンプトの裏でバックグラウンド起動してみましょう。

ここでは新しく作成するコンテナに "centos7b" という名前をつけています。
centos7 イメージからコンテナを作成してバックグラウンドで起動します。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

> docker run -it -d --name="centos7b" centos:centos7 /bin/bash
3e6fc3e4e7cdc66d7e8b8d65c76f433564ff11b6c77ccef0bee6687898d84a99
>

CentOS コンテナ (仮想環境) の停止・削除

コンテナの削除をするには、まずは動ているコンテナを停止させてから削除することになります。

では、docker ps コマンドで動作しているコンテナを確認します。

> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
3e6fc3e4e7cd        centos:centos7      "/bin/bash"         About a minute ago   Up About a minute                       centos7b
1851a1d32ae2        centos:centos7      "/bin/bash"         10 minutes ago       Up 7 minutes                            centos7f

Ctrl + P、Ctrl + Q を続けて押して、稼動させたまま抜けたコンテナ "centos7f" と、先ほどバックグラウンドで起動したコンテナ "centos7b" を確認することができるはずです。

起動しているコンテナの停止する

では、docker stop コマンドで、動作しているコンテナを停止させます。

> docker stop centos7b centos7f
centos7b
centos7f

docker ps コマンドで、現在のコンテナの稼働状況を確認します。

先に述べた通り、-a、--allオプションをつけた場合は、停止中のコンテナを含めたすべてのコンテナを表示してくれます。

> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
3e6fc3e4e7cd        centos:centos7      "/bin/bash"         3 minutes ago       Exited (137) 12 seconds ago                       centos7b
1851a1d32ae2        centos:centos7      "/bin/bash"         12 minutes ago      Exited (137) 12 seconds ago                       centos7f
92d27e9b6d02        hello-world         "/hello"            18 minutes ago      Exited (0) 18 minutes ago                         laughing_lehmann

現在、存在しているコンテナは、"centos7b", "centos7f", "laughing_lehmann" の3つであることが確認できるでしょう。"laughing_lehmann" というコンテナの名前はイメージ hello-world からコンテナが作成・起動された時に一意的にたまたま決まったものです。なので、違う名前が表示されているかもしれません。

では、docker rm コマンドで、3つのコンテナを削除してみましょう。

コンテナ(仮想環境)を削除する

3つのコンテナを、docker rm コマンドを用いて一度に削除します。

> docker rm centos7b centos7f laughing_lehmann
centos7b
centos7f
laughing_lehmann

削除が完了しますと、削除対象のコンテナ名が出力されます。

> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

これで、コンテナがすべて削除されました。

イメージを削除する

Docker イメージの削除は、docker rmi コマンドを用います。

その前にdocker images コマンドで、取得したDockerイメージを一覧表示できます。

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              centos7             67fa590cfc1c        2 weeks ago         202MB
hello-world         latest              fce289e99eb9        8 months ago        1.84kB

docker rmi コマンドを用いて、取得したDockerイメージを削除してみます。

> docker rmi centos:centos7 hello-world:latest
Untagged: centos:centos7
Untagged: centos@sha256:307835c385f656ec2e2fec602cf093224173c51119bbebd602c53c3653a3d6eb
Deleted: sha256:67fa590cfc1c207c30b837528373f819f6262c884b7e69118d060a0c04d70ab8
Deleted: sha256:877b494a9f30e74e61b441ed84bb74b14e66fb9cc321d83f3a8a19c60d078654
Untagged: hello-world:latest
Untagged: hello-world@sha256:451ce787d12369c5df2a32c85e5a03d52cbcef6eb3586dd03075f3034f10adcd
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

これで、docker上からすべてのイメージが削除されました。

CentOS コンテナ (仮想環境)の整備

centos:centos7 のイメージは、最小構成 (?)でインストールされた CentOS7 環境であるようなので、実際に使用するには、構築した CentOS コンテナに個別に必要なもののインストールや環境の整備の作業をしなければなりません。
参考までにとりあえず、unzipコマンドを使えるようにする手順を紹介します。

まずは、Centos7 のコンテナやイメージなど削除してしまったので、復習をかねて、再度 Docker for Windows 上の CentOS コンテナ (仮想環境) を構築をします。

CentOS コンテナ (仮想環境) の構築 【復習】

CentOS の Docker イメージを取得

> docker pull centos:centos7
centos7: Pulling from library/centos
d8d02d457314: Pull complete
Digest: sha256:307835c385f656ec2e2fec602cf093224173c51119bbebd602c53c3653a3d6eb
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7
>
> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              centos7             67fa590cfc1c        2 weeks ago         202MB

CentOS コンテナの作成・起動

> docker run -it --name="my_centos" centos:centos7 /bin/bash
#

unzip コマンドのインストール

unzip コマンドを入力したら、次のような"コマンドが見つかりません"という旨のメッセージが出力されました。

# unzip
bash: unzip: command not found
#

まずは yum update コマンドで CentOS のパッケージを最新の状態にしておきます。

# yum update
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
base                                                                                                                      | 3.6 kB  00:00:00
extras                                                                                                                    | 3.4 kB  00:00:00
updates                                                                                                                   | 3.4 kB  00:00:00
(1/4): extras/7/x86_64/primary_db                                                                                         | 215 kB  00:00:00
(2/4): base/7/x86_64/group_gz                                                                                             | 166 kB  00:00:00
(3/4): base/7/x86_64/primary_db                                                                                           | 6.0 MB  00:00:03
(4/4): updates/7/x86_64/primary_db                                                                                        | 7.4 MB  00:00:04
No packages marked for update

yum update コマンドを実行した時、ネットワークなどの設定をしていないので、エラーが生じるかもしれません。エラーが生じた場合は、 /etc/yum.conf などの yum の設定ファイルに対して、修正・追記をしてください。

proxy 経由で yum を使わなければならない場合は、次のように yum.conf に proxy の設定を行います。

proxy サーバが yourProxy、proxy ポートが proxyPort の場合:

# cd
# pwd
/root
# echo "proxy=http://yourProxy:proxyPort/" >> /etc/yum.conf

yum install コマンドで、unzip をインストールします。

# yum install unzip
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
base                                                                                                   | 3.6 kB  00:00:00
extras                                                                                                 | 3.4 kB  00:00:00
updates                                                                                                | 3.4 kB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package unzip.x86_64 0:6.0-19.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================================
 Package                     Arch                         Version                            Repository                  Size
==============================================================================================================================
Installing:
 unzip                       x86_64                       6.0-19.el7                         base                       170 k

Transaction Summary
==============================================================================================================================
Install  1 Package

Total download size: 170 k
Installed size: 365 k
Is this ok [y/d/N]: y
Downloading packages:
unzip-6.0-19.el7.x86_64.rpm                                                                            | 170 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : unzip-6.0-19.el7.x86_64                                                                                    1/1
  Verifying  : unzip-6.0-19.el7.x86_64                                                                                    1/1

Installed:
  unzip.x86_64 0:6.0-19.el7

Complete!
#

これで unzip コマンドのインストールができました。

# unzip
UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.

Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
  Default action is to extract files in list, except those in xlist, to exdir;
  file[.zip] may be a wildcard.  -Z => ZipInfo mode ("unzip -Z" for usage).

  -p  extract files to pipe, no messages     -l  list files (short format)
  -f  freshen existing files, create none    -t  test compressed archive data
  -u  update files, create if necessary      -z  display archive comment only
  -v  list verbosely/show version info       -T  timestamp archive to latest
  -x  exclude files that follow (in xlist)   -d  extract files into exdir
modifiers:
  -n  never overwrite existing files         -q  quiet mode (-qq => quieter)
  -o  overwrite files WITHOUT prompting      -a  auto-convert any text files
  -j  junk paths (do not make directories)   -aa treat ALL files as text
  -U  use escapes for all non-ASCII Unicode  -UU ignore any Unicode fields
  -C  match filenames case-insensitively     -L  make (some) names lowercase
  -X  restore UID/GID info                   -V  retain VMS version numbers
  -K  keep setuid/setgid/tacky permissions   -M  pipe through "more" pager
  -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
  -I CHARSET  specify a character encoding for UNIX and other archives

See "unzip -hh" or unzip.txt for more help.  Examples:
  unzip data1 -x joe   => extract all files except joe from zipfile data1.zip
  unzip -p foo | more  => send contents of foo.zip via pipe into program more
  unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer
  #

zip コマンドをインストールした CentOS のコンテナの"my_centos" を停止して抜けます。

# exit
exit
>

作業済み CentOS コンテナ (仮想環境)の保存

今回、CentOS コンテナ (仮想環境)に対して unzip コマンドをインストールをしました。

このように設定や更新などのカスタマイズ作業をおこなったコンテナの状態をイメージとして保存しておくことができます。
では、今回のカスタマイズ作業をおこなった CentOS コンテナ からイメージを作って保存をしてみます。

保存するコンテナを停止する

まず、 オプションなしで、現在起動中のコンテナを確認します。

> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
>

今回は、unzip コマンドのインストールしたCentOS のコンテナの"my_centos" は、停止状態のはずなので、現在起動中のコンテナはありません。

コンテナが動いている状態でコンテナに接続されていない場合は docker stop コマンドで停止させることができます。

次に -a オプションをつけて、停止中のコンテナを含めたすべてのコンテナを表示します。

> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
64165a4c0389        centos:centos7      "/bin/bash"         10 minutes ago      Exited (130) 11 seconds ago                       my_centos

unzip コマンドのインストールなどの作業が行われ、現在停止した状態である CentOS コンテナの"my_centos"が表示されます。

停止したコンテナをイメージに保存する

docker images コマンドで、作成されているイメージを確認します。

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              centos7             67fa590cfc1c        2 weeks ago         202MB
>

カスタマイズ作業をおこなった CentOS コンテナの"my_centos"を docker commit コマンドで、Docker イメージ "my_centos" として保存します。

> docker commit my_centos my_centos
sha256:c0089e3a6273524612a8b2541ef7da11826ad0160eddc0870c8c10cb259b4728

なお、一時停止せず、コンテナが動いたままの状態でDockerイメージを作成する場合は「--pause=false」オプションを使用します。

docdocker imagesコマンドにて、Dockerイメージが作成されているか確認します

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_centos           latest              c0089e3a6273        10 seconds ago      314MB
centos              centos7             67fa590cfc1c        2 weeks ago         202MB

新たに Dokcer イメージ "my_centos" が追加されたことがわかります。

ここで起動している コンテナと同じ名前で上書き保存すると、いわゆるゴミイメージができます。これはただ容量をとるだけなので、消してしまいましょう。

> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_centos           latest              bd2a76ceefe9        4 minutes ago       314MB
centos              centos7             67fa590cfc1c        3 weeks ago         202MB
> docker commit my_centos my_centos
sha256:e36541933d51550f523b6a4d0029274e50ebeb2b6436c67d6f0de1aa4debaa11
> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_centos           latest              e36541933d51        4 seconds ago       314MB
<none>              <none>              bd2a76ceefe9        5 minutes ago       314MB
centos              centos7             67fa590cfc1c        3 weeks ago         202MB
> docker commit my_centos my_centos
sha256:baee164703079e92214bda5ae451b9b83cffbf44e2a3e5086c18fe0e6ec6a107
> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_centos           latest              baee16470307        6 seconds ago       314MB
<none>              <none>              e36541933d51        58 seconds ago      314MB
<none>              <none>              bd2a76ceefe9        5 minutes ago       314MB
centos              centos7             67fa590cfc1c        3 weeks ago         202MB
> docker rmi e36541933d51 bd2a76ceefe9
Deleted: sha256:e36541933d51550f523b6a4d0029274e50ebeb2b6436c67d6f0de1aa4debaa11
Deleted: sha256:bd2a76ceefe9f40e2fe42df623c00c0858f9d7f349d2c2389410fede89e0c515
> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_centos           latest              baee16470307        46 seconds ago      314MB
centos              centos7             67fa590cfc1c        3 weeks ago         202MB

作成されたイメージの内容を確認する

先ほど作業した内容がちゃんと反映されている イメージなのか、確認してみましょう。

docker rm コマンドで、コンテナ "my_centos" を削除します。

> docker rm my_centos
my_centos
> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

これで、すべてのコンテナがなくなりました。

では、docker run コマンドで、イメージ "my_centos" からコンテナ "my_centos" を作成・起動してみます。

> docker run -it --name="my_centos" my_centos /bin/bash
#

unzip コマンドを実行してみます。

# unzip
UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.

Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
  Default action is to extract files in list, except those in xlist, to exdir;
  file[.zip] may be a wildcard.  -Z => ZipInfo mode ("unzip -Z" for usage).

  -p  extract files to pipe, no messages     -l  list files (short format)
  -f  freshen existing files, create none    -t  test compressed archive data
  -u  update files, create if necessary      -z  display archive comment only
  -v  list verbosely/show version info       -T  timestamp archive to latest
  -x  exclude files that follow (in xlist)   -d  extract files into exdir
modifiers:
  -n  never overwrite existing files         -q  quiet mode (-qq => quieter)
  -o  overwrite files WITHOUT prompting      -a  auto-convert any text files
  -j  junk paths (do not make directories)   -aa treat ALL files as text
  -U  use escapes for all non-ASCII Unicode  -UU ignore any Unicode fields
  -C  match filenames case-insensitively     -L  make (some) names lowercase
  -X  restore UID/GID info                   -V  retain VMS version numbers
  -K  keep setuid/setgid/tacky permissions   -M  pipe through "more" pager
  -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
  -I CHARSET  specify a character encoding for UNIX and other archives

See "unzip -hh" or unzip.txt for more help.  Examples:
  unzip data1 -x joe   => extract all files except joe from zipfile data1.zip
  unzip -p foo | more  => send contents of foo.zip via pipe into program more
  unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer
#

さいごに

今回、Windows 10 のノートPCに Doker Desktop for Windows をインストールし、CentOS の仮想環境を構築・設定・保存の一連の手順を詳細に記述したつもりです。
もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。

gahoh
このサイトの掲載内容は私個人の見解であり、必ずしも私が所属する会社、組織、団体の立場、戦略、意見を代表するものではありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした