01d. 開発環境構築(WSL2+Ubuntu18.04+Docker)(作成中)

前回WSL(Windows Subsystem for Linux)のUbuntuを使用してRails環境を構築したところ、Mac使ってる人はスムーズに構築できたのに対して、WSLでは少々手こずりました。やっぱり開発するならMacかなと思い始めた矢先、Windows10 Insider PreviewWSL2が使用できるようになりました!WSL1に比べてLinuxとの互換性が高く、Dockerも動かせるとのことで、もう暫くWindowsでもいいかなと揺れてます。

Windows 10 Insider Preview のインストール

WSL2は、Build 18917以降で利用可能ですが、2019/06/29時点では正式リリースはされていません。Windows Insider Programへ参加して、Windows10 Insider Previewをインストールすることで、Build 18917以降(開発中のバージョン)を利用できるようになります。

PCの動作が不安定になる可能性もあるので(開発中のバージョンなので)、どうしても今すぐDockerが使いたいんだー!という人以外は、正式リリースを待った方がいいと思います。

Windows 10 Insider Preview の開始方法

Windows Subsystem for Linuxの有効化

Build番号の確認

PowerShellから下記コマンドでBuild 18917以降になっていることを確認します。

PS C:\> systeminfo
ホスト名:               DEV01
OS 名:                  Microsoft Windows 10 Home Insider Preview
OS バージョン:          10.0.18922 N/A ビルド 18922

 

Windows Subsystem for Linuxの有効化

管理者としてPowerShellを開き、下記コマンドを実行後、Windowsを再起動します。
※Microsoft Storeからもインストールできますが、私はコマンドラインからの実行が好きです。

PS C:\> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux            
Path          :
Online        : True
RestartNeeded : False

Windows Subsystem for Linuxの有効化

Ubuntuディストリビューションのインストール

管理者としてPowerShellを開き、下記コマンドを実行します。

# Ubuntuディストリビューション(18.04)のダウンロード
PS C:\> Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing

# Ubuntuディストリビューションのインストール
PS C:\> .\Ubuntu.appx

インストール画面が起動後、ユーザ名とパスワードを入力するとUbuntuが起動します。

Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: user01             # ユーザ名を入力
Enter new UNIX password:                    # パスワードを入力
Retype new UNIX password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

user01@dev01:~$ exit                        # 抜ける

WSL用ディストリビューションのダウンロード

WSL2用に変換

PowerShellから下記コマンドを実行します。

PS C:\> wsl -l -v                           # WSLのバージョンを確認
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         1

PS C:\> wsl --set-version Ubuntu-18.04 2        # UbuntuのディストリビューションをWSL2用に変換
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

PS C:\> wsl -l -v                           # WSL2に変換されたことを確認
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         2
PS C:\>

参考
Windows10 20H1で導入された「WSL2」を使用する方法
「WSL2」へのバージョンアップでLinux互換環境はどう変わるのか?

ssh設定

Ubuntu上での操作

WSL2でLinuxとの互換性を向上させたり、Visual Studio Codeなどの使い勝手のよいプロダクトを生み出したりと、個人的なMicrosoftの評価は上がっているのですが、なぜターミナルはキー操作でコピペすらできないクソのままなのでしょうか?不思議で仕方ないですが、今まで通り、Teratermからssh接続できるようにしていきます。

$ ssh -V                                                # open-sshがインストールされていることを確認
OpenSSH_7.6p1 Ubuntu-4, OpenSSL 1.0.2n  7 Dec 2017
$ cd /etc/ssh                                           # /etc/sshディレクトリへ移動

# rsaは強度が弱いので、現時点では楕円曲線暗号のecdsaがベター(ローカル環境なので使わないですけど..)
$ sudo ssh-keygen -t ecdsa -N '' -f ssh_host_ecdsa_key      # keygenで秘密鍵、公開鍵を作成
Generating public/private ecdsa key pair.
Your identification has been saved in ssh_host_ecdsa_key.
Your public key has been saved in ssh_host_ecdsa_key.pub.
The key fingerprint is:
SHA256:19SWObm4YCiKrVMcMpWDcdSVNpwcrGRCYIt0+QKuweU root@dev01
The key's randomart image is:
+---[ECDSA 256]---+
| .+B=o =o+       |
|.+o== + O    . + |
|+ =..= o .  . B  |
|.ooE...  . o o o |
|.. +... S + o .  |
|.  oo. . o . .   |
|  ..o       .    |
|  ..             |
|  ..             |
+----[SHA256]-----+
$ ll
total 572
drwxr-xr-x  2 root root   4096 Jun 29 16:49 ./
drwxr-xr-x 87 root root   4096 Jun 29 16:31 ../
-rw-r--r--  1 root root 553122 Feb 10  2018 moduli
-rw-r--r--  1 root root   1580 Feb 10  2018 ssh_config
-rw-------  1 root root    227 Jun 29 16:49 ssh_host_ecdsa_key          # 公開鍵が作成されていることを確認
-rw-r--r--  1 root root    172 Jun 29 16:49 ssh_host_ecdsa_key.pub      # 秘密鍵が作成されていることを確認
-rw-r--r--  1 root root    338 Jul 26  2018 ssh_import_id
-rw-r--r--  1 root root   3262 Jul 26  2018 sshd_config

