LoginSignup
7
8

More than 1 year has passed since last update.

WSL2でVPNをつないでいる状態だとDockerコンテナからGit pull/pushができない (wsl2 + docker環境構築手順書付)

Last updated at Posted at 2021-09-10

はじめに

おそらくこの記事を見ている方はこの記事衝撃的だったかと思います。

Docker "Desktop" の商用利用は250名以上の社員かつ$10M/yearの売り上げがある組織では有料サブスクリプションが必要になり、遅くとも来年2022年1月末までに契約が必要

とのことで、仕事でDocker Desktopを利用している方で何か別のに乗り換える必要がでてきた方も多いのではないかと思います。
私はWSL2(Ubuntu20.04)にDockerをインストールすることで、Docker Desktopから卒業することにしました。

以下の手順で環境構築を行いました。
しかし、会社で利用するとVPN接続が必須になり、WSL2のコンテナ上からGit pull/pushができなくなってしまいました。

こんな感じのエラーが出ます。(引用)

140.82.121.4 port 22: Connection timed out
fatal: Could not read from remote repository.

ということで、まずはこの問題の解決方法を紹介した後に環境構築手順も載せたいと思います。

解決方法

まず、WSLの起動時にresolv.confを再生成されないようにするを参考に、wsl2の設定をしていきます。

Ubuntu20.04を開きます。
まずはwsl.confを編集していきます。

$ sudo vi /etc/wsl.conf

そして以下の内容を下に追加します。

[network]
generateResolvConf = false

そのあと、コマンドプロンプトを起動してUbuntu20.04を再起動させます。

$ wslconfig /t Ubuntu-20.04

再度Ubuntu20.04を起動して、resolv.confを編集します。

$ sudo vi /etc/resolv.conf

resolv.confのすでに書かれている内容をすべて消して、以下を追加します。

nameserver 8.8.8.8

追加できない場合は以下

$ sudo rm /etc/resolv.conf
$ sudo vi /etc/resolv.conf

再度、コマンドプロンプトでUbuntu20.04を再起動します。

$ wslconfig /t Ubuntu-20.04

ここまでできたら、次はdockerのネットワーク設定をします。
今回なぜVPNにつながらないかというと、VPNとコンテナ内のmtuが異なっているからです。

コンテナ内のmtu

$ ip addr show dev eth0 | grep mtu
147: eth0@if148: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500

VPNのmtu (コマンドプロンプトで実行)

C:\Users\jinwa>netsh interface ipv4 show interfaces

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
 63          25        1400  connected     VPNの名前

コマンドの参考はこちらからしました

コンテナ内はmtuが1500に対して、VPNは1400でした。
ですので、mtuをコンテナ内で1400以下に設定する必要があります。

そこで、docker-compose.ymlの一番下にネットワーク設定を加えます。

docker-compose.yml
(省略)
networks:
  default:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 1200

VPN接続しないでPushする場合は以下を設定する

.bashrcに

.bashrc
export MTU=1200

を追加して

docker-compse.yml
networks:
  default:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: ${MTU:-1500}

docker-compose downをしてから再度起動します (キャッシュが効いている可能性があります)

docker runを使っている場合はオプションでmtuを設定できます。
ちなみにこの設定は/etc/sysconfig/docker-networkに書いても大丈夫だそうです。

docker コンテナのMTUを変更する - Changing container MTU on docker

ここまでできたら、docker-compose upをします。
docker-composeでポートが使われているというエラーがでたら、docker-compose downしてから試してみてください。

