2020年6月17日水曜日

DockerでDebianコンテナを作成して、Squidを動かす

先日Dockerfileを使って「CentOSコンテナ+Squid」を構築してみたが、その際に「Dockerfile のベストプラクティス」として、ベースに使うイメージは「Debian」が推奨との記載があった。

可能であれば、自分のイメージの元として現在の公式レポジトリを使います。私たちは Debian イメージ を推奨します。これは、非常にしっかりと管理されており、ディストリビューションの中でも最小(現在は 100 MB 以下)になるよう維持されているからです。

今回はDockerの推奨に従い、「Debianコンテナ+Squid」の環境をDockerfileを使って、サクッと作ってみたいと思う。

環境

  • OS : CentOS 7.8
  • Docker : 19.03.10
  • コンテナ上のDebian: latest (最新を指定。バージョンは10.4であることを確認)

手作業でコンテナを作ってみる

Dockerfleを作成する前に、必要な作業を確認するため、手作業でコンテナを作ってみることにする。

1. Debianイメージを入手

docekr searchコマンドでDebianコンテナを確認してみる。ubuntuもあるようだが、今回はdebianのイメージを使用する。

# docker search debian
NAME                                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                             Ubuntu is a Debian-based Linux operating sys…   10991               [OK]
debian                                             Debian is a Linux distribution that's compos…   3511                [OK]
arm32v7/debian                                     Debian is a Linux distribution that's compos…   66                    

~(以下略)~

docker pullコマンドでDebianコンテナのイメージを入手する。Debianコンテナのイメージサイズは114MBであり、CentOSコンテナよりも小さいことがわかる。

# docker pull debian
Using default tag: latest
latest: Pulling from library/debian
e9afc4f90ab0: Pull complete
Digest: sha256:46d659005ca1151087efa997f1039ae45a7bf7a2cbbe2d17d3dcbda632a3ee9a
Status: Downloaded newer image for debian:latest
docker.io/library/debian:latest

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              latest              1b686a95ddbf        2 days ago          114MB
centos              7.6.1810            f1cb7c7d58b7        15 months ago       202MB

2. コンテナを起動

docker runコマンドでコンテを作成・起動する。DebianやCentOSコンテナのデフォルトのコマンド(DockerfileのCMD命令で定義されたコマンド)は、bashが実行されるようだが、対話型コマンドとなるので、-itオプションを付けて起動させること。このオプションを付けない場合は、コンテナを起動できないので注意。

# docker run -it -d -p 8081:3128 --name "docker-squid-2" debian
be8ca382678a458d99471a93e526c13977123250ac292d6021c79785cfa0fe3c

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
be8ca382678a        debian              "bash"                   4 seconds ago       Up 2 seconds        0.0.0.0:8081->3128/tcp   docker-squid-2

docker execコマンドでDebianコンテナにログインする。Debianのバージョンは10.4のようだ。

# docker exec -it docker-squid-2 bash
root@be8ca382678a:/# uname -a
root@be8ca382678a:/# cat /etc/debian_version
10.4

3. Squidをインストール

squidをインストールする。Debianなのでaptを使ってインストールとなるが、一番最初にapt updateしないとインストールが成功しないので注意しよう。

root@be8ca382678a:/# export http_proxy=http://192.168.33.23:8080
root@be8ca382678a:/# export https_proxy=http://192.168.33.23:8080

root@be8ca382678a:/# apt update
root@be8ca382678a:/# apt install squid -y

root@be8ca382678a:/# apt install -y procps
Reading package lists... Done
Building dependency tree
Reading state information... Done
procps is already the newest version (2:3.3.15-2).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
root@be8ca382678a:/# squid -v
Squid Cache: Version 4.6

~(以下略)~

Debianコンテナでは、psviすら使用できないので、以下も必要に応じてインストールしておく。

root@be8ca382678a:/# apt install vim -y
root@be8ca382678a:/# apt install procps -y
root@be8ca382678a:/# apt install curl -y

4. squid.confを編集

最終的にDockerfileでコンテナを構築できるよう、可能な限りsedコマンドを使って設定ファイルを編集する。

DebianでインストールされるSquidはCentOSと異なり、大量のコメントが記載されているので、まずはそれを削除する。

root@be8ca382678a:/# sed -i -e '/^#/d' -e '/^$/d' /etc/squid/squid.conf

次に、acl localnetの記載を自身の環境に合わせて置換する。なお、DebianのSquidでは「http_access allow localnet」がないため追加も忘れないこと。これを追加しない場合は、ローカルからのアクセス以外は、「403 Forbidden」でアクセス拒否されてしまう。

root@be8ca382678a:/# sed -ie 's#^acl localnet src 192.168.0.0/16.*#acl localnet src 192.168.33.0/24\nacl localnet src 192.168.11.0/24#g' /etc/squid/squid.conf
root@be8ca382678a:/# sed -i '/^http_access allow localhost$/i http_access allow localnet' /etc/squid/squid.conf

最後に、文末に上位プロキシを指定するための設定を追加する。

root@be8ca382678a:/# sed -i '$ a cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange\nnever_direct allow all' /etc/squid/squid.conf

最終的に、squid.confは以下のようになる。★箇所が追加箇所となる。

root@be8ca382678a:/etc/squid# cat /etc/squid/squid.conf
acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
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   ★

5. Squidを起動

