前に Ubuntu で Alpine Linux を動かすために LXD という仮想化ソフトを使ったのですが、このアプリは残念なことに Linux Mint では使えませんでした。(大人の事情による)
そこで代わりになるソフトを探してみたら、Podman というのが使いやすそうだったので、これを使って Alpine Linux をインストールしてみました。
Podman はDocker にコマンド体型がよく似ており、Docker に慣れている人には使いやすいと思います。(Alpine を動かして見る程度なら、Docker でなく Podman で十分です。)
Podmanのインストール
次のようにいつもの apt コマンドでインストールする。
sudo apt install podman
Alpine Linux コンテナの作成
podman run コマンドでイメージ名 alpine を指定すれば、alpine コンテナが作製される。
(例) 最も単純な起動方法
podman run -it --name alpine-test alpine sh
このコマンドの意味は docker コマンドと同じ。alpne はイメージ、alpine-test がコンテナ名。すでに同じ名前のコンテナがあると上書きされてしまうので注意。
イメージには alpine の他、以下のようなものが利用可能。(よく使われるもの)
- ubuntu
- debian
- archlinux
- fedora
- python
- node
- nginx
- httpd
- mysql
ホストとの共有ディレクトリ
docker コマンドと同じように -v オプションで、ホストとの共有ディレクトリを設定できる。
podman run -it --name alpine-test -v ホスト側のパス:コンテナ側のパス alpine sh
例えば、ホスト側の /home/user/Public をコンテナ側の /home/user/public と連携する場合は、次のようになる。
-v /home/user/Public:/home/user/public
コンテナ側でサーバを動かすとき
docker コマンドと同じように -p オプションで、ホストに公開するポートを指定できる。
podman run -it --name alpine-test -p ホスト側のポート番号:コンテナ側のポート番号 alpine sh
例えば、SSHサーバ を公開する場合、-p オプションは次のようになる。
-p 2222:22
これは、ホスト側で次のコマンドで使うことができる。(userはAlpine側のユーザ名)
$ ssh user@localhost -p 2222
ウェブサーバの場合は、このポートのペアは例として 8080:80 などとする。
コンテナの起動
コンテナの起動は docker と同じstart コマンドをを使う。この例では alpine-test というコンテナを作ったので、これを起動するには次のようにする。
podman start -ai alpine-test
コンテナのカスタマイズ
podman start でコンテナを起動すると、管理者 (root) としてル・グイン状態になる。
/ #
/ での作業は好ましくないので、cd コマンドで /root へ移動しておく。
/ # cd
~ #
ユーザの作成
コンテナには管理ユーザ root しかいないので、普段使いのためのユーザを作る。ここでは ‘user’ とする。
adduser user
user ができたら、ログインしなおすと、/home/user へ移動する。
/ # login user
Password:
Welcome to Alpine!
The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See https://wiki.alpinelinux.org/.
You can setup the system with the command: setup-alpine
You may change this message by editing /etc/motd.
8d7dd2a715f7:$ pwd
/home/user
8d7dd2a715f7:$
よく使うパッケージのインストール
exit コマンドで管理者の戻り、よく使うパッケージをインストールする。
まず、リポジトリを最新のものにアップデートし、古くなったパッケージをアップグレードしておく。
# apk update
...
# apk upgrade
...
よく使うパッケージのインストールを行う。次の例は、vim のインストール
# apk install vim
(注意) Open SSH サーバとクライアントを同時にインストールするには、openssh’ を使う。
# apk add openssh
インストールされたパッケージ一覧は次のようにすると表示できる。
~ # cat /etc/apk/world
alpine-baselayout
alpine-keys
alpine-release
apk-tools
busybox
g++
gcc
gdb
make
musl-locales
musl-utils
openssh
openssh-client
openssh-server
ruby
vim
システムがインストールしたパッケージも含めて表示するには、apk info を使う。
~ # apk info
alpine-baselayout
alpine-baselayout-data
alpine-keys
alpine-release
apk-tools
binutils
……
タイムゾーンの設定
タイムゾーンをJSTに変更する。
# パッケージのインストール
apk add tzdata
# タイムゾーンをJST(Asia/Tokyo)に設定
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
echo "Asia/Tokyo" > /etc/timezone
日本語環境
デフォルトでは英語環境になっているので、日本語を使えるようにする。
まず、Alpineで使われている標準Cライブラリ(musl libc)用に、glibc相当のロケールパッケージを追加する。
apk add musl-locales
環境変数で日本語・UTF-8を指定する。以下の内容を .profile などに追加し、source コマンドで .profile を実行する。
export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8
日本語フォントのインストール
apk add font-noto-cjk
vim の文字化け対策
vim でファイルを編集したら日本語文字列が ….. と表示される不具合が発生した。まず、.=/.vimrc を以下のように編集する。ただし、’set number’ は行番号を表示するオプションなので文字化け問題とは関係ない。
set number
set encoding=utf-8
set fileencodings=utf-8,euc-jp,sjis,cp932
set fileencoding=utf-8
それでも文字化けが起こる場合には、vim 起動時に直接 LANG を指定する。
LANG=ja_JP.UTF-8 vim ファイルのパス名
もし、これが必要なら、.profile 野中などに alias を設定するとよい。
alias vi='LANG=ja_JP.UTF-8 vim'
便利なシェルスクリプト
次のコードは、podman を直接、操作しなくてもすむシェルスクリプトである。イメージ ‘alpine’ からコンテナ ‘alpine-test’ を作成し、次回からはコンテナを実行するようにする。オプションはコード内に記述。ファイル名は ‘~/bin/alpine’ などとしてファイル保存し、実行権をつける。
#!/usr/bin/env bash
# コマンドパラメータに応じて以下のように padman コマンドを実行する。
# 1 パラメータがないとき
# podman start -ai alpine-test
# 2 パラメータが run のとき
# コンテナ alpine-test を削除して、alpine-test を作り直して起動する。
# ホストとの共有フォルダ
# ホスト: ~/Public
# ゲスト: /home/user/public
# 3 パラメータが start のとき
# パラメータがないときと同じ (start)
# 4 ラメータが help のとき
# この内容を表示
# コンテナ名・設定
CONTAINER_NAME="alpine-test"
HOST_DIR="$HOME/Public"
GUEST_DIR="/home/user/public"
HOST_SSH_PORT="2222"
GUEST_SSH_PORT="22"
# ヘルプ表示関数
show_help() {
cat << EOF
使い方: $(basename "$0") [OPTION]
オプション:
(なし) コンテナ (${CONTAINER_NAME}) を対話モードで起動します (start -ai)。
start パラメータなしと同様にコンテナを起動します。
run 既存のコンテナを削除し、共有フォルダとSSH用ポート転送を設定して再作成・起動します。
共有フォルダ: ${HOST_DIR} -> ${GUEST_DIR}
SSH転送: localhost:${HOST_SSH_PORT} -> container:${GUEST_SSH_PORT}
help このヘルプメッセージを表示します。
EOF
}
# パラメータチェック (第1引数: $1)
case "${1:-}" in
"")
# 1. パラメータがないとき
echo "コンテナ ${CONTAINER_NAME} を起動します..."
podman start -ai "$CONTAINER_NAME"
;;
"start")
# 3. パラメータが start のとき (パラメータがないときと同じ)
echo "コンテナ ${CONTAINER_NAME} を起動します..."
podman start -ai "$CONTAINER_NAME"
;;
"run")
# 2. パラメータが run のとき
echo "既存のコンテナ ${CONTAINER_NAME} を削除しています (存在する場合)..."
podman rm -f "$CONTAINER_NAME" >/dev/null 2>&1
# ホスト側共有ディレクトリが存在しない場合は作成
mkdir -p "$HOST_DIR"
echo "コンテナ ${CONTAINER_NAME} を新規作成・起動します..."
# -v で共有フォルダを指定し、:z でSELinux/権限設定を適用
# -p 2222:22 でSSH接続用のポートフォワーディングを設定
podman run -it \
--name "$CONTAINER_NAME" \
-p "${HOST_SSH_PORT}:${GUEST_SSH_PORT}" \
-v "${HOST_DIR}:${GUEST_DIR}:z" \
alpine sh
;;
"help"|"-h"|"--help")
# 4. パラメータが help のとき
show_help
;;
*)
echo "エラー: 不明なパラメータ '$1' です。" >&2
echo "" >&2
show_help
exit 1
;;
esac