🌊

WSL + Ubuntuで始めるDocker開発環境構築ガイド

に公開

はじめに

Dockerの基本概念から、WSL上のUbuntuへの導入方法、頻出コマンド、実践的なDockerfileやdocker-compose.ymlの記述方法、軽量化テクニックまでを一貫して解説します。本記事は、業務効率化や環境統一を目指す開発者に向けた内容です。(著者個人の備忘録的な意味も含む)

対象読者

  • Dockerについて知りたい人
  • DockerDesktopを使わずにWSL上でDocker環境構築がしたい人
  • Dockerコマンド、docker composeコマンドの簡単な使い方を知りたい人
  • マルチステージビルドやdistroless等軽量化をしたい人

Dockerとは何か?

Dockerは、仮想化技術の一種であり、「コンテナ型仮想化」を採用しています。他の仮想化(ホスト型、ハイパーバイザー型)と比較して、軽量かつ高速である点が特長です。

仮想環境の種類

  • ホスト型:VirtualBoxなど。GUIで扱いやすいが、リソース消費が大きい。
  • ハイパーバイザー型:ESXiやHyper-Vなど。効率的だが導入が難しい。
  • コンテナ型:DockerやKubernetesなど。OSを共有しつつアプリを隔離。高速で軽量。

コンテナを使う理由

  • 環境構築が簡単
  • チーム内で環境差異が少ない
  • 軽量・高速
  • クラウドサービスとの相性が良い

環境構築

推奨環境

  • OS: Windows 11
  • WSL: 2.1.5.0以上
  • Ubuntu: 22.04.4LTS以上

なぜDocker Desktopを使わないのか?

  • WSL内で直接動かしたほうが高速
  • Docker Desktopのライセンス費用を避けられる

インストール手順

# 古いバージョンがある場合の削除
sudo apt remove docker docker-engine docker.io containerd runc

# リポジトリの設定
sudo apt update
sudo apt install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Dockerのインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 動作確認
sudo docker run hello-world

# 一般ユーザでDockerを使えるように
sudo usermod -aG docker $USER

基本コマンド集

Dockerイメージに関するコマンド

# イメージのダウンロード
docker pull イメージ名[:タグ名]

# イメージ一覧
docker image ls

# イメージのビルド
docker image build .

コンテナ操作

# コンテナの起動
docker container run イメージ名

# コンテナの再起動・停止・削除
start/stop/restart/rm それぞれのサブコマンドで対応

コンテナ内に入る

# Debian系
docker exec -it container名 bash

# Alpine系
docker exec -it container名 ash

docker compose
docker composeは複数のコンテナサービスを立ち上げる際に便利、もちろん一つのコンテナサービスの場合でも使えます。

# ビルド
docker compose build

# 起動
docker compose up -d

# 停止
docker compose down

Dockerfileとdocker-compose.ymlの例

ディレクトリ構成
以下のようなディレクトリ構成で作成します。

.
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
└──app
   └── main.py

Python3.11環境を作るDockerfileの例

# builder
FROM python:3.11-slim-bookworm as builder
RUN apt update -y && apt upgrade -y
WORKDIR /app
COPY ./app ./
RUN pip install -r requirements.txt

docker-compose.yml

services:
  python_env:
    image: python_env
    container_name: python_env
    build:
      context: .
      dockerfile: ./Dockerfile
    tty: true
    volumes:
      - ./app/:/app/
    environment:
      TZ: Asia/Tokyo

イメージ軽量化テクニック

イメージを軽量化することでAWS等でイメージを保存する際のサイズの削減、Lambdaをコンテナイメージで使う際の起動速度を上げる効果が期待されます。

レイヤ削減

Dockerfileで実行する処理の数(コメント除く)を減らすとイメージの軽量化につながります。

# Bad
RUN apt update -y
RUN apt upgrade -y

# Good
RUN apt update -y && apt upgrade -y

マルチステージビルドの活用・slim, distrolessの活用

マルチステージビルドの効果

  • 開発用・本番用の分離
  • イメージサイズ削減とセキュリティ向上

slim, alpine, distrolessの活用

  • slim:軽量イメージ
  • alpine:軽量イメージ、環境が大きく変わるので使用には注意が必要
  • distroless:最小構成でセキュア、ただしshellもないのでデバッグしにくい

軽量化Dockerfile構成例

マルチステージビルドとdistrolessによって開発環境のdevelopイメージ、本番環境であるproductionイメージを作るDockerfileの例

# builder
FROM python:3.11-slim-bookworm as builder
RUN apt update -y && apt upgrade -y
WORKDIR /app
COPY ./app ./
RUN pip install -r requirements.txt

# develop
FROM python:3.11-slim-bookworm as develop
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages/
COPY --from=builder /app /app/

# production
FROM gcr.io/distroless/python3-debian12:latest as production
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/lib/python3.11/dist-packages/
COPY --from=builder /app /app/

おわりに

このような開発のテクニックを今後も紹介していきたいと思います。この記事が誰かの役に立てば幸いです。

Discussion