Squidをバックグラウンドで起動させる。

root@be8ca382678a:/etc/squid# /usr/sbin/squid -N -f /etc/squid/squid.conf &
[1] 3995
root@be8ca382678a:/etc/squid# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 21:23 pts/0    00:00:00 bash
root      3821     0  0 21:36 pts/1    00:00:00 bash
proxy     3995  3821  4 22:38 pts/1    00:00:00 /usr/sbin/squid -N -f /etc/squid/squid.conf
proxy     3996  3995  0 22:38 ?        00:00:00 (logfile-daemon) /var/log/squid/access.log
proxy     3997  3995  0 22:38 ?        00:00:00 (pinger)
root      3998  3821  0 22:39 pts/1    00:00:00 ps -ef

これにて、手作業でDebianコンテナ+Squid構築が完了となる。

Dockerfileを作ってコンテナを作成

1. Dockerfileを作成

先ほどの手作業で確認したコマンドをDockerfileに落とし込む。sedコマンドは1コマンドで実行するように修正した。注意事項として、sedのコメントと空白行の削除処理は、最後に実施するようにすること。そうしないと、文末に設定追加がうまく動作しない

また、aptを使うと「WARNING: apt does not have a stable CLI interface. Use with caution in scripts.」の警告が表示される。どうらやコマンドラインで人が実行する際はaptコマンドが推奨で、スクリプトで使用する場合はapt-getコマンドが推奨のようだ。そのため、Dockerfileでもapt-getコマンドに修正している。

ちなみに、apt-getコマンドに修正しても「debconf: delaying package configuration, since apt-utils is not installed」の警告が表示されるが、これは無視しても問題ないようだ。

FROM debian

ENV http_proxy=http://192.168.33.23:8080 https_proxy=http://192.168.33.23:8080
RUN apt-get update && apt-get install squid vim procps curl -y && apt-get clean
RUN sed -i \
        -e 's#^acl localnet src 192.168.0.0/16.*#acl localnet src 192.168.33.0/24\nacl localnet src 192.168.11.0/24#g' \
        -e '/^http_access allow localhost$/i http_access allow localnet' \
        -e '$ a cache_peer 192.168.33.23 parent 8080 7 no-query no-netdb-exchange\nnever_direct allow all' \
        -e '/^#/d' -e '/^$/d' \
    /etc/squid/squid.conf

EXPOSE 3128
CMD /usr/sbin/squid -N -f /etc/squid/squid.conf

2. 作成したDockerfileを使って、イメージをビルド

Dockerfileを保存したディレクトリに移動し、docker buildコマンドを使ってイメージをビルドする。

# cd debian-squid/
# docker build -t debian-squid:1 .
Sending build context to Docker daemon   2.56kB
Step 1/6 : FROM debian
 ---> 1b686a95ddbf
Step 2/6 : ENV http_proxy=http://192.168.33.23:8080 https_proxy=http://192.168.33.23:8080
 ---> Running in 64de1ce30c0b
Removing intermediate container 64de1ce30c0b
 ---> b9f23e0c03dc

~(中略)~

Step 6/6 : CMD /usr/sbin/squid -N -f /etc/squid/squid.conf
 ---> Running in 3d9df1d00113
Removing intermediate container 3d9df1d00113
 ---> 520b5db11824
Successfully built 520b5db11824

作成したイメージを確認してみると、「debian-squid」のイメージが作成された。ただ、残念ながらSquidをインストールしたことによって、CentOSコンテナよりも容量は大きくなるという結果になってしまった。

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian-squid        1                   520b5db11824        7 minutes ago       359MB
debian              latest              1b686a95ddbf        4 days ago          114MB
centos              7.6.1810            f1cb7c7d58b7        15 months ago       202MB

3. コンテナを起動

docker runコマンドで作成したイメージからコンテナを作成・起動する。

# docker run -d -p 8081:3128 --name "debian-squid" debian-squid:1
da4d21364aee5785c8ced2997757ba793d42dfdc59b03bac1bb25ddefe7e5b1c

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
da4d21364aee        debian-squid:1      "/bin/sh -c '/usr/sb…"   4 seconds ago       Up 3 seconds        0.0.0.0:8081->3128/tcp   debian-squid
96b890f0e14d        docker-squid:1      "/bin/sh -c '/usr/sb…"   6 days ago          Up 6 days           0.0.0.0:8080->3128/tcp   docker-squid

4. Squidの動作確認

最後に、ホストOSの8081番ポートにてプロキシが正常に機能していることを確認してみる。curlコマンドを使って確認すると「HTTP/1.1 200 OK」が返ってきており、正常に動作していることが確認できた。

# export http_proxy=https://127.0.0.1:8081
# export https_proxy=https://127.0.0.1:8081

# curl -v http://www.google.co.jp
* About to connect() to proxy 127.0.0.1 port 8081 (#0)
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8081 (#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

まとめ

前回のCentOSコンテナに引き続き、Debianコンテナでも同様にSquidを構築することができた。yumではなくapt-get(およびapt)を使うことが大きな違いで、それ以外は細かい差異はあるものの、問題なく構築することができた。

Dockerfileを作成する際には、設定ファイル編集の処理などでsedを駆使する必要があるので、sedの使い方や正規表現の理解が重要と感じた。

0 件のコメント:

コメントを投稿

人気の投稿