2021年1月30日土曜日

DockerでSquidをコンテナ化してプロキシサーバを構築する

自宅サーバコンテナ化対応として、今回はプロキシ機能であるSquidのコンテナ化を行う

環境

今回のDocker環境構築時のソフトウエアバージョンを以下に記載する。

  • DockerホストOS : CentOS 8.2
  • Docer : 19.03.14
  • コンテナ用OSイメージ : centos:latest

Dockerホストとコンテナ間では、サービス提供に必要なポートの紐づけと、ログファイルを出力させるディレクトリの紐づけを行う。以下に簡単に図示しておく。

Squidコンテナ化手順

1. Dockerのインストール

Dockerのインストールは別記事を参照。CentOS 7にDockerをインストールする内容となっているが、CentOS 8も同様の手順でインストールできる。

Dockerインストール後、Dockerfile等を配置するディレクトリを作成し、以後はそのディレクトリ内にすべてのファイルを配置する。

2. Squid用の設定ファイルを準備

Squidの設定手順は、過去記事にて記載しているので、そちらを参照いただきたい。

コンテナにする場合も同様の設定を行えばよい。あらかじめ、以下の通り設定ファイルを作成しておく。

squid.conf

※★箇所は各環境に合わせて変更すること。

acl localnet src 192.168.33.0/24 #★プロキシ利用を許可するIPアドレス
acl localnet src 192.168.11.0/24 #★プロキシ利用を許可するIPアドレス
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
acl NOCACHE src all

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 8080 #★プロキシを提供するポート番号

cache deny NOCACHE #★キャッシュ無効
cache_dir ufs /var/spool/squid 100 16 256
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
shutdown_lifetime 5 seconds # 停止時の待機時間をDockerのタイムアウト(10s)以下に設定

3. Dockerホストにログ出力先を作成

今回はコンテナのSquidが出力したaccess.logcache.logをDockerホストのディレクトリ出力するよう構成するため、以下の通りあらかじめログ出力先のディレクトリを作成しておく。

mkdir -p /var/log/docker/centos-squid
chmod 777 /var/log/docker/*

4. Dockerfileを作成

コンテナの構成情報はDockerfileに記述する。いくつか記述内容にポイントがあるので以下表にまとめる。

命令 記述内容 説明
FROM centos コンテナのベースとなるイメージはCentOSを使用する。
ENV TZ タイムゾーンを日本標準時 (Asia/Tokyo) にする。
ENV http_proxy, https_proxy プロキシ環境の場合は、プロキシサーバを指定する。
RUN dnf, mkdir, chown 必要なパッケージのインストールを行う。Squidのみインストールすれば問題ない。
COPY - 事前に作成したsquid.confの設定ファイルを /etc/squid/にコピーする。
RUN /usr/sbin/squid -N -z squidコマンドを使用して、キャッシュファイルを作成する。
EXPOSE 8080 Squidで指定した8080番ポートを記述する。
CMD ["/usr/sbin/squid", "-N", "-f", "/etc/squid/squid.conf"] /usr/sbin/squid -NにてSquidを実行する。フォアグラウンドで起動させるため、-Nオプション (No daemon mode) を付与している。[]で囲まずに記述すると/bin/sh -cが付与されてプロセスが実行されてしまうので、通常は必ず[]にてコマンドを囲むこと。

実際のDockerfileは以下の通りとなった。

FROM centos

ENV TZ=Asia/Tokyo \
    http_proxy=http://192.168.33.23:8080 \
    https_proxy=http://192.168.33.23:8080
RUN dnf install squid -y

COPY squid.conf /etc/squid/
RUN /usr/sbin/squid -N -z

EXPOSE 8080
CMD ["/usr/sbin/squid", "-N", "-f", "/etc/squid/squid.conf"]

5. コンテナイメージを作成

作成したDockerfileを使って、docker buildコマンドにてコンテナイメージを作成する。

# docker build -t centos-squid:1 .

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-squid        1                   398945a07be3        4 days ago          306MB

6. コンテナを起動

コンテナ起動時には、以下オプションの設定を行う。

設定内容 説明
--name コンテナの名称を設定。今回は「centos-squid」という名前にする。
-p Dockerホストの通信ポートとコンテナの通信ポートを紐づけを行う。<ホストポート>:<コンテナポート>の書式で記載する。今回はコンテナ側で8080番ポートを使用し、ホスト側も同様に8080番ポートに指定することとし、8080:8080で指定する。
-v Dockerホストのディレクトリ/ファイルとコンテナのディレクトリ/ファイルの紐づけを行う。<ホストディレクトリ/ファイル>:<コンテナディレクトリ/ファイル>の書式で記載する。今回はホストの/var/log/docker/centos-squid/ディレクトリにコンテナの/var/log/squidを紐づけることで、ログを出力させる。

上記をふまえ、以下の通りdocker runコマンドでコンテナの起動を行う。

# docker run -d -p 8080:8080 --name "centos-squid" -v /var/log/docker/centos-squid:/var/log/squid centos-squid:1

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                          NAMES
facb736671ae        centos-squid:1      "/usr/sbin/squid -N …"   12 hours ago        Up 12 hours         0.0.0.0:8080->8080/tcp                         centos-squid

7. logrotate設定

ホストに出力させたログをローテーションさせるため、logrotateの設定を行う。logrotateは/etc/logrotate.d/に以下のような設定ファイルを置けば自動でローテーションが実行されるようになる。

# cat /etc/logrotate.d/docker-log
/var/log/docker/*/maillog
/var/log/docker/*/*.log
{
    rotate 7
    daily
    copytruncate
    dateext
    su root root
}

詳細な説明は、以前の記事を参照いただきたい。

以上でSquidのコンテナ化が完了となる。

0 件のコメント:

コメントを投稿

人気の投稿