🚨

PCの環境汚染を食い止めろ ~Docker編~

2024/07/04に公開

概要

多くの方が、記事に書いてある設定をとりあえず試してみた経験があるのではないでしょうか。
しかし、期待値通りに動作しなかった場合、試した設定をきれいに消している方は多くはないと思います。

本書では、Dockerを使用してUbuntuコンテナを作成し、コンテナ内でテストすることでPCの汚染を防ぐ方法について詳しく解説します。コンテナを利用することで、OS本体に影響を与えることなく、様々なコマンドや設定を安全に試すことができます。

環境

OS:Ubuntu 22.04.3(筆者はWSL内)

構成

Docker Compose + Dockerfile でコンテナを管理しましょう。
管理を怠ると、結果的に環境汚染につながります。

手順

Dockerのインストール

# install
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# iptables-nft -> iptables-legacy 切り替え(WSL2 + Ubuntu22.04のみ)
sudo update-alternatives --config iptables

# sudo 権限なしで dockerコマンド
sudo usermod -aG docker $USER
# セッションリフレッシュ
exec su -1 $USER

# Docker 起動
sudo systemctl start docker

Dockerfile 作成

# コンテナ作業用のディレクトリ作成
mkdir test-container && cd test-container

# Dockerfile作成
cat <<EOF > ./Dockerfile
FROM ubuntu:22.04 
RUN sed -i '/\[ -z "\$PS1" \] && return/d' ~/.bashrc

RUN apt update \
    && apt install -y locales \
    && locale-gen ja_JP.UTF-8 \
    && echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc

# 必要なパッケージをインストール
RUN apt update && apt upgrade -y && \
    apt install -y emacs curl net-tools less

# systemdを起動するための設定、不要な場合は削除してください
CMD ["/sbin/init"]
EOF

docker-compose.yml 作成

cat <<EOF > ./docker-compose.yml
services:
  test-container:
    build: .
    container_name: "test-container"
    tty: true
    privileged: true # Dockerfileで/sbin/initをする場合は特権モードを設定します。
EOF

Docker 起動/テスト/削除

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

docker compose up -d

以下コマンドでコンテナへ接続し、テストを実施します。

docker compose exec test-container bash

テストが完了したらコンテナを削除しましょう。
以下のコマンドはコンテナの削除に加え、イメージやボリューム等も削除できます。

docker compose down --rmi all --volumes --remove-orphans

おまけ

テスト内容を保管しよう

テストのたびにDockerfileを書き換えていると、前に何を試したかを辿ることができません。
そのため、Dockerfileを別名で定義するのがおすすめです。
よく使う設定をDockerfile内にCommon settingとして記載しておくといいかもですね。

以下、筆者がtextual-webの動作を試験した際の構成です。

.
├── docker-compose.yml
├── Dockerfile
└── textual-web
./textual-web
# ╔════════════════╗
# ║ Common setting ║
# ╚════════════════╝

FROM ubuntu:22.04
RUN sed -i '/\[ -z "\$PS1" \] && return/d' ~/.bashrc

RUN apt update && \
    apt install -y locales && \
    locale-gen ja_JP.UTF-8 && \
    echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc

RUN apt update && apt upgrade -y && \
    apt install -y net-tools emacs curl

# ╔═════════════════════╗
# ║ textual-web setting ║
# ╚═════════════════════╝

WORKDIR /root

# 必要なパッケージをインストール
RUN export DEBIAN_FRONTEND=noninteractive && \
    apt install -y git libbz2-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libffi-dev zlib1g-dev libsqlite3-dev tk-dev liblzma-dev && \
    apt clean && \
    rm -rf /var/lib/apt/lists/*

# pyenvの設定
RUN curl https://pyenv.run | bash && \
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc && \
    echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc && \
    echo 'eval "$(pyenv init -)"' >> ~/.bashrc

# pythonインストール & textual-webインストール
SHELL ["/bin/bash", "-c"]
RUN source ~/.bashrc && \
    pyenv install 3.12.4 && \
    pyenv global 3.12.4 && \
    python -m pip install textual-web
docker-compose.yml
services:
  ubuntu:
    build:
      context: .
      dockerfile: textual-web
    container_name: "ubuntu"
    tty: true

最後に

本書ではUbuntuコンテナの作成を例に紹介してきました。
開発者などが拾ったソースコードを試す際には、UbuntuではなくAlpineなどの軽量なディストリビューションを利用する方がよい場合もあります。
本書が、皆さんのPC環境汚染を食い止める導入となれば幸いです。

Discussion