# sshdの設定
$ sudo vi sshd_config
$ diff sshd_config.org sshd_config
19c19
< #HostKey /etc/ssh/ssh_host_ecdsa_key
---
> HostKey /etc/ssh/ssh_host_ecdsa_key       # コメントを外す
56c56
< PasswordAuthentication no
---
> PasswordAuthentication yes                    # パスワード認証を許可

$ sudo service ssh restart
 * Restarting OpenBSD Secure Shell server sshd                                                                   [ OK ]

$ ssh localhost                             # ssh接続できることを確認
user01@localhost's password:
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.19.43-microsoft-standard x86_64)
  :
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.XX  netmask 255.255.255.0  broadcast 192.168.0.255   # IPアドレスを確認

 

Terateamから上記IPアドレスでssh接続

# sudoコマンド実施時、serviceコマンドについてはパスワード入力を省略できるよう追記
$ sudo visudo
    :
# Allow sudo without a password
user01  ALL=(ALL)   NOPASSWD: /usr/sbin/service
 
# ログイン時にsshが起動するよう追記
$ vi ~/.profile
    :
# ssh start
if ! service ssh status > /dev/null 2>&1 ; then
    sudo service ssh start > /dev/null 2>&1
fi
 
$ . ~/.profile                  # .profile読み込み

WSL1の時のようにlocalhostでアクセスできればよいのですが、上記URLに記載されている下記内容により、現時点ではWindows側と異なるIPアドレスを持つので、WSL2のIPアドレスを指定してssh接続する必要があります(面倒だけど、UbuntuでIPアドレスを都度確認する必要あり)。

WSL1では、Win32側とネットワークを共有していたため同じIPアドレスを持ち、localhostでWin32側へのアクセスができた。WSL2では、Win32側と異なるIPアドレスを持つだけでなく、WSL2からWin32側へアクセスする場合には、Win32側の仮想内部ネットワーク側のIPアドレスにアクセスする必要がある。Microsoftは、「これは一時的なもので、修正する優先順位リストの中で非常に高いもの」として対策中であるということだ。

下記で「apt update」を実行したところ、上手くいきませんでした。Windows側とIPアドレスが別になっていることで、外部にアクセスできなくなっているようです(ウィルス対策ソフトのFW設定を外してもダメでした)。WSL1に戻すと外部(インターネット)にアクセスできるので、パッケージのインストール等はWSL1で実施して、Dockerを使用するところで再度WSL2に変換しようと思います。

2019/08/04時点で、Microsoftによるネットワークの改良が完了しました。WSL2から外部へ接続できるようになったので「apt update」などのコマンドが使えるようになっています。WSL2Webサーバを立ち上げたら、Windows側のブラウザで「http://localhost/」で確認できるようになったので、開発環境として利用するのにはもう問題はなさそうですね!

参考
Windows Subsystem for Linux 2におけるネットワークの改良

パッケージの全更新

$ sudo apt update           # パッケージを管理しているDBを最新の状態に更新
$ sudo apt dist-upgrade     # インストールされているパッケージを全更新。追加でパッケージが必要になった場合もインストールしてくれる
$ sudo apt install build-essential  # gcc, gdb ...などの開発ツールをインストール

Djangoインストール

とりあえずDjangoでプロダクトを作成したくなったのでインストール

# pyenvのインストール
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

# 環境設定ファイルを更新
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

# pyenvのアップデート
$ git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update
$ pyenv update

# 必要なライブラリをインストール
$ sudo apt install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
$ sudo apt install zlib1g-dev

# pyenvでpython3.6.8をインストール
$ pyenv install --list
$ pyenv install 3.6.8

# python3.6.8をデフォルト設定に
$ pyenv global 3.6.8
$ python --version
$ pyenv versions
  system
* 3.6.8 (set by /home/user01/.pyenv/version)

# Pythonパッケージ管理ツールpipのインストール
$ sudo apt install python-pip
$ which pip
/home/user01/.pyenv/shims/pip

# pipアップデート
$ pip install --upgrade pip
$ pip --version
pip 19.2.2 from /home/user01/.pyenv/versions/3.6.8/lib/python3.6/site-packages/pip (python 3.6)

# Djangoインストール
$ pip install django
$ python -m django --version
2.2.4

# mysqlclientインストール
$ sudo apt install python-dev libmysqlclient-dev
$ pip install mysqlclient

$ django-admin startproject myapp	# myappプロジェクトを作成

# settings.pyを修正
$ cd ./myapp/myapp
$ diff settings.py.org settings.py
変更前: ALLOWED_HOSTS = []
変更後: ALLOWED_HOSTS = ['*']              # どこからでもアクセスできるように

$ cd ~/myapp
$ python manage.py runserver

# 上記でNGの場合
$ python manage.py runserver 0.0.0.0:8000

http://localhost:8000/でWebサーバにアクセス

MySQLインストール

DBも当然必要になってくるので、下記を参考にインストールします。管理者(root)パスワードは、インストール後に mysql_secure_installation コマンドを実行して設定するようになったようです。

参考
【Ubuntu 18.04 LTS】MySQLサーバを動かす

Visual Studio Codeでコーディング

コマンドを叩くのはWSL2上のUbuntuでいいとしても、エディタはやっぱりvimよりもVSCodeを使いたい。下記を参照したところ、VSCodeからWSL2のUbuntuのファイルにアクセスできるようになりました!

参考
VSCodeをWSL2のUbuntuのエディターとして使用

※ 続きというか、本題のDockerについては、時間が取れ次第、、別途記載していきます(10月以降?)

タイトルとURLをコピーしました