LoginSignup
13
12

More than 3 years have passed since last update.

ubuntu 20.04.1 上でプロキシ環境でdocker を利用する

Last updated at Posted at 2020-09-12

ubuntu 20.04.1 上でプロキシ環境でdocker を利用する

docker をインストールする。

docker をインストールしていない場合は以下の記事の手順で docker をインストールする
https://qiita.com/m-tmatma/items/06eb40514306e09142c4

プロキシを用意する

以下の記事のようにしてプロキシを用意しておく。
https://qiita.com/m-tmatma/items/7b5ce812c85f30546209

この記事ではプロキシの IP が 192.168.11.61 で、ポート番号が 3128 という前提で記載する。

プロキシ経由でしかアクセスできない環境をエミュレートする

プロキシ経由でしかアクセスできない環境をエミュレートする。
これにより、設定が誤っていた場合に検出できる。

HTTP, HTTPS を禁止

sudo iptables -A OUTPUT -j REJECT -p tcp --dport 80
sudo iptables -A OUTPUT -j REJECT -p tcp --dport 443

Git, SSHを禁止 (これは必須じゃないけど念のため)

sudo iptables -A OUTPUT -j REJECT -p tcp --dport 9418
sudo iptables -A OUTPUT -j REJECT -p tcp --dport 22

apt

apt のプロキシ設定をする

docker のコンテナ内で apt を使えるようにと思ったが、 ~/.docker/config.json で設定した環境設定が有効になるため、コンテナ内で使う分には設定は不要。
ホスト環境でも環境変数で http_proxy https_proxy の設定を行っていれば不要。

sudo nano /etc/apt/apt.conf

以下の内容で保存する。

Acquire::http::Proxy "http://192.168.11.61:3128";
Acquire::https::Proxy "http://192.168.11.61:3128";

以下のようにプロキシの変数を設定する。

test@test-vmware:~$ cat /etc/apt/apt.conf
Acquire::http::Proxy "http://192.168.11.61:3128";
Acquire::https::Proxy "http://192.168.11.61:3128";

apt の update をする

sudo apt update -y
sudo apt upgrade -y

docker のインストール

インストール

https://qiita.com/m-tmatma/items/06eb40514306e09142c4 を参考に docker をインストールする。

sudo apt install -y docker.io docker-compose

カレントユーザーを docker グループに追加 (docker を起動するときに毎回 sudo する場合は省略可)

この手順は docker コマンドを sudo なしで実行したい場合のみ必要です。

docker を sudo なしで実行すると便利なので、カレントユーザーを docker グループに追加する。
反映するために再起動する。

sudo usermod -aG docker $USER
sudo reboot

なお、ここで再起動した場合は、iptables の手順は再度実行すること。

dockerd に環境変数でプロキシを設定する。

プロキシ設定

以下コマンドを実行する。

sudo systemctl edit docker

除外 IP を指定しない場合

sudo systemctl edit docker で起動するエディタで 以下の内容を入力して保存して終了する。

[Service]
Environment="HTTP_PROXY=http://192.168.11.61:3128"
Environment="HTTPS_PROXY=http://192.168.11.61:3128"

除外 IP を指定する場合

sudo systemctl edit docker で起動するエディタでNO_PROXY も追加で指定する。
以下の内容を入力して保存して終了する。

[Service]
Environment="HTTP_PROXY=http://192.168.11.61:3128"
Environment="HTTPS_PROXY=http://192.168.11.61:3128"
Environment="NO_PROXY=localhost,127.0.0.1"

設定の確認

/etc/systemd/system/docker.service.d/override.conf に保存される。
以下は 除外 IP を指定しない場合の例

$ cat /etc/systemd/system/docker.service.d/override.conf 
[Service]
Environment="HTTP_PROXY=http://192.168.11.61:3128" "HTTPS_PROXY=http://192.168.11.61:3128"

プロキシ設定を反映

設定を反映する。

sudo systemctl daemon-reload

プロキシ設定を確認

設定を確認する。

sudo systemctl show docker --property Environment

docker を再起動

docker を再起動する。

sudo systemctl restart docker

以下を実行して、HTTP ProxyHTTPS Proxy に反映されているのを確認する。

docker info

参考
http://docs.docker.jp/engine/articles/systemd.html#http
https://docs.docker.com/config/daemon/systemd/

ユーザーごとの docker の設定

設定ファイルを保存するフォルダを作る。

mkdir -p ~/.docker

~/.docker/config.json を編集する。

nano  ~/.docker/config.json

除外 IP を指定しない場合

~/.docker/config.json で以下のような内容を入力して保存する。

{
  "proxies": {
    "default": {
      "httpProxy": "http://192.168.11.61:3128",
      "httpsProxy": "http://192.168.11.61:3128"
    }
  }
}

除外 IP を指定する場合

プロキシに除外条件を指定する場合は~/.docker/config.jsonnoProxy で指定する。

{
  "proxies": {
    "default": {
      "httpProxy": "http://192.168.11.61:3128",
      "httpsProxy": "http://192.168.11.61:3128",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}

参考
https://docs.docker.com/network/proxy/
https://docs.docker.com/network/proxy/#configure-the-docker-client

docker pull の確認

以下のように docker pull できる。

$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
df20fa9351a1: Pull complete 
Digest: sha256:185518070891758909c9f839cf4ca393ee977ac378609f700f60a771a2dfe321
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

念のため iptables で確認しても http と https は直アクセスは禁止されている。

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     tcp  --  anywhere             anywhere             tcp dpt:https reject-with icmp-port-unreachable
REJECT     tcp  --  anywhere             anywhere             tcp dpt:http reject-with icmp-port-unreachable
REJECT     tcp  --  anywhere             anywhere             tcp dpt:git reject-with icmp-port-unreachable
REJECT     tcp  --  anywhere             anywhere             tcp dpt:ssh reject-with icmp-port-unreachable

Chain DOCKER (1 references)
target     prot opt source               destination         

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere            
13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12