2020年6月6日土曜日

Docker入門 (CentOS 7にDocker CEインストール&CentOSコンテナを作成してSquidを動かす)

Docker自体には興味があったのだが、なかなか時間が取れず、検証することを避けてきていたのだが、そろそろ基本的なところだけでも押さえておきたいと思い始めた。

今回、CentOS 7の環境にDockerのコンテナ環境を構築し、Docker上にCentOSコンテナを立ち上げてSquidのプロキシサーバを構築してみるという検証を実施した。

環境

  • OS : CentOS 7.8
  • Docker : 19.03.10
  • コンテナ上のCnetOS : 7.6 (あえてホストとは別バージョンにしてみた)

Dockerインストール手順

Docker CEのインストール

現在Dockerは、有償版のDcoker EE (Enterprise Edition)と無償版のDcoker CE (Community Edition)の2つに分かれており、通常使うものは当然、Docker CEとなる。

CentOSインストール後にyum install dockerを実行することでもインストールされるが、この手順ではDockerのバージョンが1.13.1という古いバージョンがインストールされてしまう。したがって、本家サイトの手順に従いインストールを行うことが推奨される。
※なお、バージョン1.13.1は、Dcoker EE/CE分割前の最終バージョンとなる。

yum-config-managerを使ってDockerのレポジトリ登録するため、yum-utilsをインストールする。

# yum install yum-utils -y

yum-config-managerを使ってDockerのレポジトリ登録する。

# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Docker CEをインストールする。

# yum install docker-ce docker-ce-cli containerd.io -y

Dockerを起動させてみる。

# systemctl start docker
# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2020-05-31 16:16:14 JST; 3s ago
     Docs: https://docs.docker.com
 Main PID: 1698 (dockerd)
    Tasks: 8
   Memory: 37.8M
   CGroup: /system.slice/docker.service
           mq1698 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/cont...

~(以下略)~

# systemctl enable docker

docker -vコマンドでバージョンを確認すると、Docker version 19.03.10がインストールされていることが確認できる。

# docker -v
Docker version 19.03.10, build 9424aeaee9

docker versionコマンドを使うと、さらに詳細な情報を確認することができる。

# docker version
Client: Docker Engine - Community
 Version:           19.03.10
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        9424aeaee9
 Built:             Thu May 28 22:18:06 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.10
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       9424aeaee9
  Built:            Thu May 28 22:16:43 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

プロキシ環境がある場合の設定

Dockerは「Docker Hub」と呼ばれる、Dockerのイメージが保存されているサイトからインターネット経由でイメージのダウンロードを行いコンテナを作成する。

直接インターネットと通信できる環境であれば問題ないが、プロキシ環境がある場合は、Dockerのサービス起動ファイル「/usr/lib/systemd/system/docker.service」の[Service]句に、以下のようにプロキシ用の環境変数を設定を追加する。

[Service] ←★Service句の配下に追記
Environment="http_proxy=http://192.168.33.23:8080" "https_proxy=http://192.168.33.23:8080"

設定反映のため、Dockerを再起動する。

# systemctl daemon-reload
# systemctl restart docker

docker infoコマンドで環境変数が反映されていることを確認する。

# docker info

~(中略)~

 HTTP Proxy: http://192.168.33.23:8080
 HTTPS Proxy: http://192.168.33.23:8080

~(以下略)~

「hello-world」コンテナを作成・起動

Dockerの動作確認のためのテスト用コンテナである「hello-world」コンテナを作成・起動してみる。docker runコマンドにてコンテナを作成・起動できる。

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

docker psコマンドでコンテナの確認ができる。停止状態のコンテナ含め表示させるには、-aオプションを付けて実行する。

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
bf385414bac4        hello-world         "/hello"            19 seconds ago      Exited (0) 18 seconds ago                       magical_roentgen

docker imagesコマンドで保持しているイメージを確認できる。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

コンテナやイメージの削除は本題から逸れるので、また別の機会に記載することにし、先に進むことにする。

CentOS 7のイメージ取得とコンテナ作成・起動

コンテナのイメージ取得

Docker Hubのイメージを検索するにはdocker searchコマンドを使う。「centos」で検索すると複数出てくるが、今回は1つ目に表示される「centos」イメージを使ってコンテナを作成する。

# docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   6020                [OK]
ansible/centos7-ansible            Ansible on Centos7                              129                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session …   115                                     [OK]
jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos -  …   114                                     [OK]
centos/mysql-57-centos7            MySQL 5.7 SQL database server                   76
imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              58                                      [OK]
tutum/centos                       Simple CentOS docker image with SSH access      46
centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relational  …   44
kinogmt/centos-ssh                 CentOS with SSH                                 29                                      [OK]
pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag names …   12
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
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-mingw           Using the mingw toolchain to cross-compile t …   3
pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated wi …   3
miko2u/centos6                     CentOS6 日本語環境                                   2                                       [OK]
indigo/centos-maven                Vanilla CentOS 7 with Oracle Java Developmen …   1                                       [OK]
blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1                                       [OK]
mcnaughton/centos-base             centos base image                               1                                       [OK]
pivotaldata/centos7-dev            CentosOS 7 image for GPDB development           0
pivotaldata/centos6.8-dev          CentosOS 6.8 image for GPDB development         0
smartentry/centos                  centos with smartentry                          0