[Portが衝突したときにこちらを参考にしました] (https://qiita.com/terufumi1122/items/8253a47ff24b64455fe5)

また、Docker Desktopが動いているとエラーになるので終了しているかも確かめましょう。

これでコンテナ上からVPNを経由してGitに接続できるようになりました。

WSL2からGitができない場合

$ sudo ip link set eth0 mtu 1200

WSL2のDocker環境構築手順

今後、会社で環境構築を教えるたびに調べるのは面倒なのでまとめておきます。

WSL2をインストールしておきます

image.png

リンクをクリックしてファイルをダウンロードしインストールまでします
Windows システムツールのコントロール パネルからプログラム > Windowsの機能の有効化または無効化からLinux用Windowsサブシステム仮想マシンプラットフォームにチェックをいれてOKを押します

image.png

image.png

エラーがでなければ再起動になります(エラーがでましたが2回目で成功したこともありました)

Ubuntu20.04をインストールします。
Windowsの検索窓からMicrosoft Storeを調べて、クリックします。

Microsoft Storeのページが表示されたら検索窓から、Ubuntu 20.04 LTSを検索します。
そのあと、インストールをクリックします。
終わったら起動をクリックします。

1631239840.png

画面が開きましたら、ユーザー名とパスワードの設定を行います。
なんでもよいですが、注意としては設定中にこの画面を閉じないようにしてください。
Rootユーザーが作成されてしまい、ユーザー作成ができなくなります。

ユーザー名(ここではwatanabejin)
1631240027.png

パスワードを同じの2回入力(表示されないので注意)
1631240040.png

できると以下のような出力があります。

1 update can be applied immediately.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once a day. To disable it please create the
/home/watanabejin/.hushlogin file.
watanabejin@jinwa:~$

ここでPowershellを開いて以下のコマンドを実行します。

$ wsl --set-version Ubuntu-20.04 2
$ wsl -l -v

以下になれば成功です。

  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2

Ubuntu20.04に戻ってdockerをインストールします。

$ sudo apt-get update # ここでパスワードを求められるので先ほど設定したのを入力
# Dockerのインストール (安定板)
$ curl https://get.docker.com | sh # しばらく待つ

dockerがインストールできたか確認します。

$ docker version
Client: Docker Engine - Community
 Version:           20.10.8
 API version:       1.41
 Go version:        go1.16.6
 Git commit:        3967b7d
 Built:             Fri Jul 30 19:54:27 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

出力されていればOKです。今回は20.10.8が入りました。
そのあと、dockerデーモンを起動します。

$ sudo service docker start
#  * Starting Docker: dockerとでればOK
$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

動いていることが確認できました。

いまの状態ですと、dockerコマンドを実行する際に常に先頭にsudoを付ける必要があるのでつけなくてもいいように設定します。

$ sudo gpasswd -a $USER docker

そしてウィンドウを消してUbuntu20.04を再起動させます。
再度Ubuntu20.04を起動して、dockerデーモンを起動します。

$ sudo service docker start
# パスワードを入力

そのあとで、先ほどのコマンドをsudoなしで行います。

$ docker ps

実行できれば成功です。

次にdocker-composeをインストールします。
インストールはここを参考にしました

$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

インストールできたかを確認します。

$ docker-compose --version
docker-compose version 1.26.0, build d4451659

docker-compose 1.26.0が入っておりました。

この環境Ubuntu20.04を起動するたびにdockerデーモンを起動する必要があるためそこを起動時に実行するように設定します。

$ sudo vi .bashrc

以下の内容を下に追加します。

sudo service docker start

そして、Ubuntuのウィンドウを消して、再度起動します。
すると最初にパスワードを求められます。.bashrcでsudoコマンドを使っているためです。
パスワードを入力して、* Starting Docker: dockerと表示されれば成功です。

では、dockerのファイルを用意してdocker-compose upをしてみます。
まずは作業用ディレクトリを用意しました

$ cd /home/Ubunt20.04のユーザー名/ # 私の場合cd /home/watanabejin/
$ mkdir workspace # workspaceディレクトリを作成 (名前は自由)
$ cd workspace

作成したディレクトリ内で試しにPython環境を作ります。
ここからはVSCodeで行います。まず拡張機能からremote wslをインストールします。

1631241815.png

そして左メニューのディスプレイマークからリモート...の横のドロップダウンリストでWSL Targetsを選択します。

1631241798.png

そして、Ubuntu-20.04の横にあるディレクトリマークをクリックします。
すると別ウィンドウが開きます。これがUbuntu20.04の中になります。

先ほど作成したディレクトリを開きます。
ctrl + k + oで上にディレクトリが表示されるので、先ほど作成したディレクトリを選択してOKを押します。

1631242067.png

ここからはいつものVSCodeの使い方になります。
試しにPythonのDocker環境を作ります。
こちらを参考に作ります

以下のファイルを作成します。

/workspace
┣ Dockerfile
┣ docker-compose.yml
FROM python:3
USER root

RUN apt-get update
docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'python3'
    working_dir: '/root/'
    tty: true

そして以下のコマンドでコンテナを起動します。

$ docker-compose build
$ docker-compose up -d

# コンテナに入る
$ docker exec -it python3 bash

これで環境構築終了です。
コンテナ内でVPN接続を使う場合は上を参考にここから設定してみてください。

おわりに

需要がありそうということで、最近乗り換えたときの内容をそのまま記事にしてみました。
VPNの接続はたまたまできたというかんじなので設定が正しいかは各自判断お願いします。

参考

7
8
1

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
7
8