WSL2 + Ubuntu18.04 + Docker 환경 구축

소개



어드벤트 캘린더 11일째 기사입니다.
이번에는 Windows에서 WSL2 환경을 설정하는 방법을 소개합니다.

글쎄, 기사가 많이 있지만 정보가 오래된 오류가 발생하여 잘 작동하지 않습니다. . .
기사와 터미널을 왔다 갔을 때 시간이 걸리거나 설정에 번거로움을 느끼는 경우가 많지 않을까요?

본 기사에서는, 그런 힘든 설정을 쉘 스크립트로 대부분을 구축하는 방법을 소개합니다.

환경


  • Ubuntu18.04LTS(64bit)를 상정하고 있습니다.
    ※Ubuntu 20.04의 경우는, 적절히 치환해 주세요.
  • Windows OS 빌드 19041 이상

  • Ubuntu 18.04 설치



    Microsoft Store에서 Ubuntu 18.04LTS 설치


    WSL1 설정



    설치된 Ubuntu 18.04를 시작 메뉴에서 열어 사용자 이름과 암호를 설정합니다.

    Ubuntu18.04 터미널
    # 初回起動時は初期設定が必要
    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: # <= ログインユーザ名を設定
    Enter new UNIX password: # <= ログインパスワードを設定(sudo コマンド実行時等に必要なため忘れないようにする)
    Retype new UNIX password: # <= ログインパスワードをもう一度入力
    
    # 初期設定を行うと WSLにUbuntu 18.04 ディストロが追加される
    # ここで一旦終了する
    $ exit
    

    WSL2 활성화



    PowerShell을 관리자 권한으로 열고 다음 명령을 입력합니다.
    # WSL2 を使うために、Windows仮想化機能(Hyper-V)を有効化
    > Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
    この操作を完了するために、今すぐコンピューターを再起動しますか?
    [Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"): # そのままENTERして再起動
    
    # 再起動が完了したらWSLのバージョン確認
    ## 現状の Ubuntu 18.04はVersion 1 になっているはずです
    > wsl -l -v
      NAME            STATE           VERSION
    * Ubuntu-18.04    Stopped         1
    
    # 先にインストールしていたUbuntu 18.04をWSL2環境に変換する
    > wsl --set-version Ubuntu-18.04 2
    
    # 「WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。」というエラーが出た場合
    ## => https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi をインストールして再実行する
    
    # 変換が完了したらバージョン確認
    ## Ubuntu 18.04がVersion 2になっていればOK
    > wsl -l -v
      NAME            STATE           VERSION
    * Ubuntu-18.04    Stopped         2
    

    WSL2 활성화가 완료되었습니다.
    다음은 WSL2를 열고 기본 설정을 수행합니다.

    기본 설정



    우분투 환경을 일괄적으로 설정하기 위한 쉘 스크립트를 준비했습니다.
    기사를 보면서 복사하지 않고 기본적인 것은 일괄 적으로 설치할 수 있습니다.

    할 일


  • 미들웨어 설치

  • 작동에 필요한 기본 미들웨어 설치

  • Python 및 Node.js를 빌드하는 데 필요한 미들웨어를 설치하십시오


  • 컬러 테마 설정

  • ColorTool을 사용하여 OneHalfDark 테마를 적용합니다


  • Linuxbrew 설치
  • Mac에서 친숙한 Homebrew의 Linux 버전입니다.


  • Docker 설치
  • Windows 용 Docker 클라이언트를 설치하지 않고 WSL 내에서 완벽한 Docker 환경을 구축합니다.
  • 이점은 Docker 클라이언트를 항상 시작할 필요가 없으므로 리소스를 절약 할 수 있습니다.


  • 쉘 스크립트로 실행


    ~/init.sh를 만들고 아래의 전체 텍스트 복사
    스크립트의 [USER_NAME]를 자신의 Windows 사용자 이름으로 변경합니다.

    ~/init.sh
    #!/bin/bash
    
    
    install_colortool()
    {
      echo 'カラーテーマの適用'
      # ColorToolのダウンロード先
      ## [USER_NAME]はWindowsのユーザ名に適宜変更
      DOWNLOAD_PATH="/mnt/c/Users/[USER_NAME]/Downloads"
      # 適用したいカラーテーマ(今回はOneHalfDarkを選択)
      # 変えたい場合は、ColorTool.exe -s で選択可能なテーマを確認して置き換える
      COLOR_THEME="OneHalfDark.itermcolors"
    
      echo 'ColorTool.zipのダウンロード'
      wget -P "${DOWNLOAD_PATH}" https://github.com/microsoft/terminal/releases/download/1904.29002/ColorTool.zip
    
      echo 'zipファイルの解凍'
      unzip "${DOWNLOAD_PATH}/ColorTool.zip" -d "${DOWNLOAD_PATH}/ColorTool"
    
      echo 'zipファイルの削除'
      rm "${DOWNLOAD_PATH}/ColorTool.zip"
    
      echo 'カラーテーマの種類'
      `echo ${DOWNLOAD_PATH}/ColorTool/ColorTool.exe -s`
    
      echo 'OneHalfDarkテーマの選択'
      # その他のテーマを変更したい場合は-dオプションの後を置き換える
      `echo ${DOWNLOAD_PATH}/ColorTool/ColorTool.exe -d ${COLOR_THEME}`
    
      echo '解凍したフォルダの削除'
      rm -r "${DOWNLOAD_PATH}/ColorTool"
    }
    
    
    install_linuxbrew()
    {
      echo 'Linuxbrew (Linux版の Homebrew パッケージマネージャ) 導入'
      ## Linuxbrew を使うことで最新の開発ツール等を導入しやすくなる
      sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
      echo 'PATHを通す'
      echo 'export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"' >> ~/.bashrc
      source ~/.bashrc
    
      echo 'Linuxbrew で各種開発ツールを導入'
      ## curl や git などは、最新版を使う方が良いため、改めて Linuxbrew で導入しなおす
      brew install curl git wget gcc zlib libzip bzip2 readline openssl pkg-config autoconf
      exec $SHELL -l
    }
    
    
    install_anyenv()
    {
      echo 'Linuxbrewでanyenv導入'
      brew install anyenv
      anyenv install --init
    
      source ~/.bashrc
    
      echo 'anyenv update plugin の導入'
      mkdir -p $(anyenv root)/plugins
      git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
      anyenv update
    
      echo 'バージョン確認'
      anyenv -v
    }
    
    
    install_docker()
    {
      echo 'Docker (Community Edition) インストール'
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
      sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
      sudo apt update && sudo apt install -y docker-ce
    
      # /sbin/mount -a 実行時に rc ファイルシステムをマウントするように設定
      echo 'none none rc defaults 0 0' | sudo tee -a /etc/fstab
      # /sbin/mount.rc ファイルを実行可能スクリプトとして作成
      echo '#!/bin/bash' | sudo tee /sbin/mount.rc
      sudo chmod +x /sbin/mount.rc
    
      echo 'WSL2再起動時dockerデーモンをスタートアップに登録するための設定'
      echo 'service docker start を /sbin/mount.rc に追記'
      echo 'service docker start' | sudo tee -a /sbin/mount.rc
    
      # WSL2にはcgroup用ディレクトリがデフォルトで作られていないため、以下もスタートアップスクリプトに登録しておく
      ## これをしておかないと Docker でプロセスのグループ化が必要になったときにエラーが起きる
      echo 'mkdir -p /sys/fs/cgroup/systemd && mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd' | sudo tee -a /sbin/mount.rc
    
    
      # dockerデーモン起動
      sudo service docker start
      # WSL2 には cgroup 用ディレクトリがデフォルトで作られていないため作成しておく
      sudo mkdir -p /sys/fs/cgroup/systemd
      sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
    
      echo 'docker-compose 導入'
      sudo curl -L https://github.com/docker/compose/releases/download/1.26.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
      sudo chmod +x /usr/local/bin/docker-compose
    
      echo 'Dockerをsudoなしで実行可能に'
      echo '※ カレントユーザーをdockerグループに所属させた上で docker.sock へのグループ書き込み権限を付与すればよい'
      sudo gpasswd -a $USER docker
      sudo chgrp docker /var/run/docker.sock
      sudo service docker restart
    
      echo '設定を反映するためにターミナル再起動'
      exec $SHELL -l
    }
    
    
    echo 'Linuxシステムアップデート'
    sudo apt update && sudo apt upgrade -y
    # ビープ音を鳴らさないように設定
    echo "set bell-style none" >> ~/.inputrc
    echo 'Linuxbewの動作に必要なパッケージのインストール'
    sudo apt install -y vim curl git ruby
    echo 'openjdkは個人開発で必要なため一応インストール'
    sudo apt install -y openjdk-11-jdk
    echo 'Pythonビルドに必要なミドルウェアのインストール'
    sudo apt install -y zlib1g-dev libssl-dev libbz2-dev libsqlite3-dev libffi-dev \
        build-essential libreadline-dev tk-dev liblzma-dev libgdbm-dev libdb-dev
    echo 'https通信を可能にするためのミドルウェアをインストール'
    sudo apt install -y software-properties-common apt-transport-https ca-certificates
    
    
    echo '==========linux brewのインストール========='
    install_linuxbrew
    echo '==========linux brewのインストール完了========='
    echo '==========anyenvのインストール========='
    install_anyenv
    echo '==========anyenvのインストール完了========='
    echo '==========Dockerのインストール========='
    install_docker
    echo '==========Dockerのインストール完了========='
    

    실행 속성을 주어 실행한다.
    # 実行属性の付与
    $ chmod +x init.sh
    
    # シェルの実行
    $ ./init.sh
    

    Python 및 Node.js 설치



    기본 설정으로 설치한 anyenv를 사용하여 Python과 Node.js를 설치합니다.
    이것들을 쉘 스크립트에 포함하지 않은 이유는, exec $SHELL -l (을)를 실행할 때 프로그램이 종료해 버리기 (위해)때문입니다.
    단계가 많지 않으므로 필요한 경우 설치합시다.

    파이썬 설치



    pyenv를 사용하여 Python 3.9를 설치합니다.
    # anyenv を使って pyenv 導入
    $ anyenv install pyenv
    $ exec $SHELL -l
    
    # pyenvでPython 3.9をインストール
    $ pyenv install 3.9.0
    
    # pyenvによるPythonのバージョン指定
    $ pyenv global 3.9.0
    
    # 現在選択されているバージョンを確認
    $ pyenv versions
    
    # Pythonのバージョン確認
    $ python --version
    
    # pipパッケージマネージャを更新しておく
    $ pip3 install --upgrade pip setuptools
    
    # pipのバージョン確認
    $ pip3 --version
    

    (추기) 에러 회피



    pyenv의 사양 변경으로 이대로라면 Warning이 WSL 기동할 때마다 나오기 때문에.bashrceval "$(anyenv init -)" 위에 다음을 추가합니다.

    .bashrc
    export PYENV_ROOT="$HOME/.anyenv/envs/pyenv"
    export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init --path)"
    if command -v pyenv 1>/dev/null 2>&1; then
      eval "$(pyenv init -)"
    fi
    eval "$(anyenv init -)"
    

    Node.js 설치



    nodenv를 사용하여 Node.js 15.2.0를 설치합니다.
    # anyenvを使ってnodenv導入
    $ anyenv install nodenv
    $ exec $SHELL -l
    
    # nodenv-yarn-install プラグイン導入: nodenv install 時にyarnもインストールする
    $ mkdir -p "$(nodenv root)/plugins"
    $ git clone https://github.com/pine/nodenv-yarn-install.git "$(nodenv root)/plugins/nodenv-yarn-install"
    $ export PATH="$HOME/.yarn/bin:$PATH" >> ~/.bashrc
    
    # Node.js 15.2.0インストール
    $ touch $(nodenv root)/default-packages
    $ nodenv install 15.2.0
    
    # Node.js 15.2.0 に切り替え
    $ nodenv global 15.2.0
    
    # 現在選択されているバージョンを確認
    $ nodenv versions
    
    # シェルの再起動
    $ exec $SHELL -l
    
    # Node.jsバージョン確認
    $ node -v
    
    # yarnバージョン確認
    $ yarn -v
    

    결론



    이번에는 WSL2 설정을 소개했습니다.
    Docker 환경이 WSL 내에서 완결되므로 정말 리눅스에 가까운 형태로 이용할 수 있을 것 같습니다.
    내일은 @tadahaya씨의 기사입니다. 기대하세요 🎉

    좋은 웹페이지 즐겨찾기