なお、イメージにはバージョンがあり、「centos」の場合は、7.1、7.2、…7.7といった複数バージョンを選択できる。バージョンの確認は残念ながらdockerコマンドでは実装されていないようなので、ブラウザなので直接確認する。

今回は、あえてバージョン指定をして、「centos:7.6.1810」にてコンテナ作成をすることにする。docker pullコマンドで、Docker Hubからイメージを取得する。

# docker pull centos:7.6.1810

イメージを確認するには、docker imagesコマンドを使用する。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.6.1810            f1cb7c7d58b7        14 months ago       202MB

なお、取得したイメージの総容量を表示したい場合は、docker system dfコマンドを使用する。

# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              1                   0                   201.8MB             201.8MB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

コンテナ作成・起動

それではコンテナを作成しよう。docker runコマンドにてイメージからコンテナを作成し起動することができる。最後に付与している/sbin/initsystemctlを使うための指定となる。

# docker run -d --privileged -p 8080:3128 --name "docker-squid" centos:7.6.1810 /sbin/init
4cb7fd3a1bc43aecea24ea23c5f8b318c3a9be45a08698eaa7a254cef7800af6

オプションの説明は以下の通り。

オプション 説明
-d コンテナをデタッチド・モード(バックグラウンド)で起動。
–privileged コンテナを特権モードで起動する。systemctlコマンドを使用するために指定が必要。
-p コンテナのポートとホスト側のポートを紐づける。:で指定。今回は、コンテナのSquidデフォルトポートである3128をホストの8080番ポートに紐づける。
–name コンテナの名前を指定。

docker psコマンドでコンテナが作成されていることを確認しておく。

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
4cb7fd3a1bc4        centos:7.6.1810     "/sbin/init"        5 seconds ago       Up 4 seconds        0.0.0.0:8080->3128/tcp   docker-squid

それではコンテナのCentOSにログインしてみよう。「docker-squid」コンテナに対して、bashでログインするには、docker execコマンドを用いて以下のように記載する。

# docker exec -it docker-squid bash
[root@4cb7fd3a1bc4 /]# ←★プロンプトが変化する

コンテナにSquidをインストール

コンテナにログインしたら、yumをつかってsquidをインストールする。特に通常のCentOSと違いはなく、問題なくインストールが完了した。

[root@4cb7fd3a1bc4 /]# yum install squid -y
[root@4cb7fd3a1bc4 /]# squid -v
Squid Cache: Version 3.5.20

squidは最低限の通信が確認できるよう、「/etc/squid/squid.conf」に対して以下を追記した。通信を許可するネットワークと上位プロキシを設定している。

acl localnet src 192.168.33.0/24
acl localnet src 192.168.11.0/24
cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange
never_direct allow all

squidを起動する。

[root@4cb7fd3a1bc4 /]# systemctl start squid
[root@4cb7fd3a1bc4 /]# systemctl enable squid

動作確認

まずは、コンテナ内でsquidの動作を確認してみる。環境変数でローカルアドレスの3128番ポートに対して、curlコマンドを使って通信確認をすると、「HTTP/1.1 200 OK」が出力されており問題なく通信できていることが確認できた。

[root@4cb7fd3a1bc4 /]# export http_proxy=http://127.0.0.1:3128
[root@4cb7fd3a1bc4 /]# export https_proxy=http://127.0.0.1:3128
[root@4cb7fd3a1bc4 /]# curl -v http://www.google.co.jp
* About to connect() to proxy 127.0.0.1 port 3128 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 3128 (#0)
> GET http://www.google.co.jp/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.co.jp
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK

~(以下略)~

次に、コンテナからexitコマンドでログオフしたのち、コンテナの3128番ポートと紐づいている8080番ポートを指定して再度確認すると、「HTTP/1.1 200 OK」が出力され、問題なくホストOSからコンテナのsquidに対して通信できていることが確認できた。

# export http_proxy=http://127.0.0.1:8080
# export https_proxy=http://127.0.0.1:8080
# curl -v http://www.google.co.jp
* About to connect() to proxy 127.0.0.1 port 8080 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET http://www.google.co.jp/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.co.jp
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK

~(以下略)~

まとめ

以上でDockerの基本的な使い方を理解することができた。最後に、今回使用したDockerのコマンドをまとめておくことにする。

コマンド 内容
docker version Dockerのバージョン表示。docker -vより詳細な出力。
docker info Dockerで設定されている各種設定値(環境変数など)の情報出力。
docker run コンテナを作成・起動。
docker ps 起動中のコンテナを一覧表示。
docker ps -a 停止中のコンテナを含め、コンテナを一覧表示。
docker images イメージを一覧表示。
docker search Docker Hubのイメージを検索。
docker pull Docker Hubからイメージを取得。
docker exec 起動中のコンテナにてコマンドを実行。

参考

1 件のコメント:

人気の投稿