注目キーワード

[技術整理] DockerをWindows環境にインストール+基本動作確認

file

概要

Windows環境にDockerをインストールし、基本動作を確認するまでの手順を整理する。

今回、Docker Desktop for windows をインストールする。

インストール手順

Hyper-V を有効化

Docker desktop for windows は、Windowsの仮想化の機構 Hyper-V を使用する。

Hyper-V を有効化する手順は次の通りである。

  1. コントロールパネルのプログラムと機能を開く
    file
  2. Windowsの機能の有効化または無効化 を選ぶ。
    file
  3. Hyper-V にチェックを入れる
    file
  4. OK を押すと、設定処理の進捗が表示されたのち完了画面に遷移する。

     
    完了画面では、再起動を促される。

画面の指示に従って、Windowsを再起動する。

Docker Desktop for windows をインストールする

Docker公式サイトから、Docker for Windows のインストーラーを入手する。

「Download for Windows」という青いボタンをクリックすると、インストーラーのダウンロードが始まる。

インストーラーのファイルサイズは、約510MB だった(2021/08/31時点)

インストーラーの起動

インストーラーを起動すると次のような画面が表示される。
画面に Install required Windows components for WSL 2 とあるが、これはDocker上でWindowsを動かすためのものである。
今回は、CentOS 環境の構築をしたいので、チェックを外しておく。
file

file

インストール処理

インストール処理のログが流れてゆく。
file

しばらくするとインストール処理が完了する。
インストールを完了するには、Windowsを一度ログアウトする必要があると画面に表示されている。
file

Docker Desktop の起動

再起動すると、Dockerが起動し、次のようなダイアログが立ち上がった。

file

WSL 2 is not installed
ここで Use Hyper-V を選択してみる。
すると、チュートリアルへの案内のメッセージが表示された。
file

チュートリアルを体験してみよう。

Docker Desktop チュートリアル

チュートリアルを始めたところ、そのウィンドウの右側にWindows PowerShellが開いていることが分かる。
file

docker コマンドをシェルで実行するようにというので、実行したところ、チュートリアル用のDockerイメージをリポジトリからダウンロードしてきたようだ。
file

続いて、Dockerイメージのビルド処理を行うように指示される。
実行するコマンドは次の通り。

cd getting-started
docker build -t docker101tutorial .

コマンドを実行すると、シェル上でビルド処理が進行している様子がうかがえる。
file

続いて、コンテナの起動を指示される。
以下のコマンドを実行せよという。

  docker run -d -p 80:80 \
  --name docker-tutorial docker101tutorial

すると、Dockerイメージを保存して、Docker Hub にアップロードせよとのこと。
チュートリアルは一旦この辺で終わりにしておこう。
file

Docker 試運転

Windows PowerShell を起動し、Dockerのインストール状態を確認する。

> docker version
Client:
 Cloud integration: 1.0.17
 Version:           20.10.8
 API version:       1.41
 Go version:        go1.16.6
 Git commit:        3967b7d
 Built:             Fri Jul 30 19:58:50 2021
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.8
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.6
  Git commit:       75249d8
  Built:            Fri Jul 30 19:52:10 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.9
  GitCommit:        e25210fe30a0a703442421b0f60afac609f950a3
 runc:
  Version:          1.0.1
  GitCommit:        v1.0.1-0-g4144b63
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

便利メモ:PowerShell で CTRL+C/V を有効にする

シェルの出力を簡単にコピペできるように CTRL + C/CTRL + V を有効化しておこう。
また、行の折り返しも考慮してバッファにコピーできるように、行の折り返し選択を有効にする も忘れずにチェックしておこう。
file

Docker版 Hellow world を動かす

Docker Hub に登録されている hello-world というイメージをダウンロードして、それをビルド&実行してみる。

> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
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/

コンテナの一覧を確認する。
確かに、hello-world というイメージがダウンロードされ、コンテナが構築されたことが分かる。

> docker ps --all
CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS                         PORTS     NAMES
8704bb047c87   hello-world   "/hello"                 3 minutes ago       Exited (0) 3 minutes ago                 angry_gauss
b3f77379ed6a   alpine/git    "git clone https://g…"   About an hour ago   Exited (0) About an hour ago             repo

CentOS のコンテナ構築

(1) CentOS のコンテナイメージを取得する

Dockerイメージは、docker pull コマンドで取得することができる。
今回、centos リポジトリの centos7 タグが付与されたイメージを取得するので、引数は centos:centos7 としている。

> docker pull centos:centos7
centos7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7

docker images を使い、centos が取得できていることを確認する。

> docker images
REPOSITORY          TAG       IMAGE ID       CREATED        SIZE
docker101tutorial   latest    c5ee10044f54   3 hours ago    28.2MB
alpine/git          latest    b8f176fa3f0d   3 months ago   25.1MB
hello-world         latest    d1165f221234   6 months ago   13.3kB
centos              centos7   8652b9f0cb4c   9 months ago   204MB

(2) CentOS コンテナを起動する

docker run コマンドを使い取得したDockerイメージから、CentOSのコンテナを作成する。

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

すると次のようにCentOSのコンテナが起動し、Rootユーザーでシェルにログインした状態になる。

