先日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コンテナでは、ps
やvi
すら使用できないので、以下も必要に応じてインストールしておく。
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 件のコメント:
コメントを投稿