🚨
PCの環境汚染を食い止めろ ~Docker編~
概要
多くの方が、記事に書いてある設定をとりあえず試してみた経験があるのではないでしょうか。
しかし、期待値通りに動作しなかった場合、試した設定をきれいに消している方は多くはないと思います。
本書では、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