> docker run -it --name="centos7_1st" centos:centos7 /bin/bash
[root@c1aad13a8e5c /]# pwd
/
[root@c1aad13a8e5c /]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
overlay         65792556 2548080  59872700   5% /
tmpfs              65536       0     65536   0% /dev
tmpfs            1016332       0   1016332   0% /sys/fs/cgroup
shm                65536       0     65536   0% /dev/shm
/dev/sda1       65792556 2548080  59872700   5% /etc/hosts
tmpfs            1016332       0   1016332   0% /proc/acpi
tmpfs            1016332       0   1016332   0% /sys/firmware

PowerShell のウィンドウをもう一つ立ち上げて、コンテナの一覧を確認した。
centos:centos7 のコンテナが起動していることが分かる。(STATUSが Exited(0) ではなく、Up となっている)

> docker ps --all
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS                   PORTS     NAMES
c1aad13a8e5c   centos:centos7   "/bin/bash"              16 minutes ago   Up 16 minutes                      centos7_1st
8704bb047c87   hello-world      "/hello"                 2 hours ago      Exited (0) 2 hours ago             angry_gauss
b3f77379ed6a   alpine/git       "git clone https://g…"   4 hours ago      Exited (0) 4 hours ago             repo

(3) CentOS コンテナを停止する

起動中のCentOSコンテナに接続しているシェル(Bash)で exit を実行すると、シェルが閉じて、コンテナも停止する。

# exit
exit

先ほどまで起動していたCentOSのコンテナが停止していることが分かる。
STATUS が Exited(0) になっている。

> docker ps --all
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS                          PORTS     NAMES
c1aad13a8e5c   centos:centos7   "/bin/bash"              20 minutes ago   Exited (0) About a minute ago             centos7_1st
8704bb047c87   hello-world      "/hello"                 2 hours ago      Exited (0) 2 hours ago                    angry_gauss
b3f77379ed6a   alpine/git       "git clone https://g…"   4 hours ago      Exited (0) 4 hours ago                    repo

(4) CentOS コンテナの再起動

停止しているCentOSコンテナ(NAME="centos7_1st")を docker startコマンドで再起動する。

> docker start centos7_1st
centos7_1st

docker ps --all でコンテナの状態を調べると、CentOSコンテナが起動していることが確認できる。

> docker ps --all
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS                   PORTS     NAMES
c1aad13a8e5c   centos:centos7   "/bin/bash"              25 minutes ago   Up 23 seconds                      centos7_1st
8704bb047c87   hello-world      "/hello"                 2 hours ago      Exited (0) 2 hours ago             angry_gauss
b3f77379ed6a   alpine/git       "git clone https://g…"   4 hours ago      Exited (0) 4 hours ago             repo

(5) 再起動したコンテナに接続する

コンテナに接続する方法には docker attatchdocker exec がある。

docker attatch で接続する場合

