「インストール - Podman」の版間の差分
349行目: | 349行目: | ||
<br> | <br> | ||
# コンテナを新しいメージとして作成する。 | # コンテナを新しいメージとして作成する。 | ||
#: <code>podman commit <コンテナID> <任意のイメージ名> | #: <code>podman commit <コンテナID> <任意のイメージ名></code> | ||
# 作成したイメージをファイルとして保存する。 | # 作成したイメージをファイルとして保存する。 | ||
#: <code>podman save <上記で入力した任意のイメージ名> > <バックアップするファイル名>.tar</code> | #: <code>podman save <上記で入力した任意のイメージ名> > <バックアップするファイル名>.tar</code> | ||
<br> | <br> | ||
==== バックアップしたコンテナの復元 ==== | ==== バックアップしたコンテナの復元 ==== | ||
podman load -i <バックアップしたファイル名>.tar | podman load -i <バックアップしたファイル名>.tar |
2024年2月4日 (日) 06:47時点における版
概要
コンテナとは、ソフトウェアプロセスやマイクロサービスをパッケージ化して、あらゆるコンピューティング環境で実行可能にするソフトウェアソリューションである。
コンテナに含まれるファイルには、アプリケーションコード、環境変数、設定コード、バイナリプログラム、ソフトウェアの依存関係、ライブラリ等がある。
これらのコンポーネントをバンドルするプロセスはコンテナ化と呼ばれ、最終的な製品はコンテナイメージとして知られている。
このイメージは、クラウド、オンプレミスのデータシステム、ローカルシステム等、あらゆるプラットフォームにデプロイされる。
Podman (Pod Manage) は、Open Container Initiatives (OCI) のコンテナイメージを開発、管理、本番環境で実行する時に使用するコンテナエンジンである。
OCIは、コンテナフォーマットとランタイムに関するOSレベルの仮想化ソフトウェアコンテナのオープンなガバナンス構造を実装するために設計された。
Podmanコンテナは、スーパユーザ / 非スーパーユーザのいずれでも実行可能である。
Podmanのソケットアクティベーション
ソケットアクティベーションは、systemdがソケット (TCP、UDP、Unixソケット等) を作成することで機能する。
クライアントがソケットに接続する時、systemdはソケット用に設定されたsystemdサービスを起動する。
新しく起動されたプログラムは、ソケットのファイルディスクリプタを継承して、着信した接続を受け付けることができる。 (システムコールのaccept()
を実行する)
これにより、デフォルトのsystemdソケット設定であるAccept=no
に対応し、サービスがソケットを受け付けるようになる。
Podmanは、2種類のソケットアクティベーションをサポートしている。
- APIサービスのソケットアクティベーション
- コンテナのソケット起動
Podmanのインストール
パッケージ管理システムからインストール
# RHEL sudo yum install epel-release sudo dnf install podman # SUSE sudo zypper install podman
Tarballからインストール
※注意
スタティックビルド済みのPodmanを使用する場合は、Podman Desktopが使用できないことに注意する。
PodmanのGithubにアクセスして、スタティックビルド済みのPodmanをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf podman-remote-static-linux_<アーキテクチャ名>.tar.gz cd bin mv podman-remote-static-linux_<アーキテクチャ名> podman
必要ならば、Podmanを任意のインストールディレクトリに配置する。
mkdir -p <任意のインストールディレクトリ> mv podman <任意のインストールディレクトリ>
~/.profileファイル等に、環境変数PATH
およびソケットの設定を記述する。
vi ~/.profile
# ~/.profileファイル
export PATH="<Podmanのインストールディレクトリ>:$PATH"
export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock
SUSEにおいて、パッケージ管理システムにgvproxyパッケージが存在しないため、手動でgvproxyをインストールする必要がある。
まず、gvproxyのGithubにアクセスして、gvproxyをダウンロードする。
ダウンロードしたgvproxyのファイル名を変更して、/usr/libexec/podmanディレクトリまたは/usr/local/libexec/podmanディレクトリにコピーする。
mv gvproxy-linux-<アーキテクチャ名> gvproxy sudo mkdir -p /usr/libexec/podman または sudo mkdir -p /usr/local/libexec/podman sudo mv gvproxy /usr/local/libexec/podman
ソースコードからインストール
Goのバージョンが1.16未満の場合
もし、パッケージ管理システムのGoのバージョンが1.16未満の場合は、Goの公式Webサイトにアクセスして、Goをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf go<バージョン>.linux-<アーキテクチャ名>.tar.gz mv go<バージョン>.linux-<アーキテクチャ名> Go
必要ならば、Goを任意のインストールディクトリに配置する。
mv Go <任意のインストールディレクトリ>
~/.profileファイル等に、環境変数PATH
を追記する。
export GOPATH=<Goのインストールディレクトリ>
export PATH=/<Goのインストールディレクトリ>/bin:$PATH
最新のconmonが必要な場合
最新バージョンのconmonがシステムにインストールされていることが期待される。
conmonは、OCIランタイムをモニタリングするために使用される。
conmonのビルドに必要なライブラリをインストールする。
# SUSE sudo zypper install meson ninja glib2-devel libseccomp-devel
conmonのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf conmon-<バージョン>.tar.gz cd conmon-<バージョン>
または、git clone
コマンドを実行して、ソースコードをダウンロードする。
git clone https://github.com/containers/conmon cd conmon
conmonをビルドおよびインストールする。
meson --prefix=<Podmanのインストールディレクトリ> ./build ninja -C ./build ninja -C ./build install
conmonファイルは/<Podmanのインストールディレクトリ>/liexec/podmanディレクトリにインストールされるため、binディレクトリへのシンボリックリンクを作成する。
ln -s /<Podmanのインストールディレクトリ>/liexec/podman/conmon /<Podmanのインストールディレクトリ>/bin/conmon
最新のcrun /runcが必要な場合
最新バージョンのcrun /runcがシステムにインストールされていることが期待される。
crun /runcは、Podmanによりその1つがデフォルトのランタイムとしてピックアップされる。(crunはruncよりも優先される)
crun /runcのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf runc-<バージョン>.tar.gz cd runc-<バージョン>
または、git clone
コマンドを実行して、ソースコードをダウンロードする。
git clone https://github.com/opencontainers/runc.git cd runc
crun /runcをビルドおよびインストールする。
# SELinux, SECcompを有効にする場合 make BUILDTAGS="selinux seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) # SELinux, SECcompを無効にする場合 make BUILDTAGS="" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) make PREFIX=<Podmanのインストールディレクトリ> install
CNIネットワークの設定
※注意
CNIバックエンドは非推奨であり、Podman 5.0以降ではNetavarkが優先されるため、CNIネットワークは削除される予定である。
CNIネットワーキングの基本的な設定は、Podmanのビルド時で行われており、Podmanを使用するために他の設定は必要ない。
追加の設定を行う場合は、CNIネットワークの設定ファイルをダウンロードして、/etc/containersディレクトリに配置する。
sudo mkdir -p /etc/containers sudo curl -L -o /etc/containers/registries.conf https://src.fedoraproject.org/rpms/containers-common/raw/main/f/registries.conf sudo curl -L -o /etc/containers/policy.json https://src.fedoraproject.org/rpms/containers-common/raw/main/f/default-policy.json
CNIネットワークの設定の詳細は、PodmanのGithubに記載されている。
ユーザネームスペースの有効化
Linuxカーネルがユーザネームスペースをサポートしているかどうかを確認する。
zgrep CONFIG_USER_NS /proc/config.gz # 出力例: ユーザネームスペースをサポートしている場合 CONFIG_USER_NS=y
もし、ユーザネームスペースが無効の場合は有効にする。
# ユーザネームスペースを一時的に有効にする sudo sysctl kernel.unprivileged_userns_clone=1 # ユーザネームスペースを恒久的に有効にする echo 'kernel.unprivileged_userns_clone=1' > /etc/sysctl.d/userns.conf
Podmanのビルド
Podmanのビルドに必要なライブラリをインストールする。
# RHEL sudo dnf install 'dnf-command(builddep)' sudo dnf builddep rpm/podman.spec --enablerepo=codeready-builder-for-rhel-$(rpm --eval %{?rhel})-$(uname -m)-rpms sudo dnf install conmon containers-common crun iptables netavark nftables slirp4netns # SUSE sudo zypper install pkg-config libseccomp-devel libgpgme-devel libbtrfs-devel device-mapper-devel systemd-devel libapparmor-devel protobuf-devel # Raspberry Pi / Mobian sudo apt install btrfs-progs git uidmap pkg-config crun golang-go go-md2man iptables libassuan-dev libbtrfs-dev libc6-dev libdevmapper-dev libglib2.0-dev \ libgpgme-dev libgpg-error-dev libprotobuf-dev libprotobuf-c-dev libseccomp-dev libselinux1-dev libsystemd-dev libapparmor-dev \ netavark # 古いバージョンのRaspbian OSの場合、netavarkパッケージが利用できない場合がある # その場合、containernetworking-pluginsパッケージをインストールする
PodmanのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf podman-<バージョン>.tar.gz cd podman-<バージョン>
または、git clone
コマンドを実行して、Podmanのソースコードをダウンロードすることもできる。
git clone git clone https://github.com/containers/podman/ cd podman
Podmanをビルドおよびインストールする。
# SELinux, SECcomp (syscall filtering) を有効にする場合 make BUILDTAGS="selinux seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) # AppArmor, SECcomp (syscall filtering) を有効にする場合 make BUILDTAGS="apparmor seccomp" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) # SELinux, SECcomp (syscall filtering) を無効にする場合 make BUILDTAGS="" PREFIX=<Podmanのインストールディレクトリ> -j $(nproc) make install PREFIX=<Podmanのインストールディレクトリ>
~/.profileファイル等に、環境変数PATH
およびソケットの設定を記述する。
vi ~/.profile
# ~/.profileファイル
export PATH="<Podmanのインストールディレクトリ>:$PATH"
export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock
SUSEにおいて、パッケージ管理システムにgvproxyパッケージが存在しないため、手動でgvproxyをインストールする必要がある。
まず、gvproxyのGithubにアクセスして、gvproxyをダウンロードする。
ダウンロードしたgvproxyのファイル名を変更して、/usr/libexec/podmanディレクトリまたは/usr/local/libexec/podmanディレクトリにコピーする。
mv gvproxy-linux-<アーキテクチャ名> gvproxy chmod u+x gvproxy sudo mkdir -p /usr/libexec/podman または sudo mkdir -p /usr/local/libexec/podman sudo mv gvproxy /usr/libexec/podman または sudo mv gvproxy /usr/local/libexec/podman
Podmanの設定
Dockerから移行する場合
DockerからPodman Desktopに透過的に移行するため、環境変数DOCKER_HOST
を使用することができる。
- 使い慣れたDockerコマンドを使い続けることが可能である。
- Podmanの利点を活用できる。
- GradleやTestcontainers等のツールは、再設定なしでPodmanと通信することができる。
Podmanソケットファイルの場所を確認する。
podman info --format '{{.Host.RemoteSocket.Path}}'
Podmanソケットの場所を設定するため、~/.profileファイル等に環境変数DOCKER_HOST
に記述する。
vi ~/.profile
# ~/.profileファイル
export DOCKER_HOST="unix://<Podmanソケットファイルのパス>"
Linux仮想マシンの初期化
コンテナが実行される新しいLinux仮想マシンを初期化する。
VMにアクセスするためのSSHキーが自動的に生成されて、VM内のスーパーユーザアカウントとユーザアカウントへのシステム接続が追加される。
podman machine init
デフォルトでは、VMのディストリビューションはカスタムFedoraイメージに基づくWSLを除き、Fedora CoreOSである。
一般的なFedora CoreOSのアップグレードは14日ごとに行われるが、自動アップデートのZincataはPodmanマシンでは無効になっている。
Linux仮想マシンを開始する。
podman machine start
Podmanマシンの接続の設定
各Podmanマシンは2つのデフォルト接続を公開する。
Podmanのデフォルト接続は1つのみ選択することができる。
- ルートレス
- ルートフル
Podman DesktopやKind等の他のツールはデフォルト接続に接続する。
もし、別のPodmanマシンの作成等により、デフォルトのPodmanマシン接続が変更された可能性があるイベントが発生した場合、デフォルト接続の確認と設定を検討すること。
まず、Podmanマシンの接続を確認する。
podman system connection ls
次に、Podmanマシンのデフォルト接続を任意の接続に設定する。
podman system connection default podman-machine-default # または podman system connection default podman-machine-default-root
Podmanマシンのデフォルト接続が変更されているかどうかを確認する。
podman system connection ls
デフォルト接続を持つPodmanマシンを再起動する。
podman machine stop podman machine start
Podman DesktopとPodmanの接続を更新する。
Podman Desktopのメイン画面右下にある[電球]アイコンを選択して[トラブルシューティング]ページを開き、[プロバイダーを再接続]ボタンを押下する。
Podmanの動作確認
Podmanの動作を確認するため、テストイメージをダウンロードして実行する。
podman run hello-world
Podmanコマンド
Podmanイメージの検索
Docker Hubからイメージを検索およびダウンロードする。
podman search <イメージ名>
Podmanイメージのダウンロード
podman pull <イメージ名> # 例: Ubuntuの公式イメージをダウンロード podman pull ubuntu # 例: Docker HubからApache2のイメージをダウンロード podman pull docker.io/httpd:latest
ダウンロードしたPodmanイメージの一覧の表示
podman images
Podmanイメージの削除
podman rmi <イメージID>
コンテナの起動
podman run --name <コンテナ名> -d <イメージ名> # 例: イメージ名はubuntu、コンテナ名はubuntu01として起動 podman run --name ubuntu01 -itd ubuntu /bin/bash # 例: イメージ名はhttpd、コンテナ名はwwwとして起動 # また、コンテナ内の80番ポートをホスト側の8080番にポートフォワーディングしている podman run --name www -p 8080:80 -d httpd
コンテナのプロセス確認
# 動作中のコンテナのみ表示 podman ps # 全てのコンテナを表示 podman ps -a または podman ps --all
コンテナの停止
コンテナが停止している時は、STATUSでExitedとなる。
podman stop <コンテナ名> または podman stop <コンテナID>
コンテナとホスト間のファイルコピー
ホストからコンテナにファイルをコピーする。
podman cp <ホストのファイルパス> <コンテナ名:コンテナ内の保存先> # 例: podman cp sample.txt my_suse:/tmp # コンテナを実行 podman exec -it my_suse /bin/bash # cd /tmp && lsコマンドを実行してファイルを確認
コンテナからホストにファイルをコピーする。
podman cp <コンテナ名:コンテナ内のファイルパス> <ホストの保存先> # 例: podman cp my_suse:/tmp/sample.txt ~/Downloads
コンテナのバックアップ
コンテナをイメージ化してバックアップする。
- コンテナを新しいメージとして作成する。
podman commit <コンテナID> <任意のイメージ名>
- 作成したイメージをファイルとして保存する。
podman save <上記で入力した任意のイメージ名> > <バックアップするファイル名>.tar
バックアップしたコンテナの復元
podman load -i <バックアップしたファイル名>.tar
正常に復元されているかどうかを確認する。
podman images
Podman Desktop
Podman Desktopのインストール
Podman Desktopの公式Webサイト、または、Githubにアクセスして、Podman Desktopをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf podman-desktop-<バージョン>.tar.gz mv podman-desktop-<バージョン> Podman-Desktop
必要ならば、任意のインストールディレクトリに配置する。
mv Podman-Desktop <任意のインストールディレクトリ>
Podman Desktopのデスクトップエントリファイルを作成する。
vi ~/.local/share/applications/Podman-Desktop.desktop
# ~/.local/share/applications/Podman-Desktop.desktopファイル
[Desktop Entry]
Type=Application
Name=Podman Desktop
Exec=/<Podman Desktopのインストールディレクトリ>/podman-desktop %F
Icon=io.podman_desktop.PodmanDesktop
Categories=Development;
StartupWMClass=Podman Desktop
Terminal=false
Docker Hubの使用
Docker Hubにログインする。
podman login -u <Docker Hubのユーザ名> -v https://docker.io podman login -u <Docker Hubのユーザ名> -v https://index.docker.io/v2/
Podman Desktopを再起動する。
認証情報は、/run/user/$UID/containers/auth.jsonファイルに保存される。
ルートレスモード
ルートレスモードとは
Podmanはsetuidパッケージが不要であり、一般ユーザとしてコンテナを実行することができる。
ルートレスモードで実行する場合、Podmanコンテナはユーザネームスペースを使用して、コンテナ内のrootをPodmanを実行しているユーザに設定する。
ルートレスモードのPodmanは、コンテナを実行しているユーザには無い特権は持たず、ロックダウンされたコンテナを実行する。
これらの制限の一部は (例えば、--privileged
オプションを付加して) 解除できるが、ルートレスコンテナが起動したユーザ以上の権限を持つことはない。
一般ユーザとしてPodmanを実行する時、ホストから/etc/passwdにマウントした場合でも、一般ユーザには権限が無いため変更することはできない。
PodmanとDockerの違い
DockerとPodmanの違いの1つは、コンテナの扱い方である。
Dockerは、コンテナを実行するためにスーパーユーザ権限を必要とする。
Podmanは、スーパーユーザ権限無しでコンテナを実行することができる。
例えば、ルートレスモードのPodmanでは、ポート番号が1024番未満のポートでコンテナを起動することはできないため、1024番以上のポートを使用する必要がある。
もし、1024番未満のポートでコンテナを作成する必要がある場合は、ルートレスモードを解除してスーパーユーザ権限で実行する。
podman machine set --rootful
ルートレスモードに戻す場合は、以下に示すコマンドを実行する。
podman machine set --rootful=false
しかし、Dockerには、コンテナを作成および管理するためDocker Composeが存在する。
幸運なことに、PodmanはDocker CLIをエミュレートできるため、Docker Composeと連携することができる。