# vm-04. WSL and Docker ________________________________________ ## 1. 用意 ________________________________________ ### 1.1. Git、テキストエディタの調整 WindowsからLinuxへマウントするため、改行がLFになるようにしてください .gitconfigの例 ```text [core] autocrlf = input ``` VSCode の settings.json の例 ```text "files.eol": "\n", ``` ________________________________________ ### 1.2. WSLの用意 WSL を使用して Windows に Linux をインストールする方法 https://learn.microsoft.com/ja-jp/windows/wsl/install ```powershell # install wsl --install # 削除する場合 # 1. スタートメニューアイコンからアンインストール # 2. 下記を実行 # wsl --unregister ubuntu ``` WSLがインターネットに繋がっているか確認 ```bash # Linux内で実行 # WSL起動のたびに、稀にDNS解決が変になることがある # 確認方法: curl -I https://www.google.com/ # ダメな場合の対処法: # GoogleのDNS(8.8.8.8)へ書き換え sudo vi /mnt/wsl/resolv.conf ``` vi ~/.bashrc ```shell # bash履歴は重複保存しないように HISTCONTROL=erasedups ``` ________________________________________ ### 1.3. DockerをWSLへインストール Install Docker Engine on Ubuntu | Docker Docs https://docs.docker.com/engine/install/ubuntu/ ```bash # Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update # Install sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y ``` 動作確認 ```bash sudo docker version sudo docker run hello-world ``` dockerコマンドにsudo不要化(dockerグループに現行ユーザを追加) ```bash sudo gpasswd -a $USER docker ``` ________________________________________ ### 1.4. マウント例 SWL内からの実行例 ```bash cd ~ sudo mkdir -p ./repos sudo mount -t drvfs D:\\Dropbox\\repos\\DockerSamples ./repos ``` マウント後の操作例 ```bash COMPOSE_YML_DIR=~/repos/foo-app cd $COMPOSE_YML_DIR ``` ________________________________________ ### 1.5. WSLとネットワーク 要点 ```text 1. Windows側は、WSLと繋がるための仮想NICが増える - vEthernet (WSL (Hyper-V firewall)) 2. WSL側は、↑と同一ネットワークとなるIPが割り当たる 3. 両者とも同一のhostnameを主張するが、別々である 4. WSL側からWindowsへは、「そのhostname.local」でhost名を解決できてWindowsへ到達可能(※) 5. Dockerコンテナからも、「そのhostname.local」でWindowsで到達可能(※) (※) WF等の問題がなければ。例えばノートン環境下ではFWをオフにしないとpingが到達できない ``` WindowsのWSL間のIPの確認方法 ```powershell # vEthernet (WSL (Hyper-V firewall)) ipconfig ``` WSLのIPの確認方法 ```bash # eth0 ip a ``` WSLからWindowsに繋がることの確認 ```bash # 繋がらない場合はウイルス対策ソフトのFWを停止してみること ping $(hostname).local ``` ________________________________________ ## 2. Docker ________________________________________ ### 2.1. Docker操作 dockerデーモン(サービス)操作 ```bash sudo systemctl status docker sudo systemctl restart docker ``` Docker CLI ```bash # キャッシュを利用せずリビルド docker compose build --no-cache # コンテナ群のビルド起動と終了 docker compose up -d docker compose down # 状況確認 docker ps -a docker compose logs # 起動中のコンテナに入る # ※ 別PIDになるためdocker logに記録されない NAME_OR_ID=php_fpm docker exec -it $NAME_OR_ID /bin/bash # コンテナの強制停止 docker kill $NAME_OR_ID # 全ての終了中の内容とDockerイメージキャッシュを削除 docker container prune docker image prune docker volume prune docker network prune docker system prune -a ``` コンテナ検証のため強引に起動維持したい場合 ```yaml # composeにcommandでtail -fする version: '3' services: my_service: image: your_image_name command: tail -f /dev/null ``` ________________________________________ ## 3. コンテナでnginx & php-fpm ________________________________________ nginx公式コンテナ ```text /etc/nginx/conf.d/default.conf /etc/nginx/nginx.conf # ※ 標準出力へのリンクになっている /var/log/nginx/access.log /var/log/nginx/error.log ``` ondrej phpのphp-fpmの主なパス ```text /etc/php/8.3/fpm/php-fpm.conf /etc/php/8.3/fpm/pool.d/www.conf /run/php/php8.3-fpm.pid /etc/php/8.3/fpm/pool.d/*.conf # ondrejデフォルト # /var/log/php8.3-fpm.log # 典型的に調整されたログ出力先 /var/log/php8.3-fpm/www-slow.log /var/log/php8.3-fpm/www-error.log # 開発時のみ # 本番はredisなどで、バランサノード間共有 /var/lib/php/sessions # コンテナでは使わない(デーモンではなく前景で動かすため) # /etc/init.d/php8.3-fpm # コマンドライン(前景として使用するコマンド) # which php-fpm8.3 /usr/sbin/php-fpm8.3 # php-fpm8.3 -i | grep 'Configuration File' /etc/php/8.3/fpm/php.ini # php-fpm8.3 -i | grep "Scan this dir for additional .ini files" /etc/php/8.3/fpm/conf.d/ ``` ________________________________________ ## 4. おすすめのシェル ________________________________________ source run.sh ```shell #!/bin/sh sudo mount -t drvfs D:\\Dropbox\\repos\\DockerSamples ./repos COMPOSE_YML_DIR=~/repos/foo-app cd $COMPOSE_YML_DIR docker compose up -d ```