> docker attach centos7_1st
[root@c1aad13a8e5c /]# pwd
/
[root@c1aad13a8e5c /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          63G  2.5G   58G   5% /
tmpfs            64M     0   64M   0% /dev
tmpfs           993M     0  993M   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda1        63G  2.5G   58G   5% /etc/hosts
tmpfs           993M     0  993M   0% /proc/acpi
tmpfs           993M     0  993M   0% /sys/firmware

exit でコンテナの接続を切ると、そのままコンテナが停止してしまう点に注意。
コンテナを動かしたままあシェルを抜ける場合は、 CTRL + PCTRL + Q で抜ける。

# CTRL + P --> CTRL + Q を入力
[root@c1aad13a8e5c /]# read escape sequence
>

read escape sequence と表示されているのが分かる。
コンテナの稼働状況を見ると、無事動いているのが確認できる。

> docker ps --all
CONTAINER ID   IMAGE            COMMAND                  CREATED        STATUS                    PORTS     NAMES
c1aad13a8e5c   centos:centos7   "/bin/bash"              7 hours ago    Up 7 hours                          centos7_1st
8704bb047c87   hello-world      "/hello"                 9 hours ago    Exited (0) 9 hours ago              angry_gauss
b3f77379ed6a   alpine/git       "git clone https://g…"   11 hours ago   Exited (0) 11 hours ago             repo

docker exec で接続する場合

> docker exec -it centos7_1st /bin/bash
[root@c1aad13a8e5c /]# pwd
/
[root@c1aad13a8e5c /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          63G  2.5G   58G   5% /
tmpfs            64M     0   64M   0% /dev
tmpfs           993M     0  993M   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda1        63G  2.5G   58G   5% /etc/hosts
tmpfs           993M     0  993M   0% /proc/acpi
tmpfs           993M     0  993M   0% /sys/firmware

docker exec で接続した場合、exit でシェルを抜けても、コンテナは停止しない。

[root@c1aad13a8e5c /]# exit
exit
> docker ps --all
CONTAINER ID   IMAGE            COMMAND                  CREATED        STATUS                    PORTS     NAMES
c1aad13a8e5c   centos:centos7   "/bin/bash"              8 hours ago    Up 7 hours                          centos7_1st
8704bb047c87   hello-world      "/hello"                 9 hours ago    Exited (0) 9 hours ago              angry_gauss
b3f77379ed6a   alpine/git       "git clone https://g…"   11 hours ago   Exited (0) 11 hours ago             repo

ただし、docker exec で接続する場合、接続するコンテナでシェルが動いていなければならない。

(6) コンテナのバックグランド起動

コンテナをバックグラウンド起動させるには docker run コマンドに -d オプションを指定する。
以下のコマンドを例として実行してみる。

> docker run -it -d --name="centos7_background" centos:centos7 /bin/bash
11131abade262c1224287a7f2f651cea4fec78a2ddbdecf07345139f11fa0979

すると、新しく起動したコンテナのコンテナIDがシェルに出力される。

起動中のコンテナ一覧を見ると、バックグランド起動した centos7_background の存在を確認することができる。

> docker ps --all
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS                    PORTS     NAMES
11131abade26   centos:centos7   "/bin/bash"              19 seconds ago   Up 18 seconds                       centos7_background
c1aad13a8e5c   centos:centos7   "/bin/bash"              23 hours ago     Up 22 hours                         centos7_1st
8704bb047c87   hello-world      "/hello"                 24 hours ago     Exited (0) 24 hours ago             angry_gauss
b3f77379ed6a   alpine/git       "git clone https://g…"   26 hours ago     Exited (0) 26 hours ago             repo

バックグランド起動したコンテナに接続する

docker exec で接続する

まず docker exec でコンテナに接続する。

> docker exec -it centos7_background /bin/bash
[root@11131abade26 /]# pwd
/
[root@11131abade26 /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          63G  2.5G   58G   5% /
tmpfs            64M     0   64M   0% /dev
tmpfs           993M     0  993M   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda1        63G  2.5G   58G   5% /etc/hosts
tmpfs           993M     0  993M   0% /proc/acpi
tmpfs           993M     0  993M   0% /sys/firmware

コンテナへの接続を確認できたので、exit でシェルを抜けてみる。

# コンテナのシェルから抜ける
[root@11131abade26 /]# exit
exit
>

コンテナの一覧を見ると、centos7_backgounrd がバックグランド起動している(=停止していない)ことを確認できた。

> docker ps --all
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS                    PORTS     NAMES
11131abade26   centos:centos7   "/bin/bash"              4 minutes ago   Up 4 minutes                        centos7_background
c1aad13a8e5c   centos:centos7   "/bin/bash"              23 hours ago    Up 22 hours                         centos7_1st
8704bb047c87   hello-world      "/hello"                 25 hours ago    Exited (0) 25 hours ago             angry_gauss
b3f77379ed6a   alpine/git       "git clone https://g…"   26 hours ago    Exited (0) 26 hours ago             repo
docker attach で接続する

続いて、docker attach で接続を試みる。
バックグランド起動であれば、exit でシェルを抜けてもコンテナは停止せず、稼働したままのはずである。

> docker attach centos7_background
[root@11131abade26 /]# pwd
/
[root@11131abade26 /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          63G  2.5G   58G   5% /
tmpfs            64M     0   64M   0% /dev
tmpfs           993M     0  993M   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda1        63G  2.5G   58G   5% /etc/hosts
tmpfs           993M     0  993M   0% /proc/acpi
tmpfs           993M     0  993M   0% /sys/firmware

続いて、exit でコンテナとの接続を終了してみる。

[root@11131abade26 /]# exit
exit

バックグラウンド起動していたコンテナだったが、停止していた。

> docker ps --all
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS                      PORTS     NAMES
11131abade26   centos:centos7   "/bin/bash"              11 minutes ago   Exited (0) 18 seconds ago             centos7_background
c1aad13a8e5c   centos:centos7   "/bin/bash"              23 hours ago     Up 22 hours                           centos7_1st
8704bb047c87   hello-world      "/hello"                 25 hours ago     Exited (0) 25 hours ago               angry_gauss
b3f77379ed6a   alpine/git       "git clone https://g…"   26 hours ago     Exited (0) 26 hours ago               repo

書式を指定して docker ps コマンドを実行する

コンテナの状態を一覧する docker ps コマンドであるが、書式を指定して表示することができる。

# 例
> docker ps --format "table {{.Image}}\t{{.Names}}" --all
IMAGE            NAMES
centos:centos7   centos7_background
centos:centos7   centos7_1st
hello-world      angry_gauss
alpine/git       repo

{{.プロパティ名}} の形式で、出力したいコンテナのプロパティを指定することができる。

# 例2
> docker ps --all --format "table {{.Image}}\t{{.Names}}\t{{.CreatedAt}}\t{{.Status}}"
IMAGE            NAMES                CREATED AT                      STATUS
centos:centos7   centos7_background   2021-09-05 19:01:31 +0900 JST   Exited (0) 19 minutes ago
centos:centos7   centos7_1st          2021-09-04 20:27:59 +0900 JST   Up 23 hours
hello-world      angry_gauss          2021-09-04 18:31:54 +0900 JST   Exited (0) 25 hours ago
alpine/git       repo                 2021-09-04 17:13:05 +0900 JST   Exited (0) 26 hours ago

指定できるプロパティの一覧は、以下の公式サイト文書で確認することができる。

Docker Documentation

docker ps: List containers…

Docker Desktop が起動しない場合の対処法

Hyper-V を初期化できず、Docker Desktopの起動が失敗することがある。
例えば、他に Hyper-V を利用するアプリケーションが先に起動していた場合である。

  • 例:WSL版のUbuntuが起動していた、などの場合

この時、サービス管理ツールを起動し、Hyper-V に関するサービスを再起動すると良いだろう。
以下のスクリーンショットで枠線で囲んだサービスを参照。
file

  • HV ホスト サービス
  • Hyper-V Virtual Machine Management
  • Hyper-V ホスト コンピューティング サービス

環境をカスタマイズ&Docker イメージを保存する

標準的なDocker イメージを元に構築したコンテナで、環境をカスタマイズして(各種パッケージのインストールや設定など)、カスタマイズした環境をDocker イメージとして保存するとしたい。
Docker イメージを保存すれば、複雑で面倒なインストール作業を伴う環境も、コマンド一つで復元できるようになるだろう。
まず、先ほど立ち上げた、CentOSのコンテナで環境のカスタマイズを行う。

# コンテナを起動
> docker start centos7_1st
centos7_1st

# コンテナに接続
> docker attach centos7_1st
[root@c1aad13a8e5c /]#

コンテナの環境のカスタマイズ

まず、各パッケージを最新の状態にする。

[root@c1aad13a8e5c /]# yum update
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.cat.net
 * extras: mirrors.cat.net
 * updates: mirrors.cat.net
base                                                                                             | 3.6 kB  00:00:00
extras                                                                                           | 2.9 kB  00:00:00
updates                                                                                          | 2.9 kB  00:00:00
(1/4): base/7/x86_64/group_gz                                                                    | 153 kB  00:00:00
(2/4): extras/7/x86_64/primary_db                                                                | 243 kB  00:00:00
(3/4): base/7/x86_64/primary_db                                                                  | 6.1 MB  00:00:01
(4/4): updates/7/x86_64/primary_db                                                               |  11 MB  00:00:02
Resolving Dependencies
--> Running transaction check
---> Package bind-license.noarch 32:9.11.4-26.P2.el7 will be updated
---> Package bind-license.noarch 32:9.11.4-26.P2.el7_9.7 will be an update

(・・・中略・・・)

---> Package zlib.x86_64 0:1.2.7-18.el7 will be updated
---> Package zlib.x86_64 0:1.2.7-19.el7_9 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================
 Package                         Arch                Version                                 Repository            Size
========================================================================================================================
Updating:
 bind-license                    noarch              32:9.11.4-26.P2.el7_9.7                 updates               91 k
 centos-release                  x86_64              7-9.2009.1.el7.centos                   updates               27 k
 coreutils                       x86_64              8.22-24.el7_9.2                         updates              3.3 M
 curl                            x86_64              7.29.0-59.el7_9.1                       updates              271 k
 device-mapper                   x86_64              7:1.02.170-6.el7_9.5                    updates              297 k
 device-mapper-libs              x86_64              7:1.02.170-6.el7_9.5                    updates              325 k
 glib2                           x86_64              2.56.1-9.el7_9                          updates              2.5 M
 glibc                           x86_64              2.17-324.el7_9                          updates              3.6 M
 glibc-common                    x86_64              2.17-324.el7_9                          updates               12 M
 kpartx                          x86_64              0.4.9-135.el7_9                         updates               81 k
 libblkid                        x86_64              2.23.2-65.el7_9.1                       updates              183 k
 libcurl                         x86_64              7.29.0-59.el7_9.1                       updates              223 k
 libmount                        x86_64              2.23.2-65.el7_9.1                       updates              185 k
 libsmartcols                    x86_64              2.23.2-65.el7_9.1                       updates              143 k
 libuuid                         x86_64              2.23.2-65.el7_9.1                       updates               84 k
 nss                             x86_64              3.53.1-7.el7_9                          updates              869 k
 nss-sysinit                     x86_64              3.53.1-7.el7_9                          updates               66 k
 nss-tools                       x86_64              3.53.1-7.el7_9                          updates              535 k
 openldap                        x86_64              2.4.44-24.el7_9                         updates              356 k
 openssl-libs                    x86_64              1:1.0.2k-21.el7_9                       updates              1.2 M
 python                          x86_64              2.7.5-90.el7                            updates               96 k
 python-libs                     x86_64              2.7.5-90.el7                            updates              5.6 M
 systemd                         x86_64              219-78.el7_9.3                          updates              5.1 M
 systemd-libs                    x86_64              219-78.el7_9.3                          updates              418 k
 tzdata                          noarch              2021a-1.el7                             updates              501 k
 util-linux                      x86_64              2.23.2-65.el7_9.1                       updates              2.0 M
 vim-minimal                     x86_64              2:7.4.629-8.el7_9                       updates              443 k
 zlib                            x86_64              1.2.7-19.el7_9                          updates               90 k

Transaction Summary
========================================================================================================================
Upgrade  28 Packages

Total download size: 40 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
warning: /var/cache/yum/x86_64/7/updates/packages/centos-release-7-9.2009.1.el7.centos.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for centos-release-7-9.2009.1.el7.centos.x86_64.rpm is not installed
(1/28): centos-release-7-9.2009.1.el7.centos.x86_64.rpm                                          |  27 kB  00:00:00
(2/28): bind-license-9.11.4-26.P2.el7_9.7.noarch.rpm                                             |  91 kB  00:00:00
(3/28): curl-7.29.0-59.el7_9.1.x86_64.rpm                                                        | 271 kB  00:00:00

(・・・中略・・・)

(27/28): glibc-common-2.17-324.el7_9.x86_64.rpm                                                  |  12 MB  00:00:02
(28/28): zlib-1.2.7-19.el7_9.x86_64.rpm                                                          |  90 kB  00:00:00
------------------------------------------------------------------------------------------------------------------------
Total                                                                                    14 MB/s |  40 MB  00:00:02
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-9.2009.0.el7.centos.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Is this ok [y/N]: y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : tzdata-2021a-1.el7.noarch                                                                           1/56
  Updating   : glibc-2.17-324.el7_9.x86_64                                                                         2/56

  (・・・中略・・・)

  Cleanup    : glibc-common-2.17-317.el7.x86_64                                                                   54/56
  Cleanup    : glibc-2.17-317.el7.x86_64                                                                          55/56
  Cleanup    : tzdata-2020d-2.el7.noarch                                                                          56/56
  Verifying  : python-2.7.5-90.el7.x86_64                                                                          1/56
  Verifying  : systemd-libs-219-78.el7_9.3.x86_64                                                                  2/56

(・・・中略・・・)

  Verifying  : libsmartcols-2.23.2-65.el7.x86_64                                                                  54/56
  Verifying  : libmount-2.23.2-65.el7.x86_64                                                                      55/56
  Verifying  : 32:bind-license-9.11.4-26.P2.el7.noarch                                                            56/56

Updated:
  bind-license.noarch 32:9.11.4-26.P2.el7_9.7               centos-release.x86_64 0:7-9.2009.1.el7.centos
  coreutils.x86_64 0:8.22-24.el7_9.2                        curl.x86_64 0:7.29.0-59.el7_9.1
  device-mapper.x86_64 7:1.02.170-6.el7_9.5                 device-mapper-libs.x86_64 7:1.02.170-6.el7_9.5
  glib2.x86_64 0:2.56.1-9.el7_9                             glibc.x86_64 0:2.17-324.el7_9
  glibc-common.x86_64 0:2.17-324.el7_9                      kpartx.x86_64 0:0.4.9-135.el7_9
  libblkid.x86_64 0:2.23.2-65.el7_9.1                       libcurl.x86_64 0:7.29.0-59.el7_9.1
  libmount.x86_64 0:2.23.2-65.el7_9.1                       libsmartcols.x86_64 0:2.23.2-65.el7_9.1
  libuuid.x86_64 0:2.23.2-65.el7_9.1                        nss.x86_64 0:3.53.1-7.el7_9
  nss-sysinit.x86_64 0:3.53.1-7.el7_9                       nss-tools.x86_64 0:3.53.1-7.el7_9
  openldap.x86_64 0:2.4.44-24.el7_9                         openssl-libs.x86_64 1:1.0.2k-21.el7_9
  python.x86_64 0:2.7.5-90.el7                              python-libs.x86_64 0:2.7.5-90.el7
  systemd.x86_64 0:219-78.el7_9.3                           systemd-libs.x86_64 0:219-78.el7_9.3
  tzdata.noarch 0:2021a-1.el7                               util-linux.x86_64 0:2.23.2-65.el7_9.1
  vim-minimal.x86_64 2:7.4.629-8.el7_9                      zlib.x86_64 0:1.2.7-19.el7_9

Complete!

パッケージをいくつか導入する。

sudo の導入

[root@c1aad13a8e5c /]# yum install sudo
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.cat.net
 * extras: mirrors.cat.net
 * updates: mirrors.cat.net
Resolving Dependencies
--> Running transaction check
---> Package sudo.x86_64 0:1.8.23-10.el7_9.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================
 Package                Arch                     Version                                Repository                 Size
========================================================================================================================
Installing:
 sudo                   x86_64                   1.8.23-10.el7_9.1                      updates                   843 k

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

Total download size: 843 k
Installed size: 3.0 M
Is this ok [y/d/N]: y
Downloading packages:
sudo-1.8.23-10.el7_9.1.x86_64.rpm                                                                | 843 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : sudo-1.8.23-10.el7_9.1.x86_64                                                                        1/1
  Verifying  : sudo-1.8.23-10.el7_9.1.x86_64                                                                        1/1

Installed:
  sudo.x86_64 0:1.8.23-10.el7_9.1

Complete!

wget の導入

[root@c1aad13a8e5c /]# yum install wget

(・・・中略・・・)

Installed:
  wget.x86_64 0:1.14-18.el7_6.1
yu
Complete!

zip & unzip の導入

[root@c1aad13a8e5c /]# yum install zip unzip

(・・・中略・・・)

Installed:
  unzip.x86_64 0:6.0-22.el7_9                                  zip.x86_64 0:3.0-11.el7

Complete!

MariaDB(MySQL) の導入

[root@c1aad13a8e5c /]# yum install mariadb mariadb-devel mariadb-libs

(・・・中略・・・)

---> Package perl-HTTP-Tiny.noarch 0:0.033-3.el7 will be installed
---> Package perl-parent.noarch 1:0.225-244.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================
 Package                              Arch                 Version                          Repository             Size
========================================================================================================================
Installing:
 mariadb                              x86_64               1:5.5.68-1.el7                   base                  8.8 M
 mariadb-devel                        x86_64               1:5.5.68-1.el7                   base                  757 k
 mariadb-libs                         x86_64               1:5.5.68-1.el7                   base                  760 k
Installing for dependencies:
 groff-base                           x86_64               1.22.2-8.el7                     base                  942 k
 keyutils-libs-devel                  x86_64               1.5.8-3.el7                      base                   37 k
 krb5-devel                           x86_64               1.15.1-50.el7                    base                  273 k
 libcom_err-devel                     x86_64               1.42.9-19.el7                    base                   32 k
 libkadm5                             x86_64               1.15.1-50.el7                    base                  179 k
 libselinux-devel                     x86_64               2.5-15.el7                       base                  187 k
 libsepol-devel                       x86_64               2.5-10.el7                       base                   77 k
 libverto-devel                       x86_64               0.2.5-4.el7                      base                   12 k
 openssl-devel                        x86_64               1:1.0.2k-21.el7_9                updates               1.5 M
 pcre-devel                           x86_64               8.32-17.el7                      base                  480 k
 perl                                 x86_64               4:5.16.3-299.el7_9               updates               8.0 M
 perl-Carp                            noarch               1.26-244.el7                     base                   19 k
 perl-Encode                          x86_64               2.51-7.el7                       base                  1.5 M
 perl-Exporter                        noarch               5.68-3.el7                       base                   28 k
 perl-File-Path                       noarch               2.09-2.el7                       base                   26 k
 perl-File-Temp                       noarch               0.23.01-3.el7                    base                   56 k
 perl-Filter                          x86_64               1.49-3.el7                       base                   76 k
 perl-Getopt-Long                     noarch               2.40-3.el7                       base                   56 k
 perl-HTTP-Tiny                       noarch               0.033-3.el7                      base                   38 k
 perl-PathTools                       x86_64               3.40-5.el7                       base                   82 k
 perl-Pod-Escapes                     noarch               1:1.04-299.el7_9                 updates                52 k
 perl-Pod-Perldoc                     noarch               3.20-4.el7                       base                   87 k
 perl-Pod-Simple                      noarch               1:3.28-4.el7                     base                  216 k
 perl-Pod-Usage                       noarch               1.63-3.el7                       base                   27 k
 perl-Scalar-List-Utils               x86_64               1.27-248.el7                     base                   36 k
 perl-Socket                          x86_64               2.010-5.el7                      base                   49 k
 perl-Storable                        x86_64               2.45-3.el7                       base                   77 k
 perl-Text-ParseWords                 noarch               3.29-4.el7                       base                   14 k
 perl-Time-HiRes                      x86_64               4:1.9725-3.el7                   base                   45 k
 perl-Time-Local                      noarch               1.2300-2.el7                     base                   24 k
 perl-constant                        noarch               1.27-2.el7                       base                   19 k
 perl-libs                            x86_64               4:5.16.3-299.el7_9               updates               690 k
 perl-macros                          x86_64               4:5.16.3-299.el7_9               updates                44 k
 perl-parent                          noarch               1:0.225-244.el7                  base                   12 k
 perl-podlators                       noarch               2.5.1-3.el7                      base                  112 k
 perl-threads                         x86_64               1.87-4.el7                       base                   49 k
 perl-threads-shared                  x86_64               1.43-6.el7                       base                   39 k
 zlib-devel                           x86_64               1.2.7-19.el7_9                   updates                50 k

Transaction Summary
========================================================================================================================
Install  3 Packages (+38 Dependent packages)

Total download size: 25 M
Installed size: 102 M
Is this ok [y/d/N]: y
Downloading packages:
(1/41): keyutils-libs-devel-1.5.8-3.el7.x86_64.rpm                                               |  37 kB  00:00:00
(2/41): libcom_err-devel-1.42.9-19.el7.x86_64.rpm                                                |  32 kB  00:00:00
(3/41): krb5-devel-1.15.1-50.el7.x86_64.rpm                                                      | 273 kB  00:00:00

(・・・中略・・・)

Installed:
  mariadb.x86_64 1:5.5.68-1.el7       mariadb-devel.x86_64 1:5.5.68-1.el7       mariadb-libs.x86_64 1:5.5.68-1.el7

Dependency Installed:
  groff-base.x86_64 0:1.22.2-8.el7                             keyutils-libs-devel.x86_64 0:1.5.8-3.el7
  krb5-devel.x86_64 0:1.15.1-50.el7                            libcom_err-devel.x86_64 0:1.42.9-19.el7
  libkadm5.x86_64 0:1.15.1-50.el7                              libselinux-devel.x86_64 0:2.5-15.el7
  libsepol-devel.x86_64 0:2.5-10.el7                           libverto-devel.x86_64 0:0.2.5-4.el7
  openssl-devel.x86_64 1:1.0.2k-21.el7_9                       pcre-devel.x86_64 0:8.32-17.el7
  perl.x86_64 4:5.16.3-299.el7_9                               perl-Carp.noarch 0:1.26-244.el7
  perl-Encode.x86_64 0:2.51-7.el7                              perl-Exporter.noarch 0:5.68-3.el7
  perl-File-Path.noarch 0:2.09-2.el7                           perl-File-Temp.noarch 0:0.23.01-3.el7
  perl-Filter.x86_64 0:1.49-3.el7                              perl-Getopt-Long.noarch 0:2.40-3.el7
  perl-HTTP-Tiny.noarch 0:0.033-3.el7                          perl-PathTools.x86_64 0:3.40-5.el7
  perl-Pod-Escapes.noarch 1:1.04-299.el7_9                     perl-Pod-Perldoc.noarch 0:3.20-4.el7
  perl-Pod-Simple.noarch 1:3.28-4.el7                          perl-Pod-Usage.noarch 0:1.63-3.el7
  perl-Scalar-List-Utils.x86_64 0:1.27-248.el7                 perl-Socket.x86_64 0:2.010-5.el7
  perl-Storable.x86_64 0:2.45-3.el7                            perl-Text-ParseWords.noarch 0:3.29-4.el7
  perl-Time-HiRes.x86_64 4:1.9725-3.el7                        perl-Time-Local.noarch 0:1.2300-2.el7
  perl-constant.noarch 0:1.27-2.el7                            perl-libs.x86_64 4:5.16.3-299.el7_9
  perl-macros.x86_64 4:5.16.3-299.el7_9                        perl-parent.noarch 1:0.225-244.el7
  perl-podlators.noarch 0:2.5.1-3.el7                          perl-threads.x86_64 0:1.87-4.el7
  perl-threads-shared.x86_64 0:1.43-6.el7                      zlib-devel.x86_64 0:1.2.7-19.el7_9

Complete!

anaconda の導入

yum ではなく、公式のインストーラーを入手して、導入する。
anaconda はグローバルにインストールされるのではなく、各ユーザーごとにインストールされる。
ここでは開発用ユーザー ds_eng を用意し、そのユーザーディレクトリにインストールを試みる。

$ mkdir ./src    # ダウンロード用ディレクトリを作っておく
$ cd ./src
$ curl -O https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  544M  100  544M    0     0  17.2M      0  0:00:31  0:00:31 --:--:-- 17.3M

$ ll
total 557480
-rw-r--r-- 1 ds-eng ds-eng 570853747 Sep 14 17:43 Anaconda3-2021.05-Linux-x86_64.sh

それではインストーラーを実行する。

$ bash ./Anaconda3-2021.05-Linux-x86_64.sh

Welcome to Anaconda3 2021.05

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>> (Enterを入力)

# 規約がズラーっと表示される
===================================
End User License Agreement - Anaconda Individual Edition
===================================

Copyright 2015-2021, Anaconda, Inc.

All rights reserved under the 3-clause BSD License:

This End User License Agreement (the "Agreement") is a legal agreement between you and Anaconda, Inc. ("Anaconda") and g
overns your use of Anaconda Individual Edition (which was formerly known as Anaconda Distribution).

Subject to the terms of this Agreement, Anaconda hereby grants you a non-exclusive, non-transferable license to:

  * Install and use the Anaconda Individual Edition (which was formerly known as Anaconda Distribution),
  * Modify and create derivative works of sample source code delivered in Anaconda Individual Edition from Anaconda's re
pository; and
  * Redistribute code files in source (if provided to you by Anaconda as source) and binary forms, with or without modif
ication subject to the requirements set forth below.

Anaconda may, at its option, make available patches, workarounds or other updates to Anaconda Individual Edition. Unless
 the updates are provided with their separate governing terms, they are deemed part of Anaconda Individual Edition licen
sed to you as provided in this Agreement. This Agreement does not entitle you to any support for Anaconda Individual Edi
tion.

(・・・中略・・・)

# ライセンスへの同意を求められるので `yes` と入力
Do you accept the license terms? [yes|no]
[no] >>> yes 

# インストール先の確認
# 今回は ユーザーディレクトリにインストールするので、そのまま Enter で良い
Anaconda3 will now be installed into this location:
/home/ds_eng/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/ds_eng/anaconda3] >>> (Enter を入力)

# インストール処理の進捗が表示される
PREFIX=/home/ds_eng/anaconda3
Unpacking payload ...

Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/ds_eng/anaconda3

  added / updated specs:
    - _ipyw_jlab_nb_ext_conf==0.1.0=py38_0
    - _libgcc_mutex==0.1=main
    - alabaster==0.7.12=pyhd3eb1b0_0
    - anaconda-client==1.7.2=py38_0
    - anaconda-navigator==2.0.3=py38_0
    - anaconda-project==0.9.1=pyhd3eb1b0_1
    - anaconda==2021.05=py38_0

    (・・・中略・・・)

    - zope.interface==5.3.0=py38h27cfd23_0
    - zope==1.0=py38_1
    - zstd==1.4.5=h9ceee32_0

The following NEW packages will be INSTALLED:

  _ipyw_jlab_nb_ext~ pkgs/main/linux-64::_ipyw_jlab_nb_ext_conf-0.1.0-py38_0
  _libgcc_mutex      pkgs/main/linux-64::_libgcc_mutex-0.1-main
  alabaster          pkgs/main/noarch::alabaster-0.7.12-pyhd3eb1b0_0
  anaconda           pkgs/main/linux-64::anaconda-2021.05-py38_0
  anaconda-client    pkgs/main/linux-64::anaconda-client-1.7.2-py38_0
  anaconda-navigator pkgs/main/linux-64::anaconda-navigator-2.0.3-py38_0

   (・・・中略・・・)

  zope.event         pkgs/main/linux-64::zope.event-4.5.0-py38_0
  zope.interface     pkgs/main/linux-64::zope.interface-5.3.0-py38h27cfd23_0
  zstd               pkgs/main/linux-64::zstd-1.4.5-h9ceee32_0

Preparing transaction: done
Executing transaction: done
installation finished.

# 続いて初期化設定:初回インストールなので `yes` と入力
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[no] >>>

no change     /home/ds_eng/anaconda3/condabin/conda
no change     /home/ds_eng/anaconda3/bin/conda
no change     /home/ds_eng/anaconda3/bin/conda-env
no change     /home/ds_eng/anaconda3/bin/activate
no change     /home/ds_eng/anaconda3/bin/deactivate
no change     /home/ds_eng/anaconda3/etc/profile.d/conda.sh
no change     /home/ds_eng/anaconda3/etc/fish/conf.d/conda.fish
no change     /home/ds_eng/anaconda3/shell/condabin/Conda.psm1
no change     /home/ds_eng/anaconda3/shell/condabin/conda-hook.ps1
no change     /home/ds_eng/anaconda3/lib/python3.8/site-packages/xontrib/conda.xsh
no change     /home/ds_eng/anaconda3/etc/profile.d/conda.csh
modified      /home/ds_eng/.bashrc

==> For changes to take effect, close and re-open your current shell. <==

If you'd prefer that conda's base environment not be activated on startup,
   set the auto_activate_base parameter to false:

conda config --set auto_activate_base false

Thank you for installing Anaconda3!

===========================================================================

Working with Python and Jupyter notebooks is a breeze with PyCharm Pro,
designed to be used with Anaconda. Download now and have the best data
tools at your fingertips.

PyCharm Pro for Anaconda is available at: https://www.anaconda.com/pycharm

カスタマイズしたコンテナのDoker Image を保存する

コンテナの初期設定(基礎的パッケージのインストールなど)が終わったら、そのコンテナのDocker Image を保存するとしたい。
機械学習、データ分析用・データエンジニアリング用の環境なので、env-ds-ml-eng としておこう。

まず、カスタマイズ作業をしていたコンテナから exit で抜け、コンテナが停止していることを確かめる。

[ds_eng@c1aad13a8e5c src]$ exit
exit
[root@c1aad13a8e5c src]# exit
exit
# コンテナを抜けたら、停止しているか確認
> docker ps -a
CONTAINER ID   IMAGE            COMMAND                  CREATED       STATUS                      PORTS     NAMES
11131abade26   centos:centos7   "/bin/bash"              2 weeks ago   Exited (0) 2 weeks ago                centos7_background
c1aad13a8e5c   centos:centos7   "/bin/bash"              2 weeks ago   Exited (0) 13 seconds ago             centos7_1st
8704bb047c87   hello-world      "/hello"                 2 weeks ago   Exited (0) 2 weeks ago                angry_gauss
b3f77379ed6a   alpine/git       "git clone https://g…"   2 weeks ago   Exited (0) 2 weeks ago                repo

docker image の保存は、docker commit で行う。
書式は次の通り

docker commit (コンテナ名) (保存イメージ名)

環境をカスタマイズしていたコンテナは centos7_1st である。

> docker commit centos7_1st env-ds-ml-eng
sha256:839c1689b52420f6912177aceb7f184cdef19dbf702c01e0cf71524dfa175722

Docker Image env-ds-ml-eng が生成出来ていることが分かる。
なかなかのサイズである。
軽量化の方法は、別のエントリでまとめるとしよう。

> docker images
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
env-ds-ml-eng       latest    839c1689b524   25 seconds ago   4.56GB
docker101tutorial   latest    c5ee10044f54   2 weeks ago      28.2MB
alpine/git          latest    b8f176fa3f0d   3 months ago     25.1MB
hello-world         latest    d1165f221234   6 months ago     13.3kB
centos              centos7   8652b9f0cb4c   10 months ago    204MB

その他

Docker公式アイコン画像を使う際には、トレードマークポリシーに従った画像を使うようにとのこと。

公式のトレードマークポリシーのページはこちらになる。

Docker, Inc. (“Docker”) trademarks, service marks, logos and…

参考資料

Qiita

【入門】はじめての Docker Desktop for Windows のインストールと CentOS の仮想環境…

Qiita

windows 10 より前の問題点 Ctrl + C や Ctrl + V が使えない コマンドの結果をコピペ…

Medium

コンテナを実行したままにしておきたい場合があります。日常的に使う便利なサービスを立ち上げていつでもアクセスできるようにし…

最新情報をチェックしよう!