VS Code + Remote Development + Podmanでコンテナの中で開発を行う

4 min読了の目安(約3600字TECH技術記事

この記事はVisual Studio Code Advent Calendar 2020 - Qiita 19日目の記事です。

去る11月21日に行われた VS Code Conference Japan にて「Remote Development with Podman」の内容で発表を同いました

イベントサイト

https://vscode.connpass.com/event/184441/

発表スライド

本記事は初出の発表資料を再構成し、内容を整理したものになります。


VS CodeにおけるPodmanのサポート

VS Code Remote Developmentを使ったリモート開発のうち、Remote - ContainersでPodmanをコンテナ実行環境としての利用が可能です。なお、Remote - ContainersにおけるPodmanのサポートは 2020年4月、VS Code v1.45から。

https://code.visualstudio.com/updates/v1_45?ref=codebldr

Remote - Containersで具体的にできること

  • Dockerの代わりにPodmanでコンテナを実行
  • VS CodeからPodmanで起動したコンテナへ接続し、コンテナの中で開発を実施

ただし、Dockerをコンテナ実行環境とする場合に比べ、現時点では利用できるOS環境が限定されます

Podmanの利用方法

  • Docker Pathにpodmanを指定する

  • あとはDockerを使用する手順と同様

https://code.visualstudio.com/docs/remote/containers

注意点:Podmanの動作OS

Podmanの動作環境については下記の記事を参照

https://zenn.dev/tnk4on/articles/2bdc6d64b63c39
  • MacとWindowsはリモートクライアント(podman-remote)しかない
  • リモートクライアントではRemote-Containersの機能は使用できない[1]
  • つまり、「現時点でVS Codeのサポート構成を実現できるのはLinux環境のみ

Remote-Containersで動作確認済みの環境

下記はVS CodeとPodmanを導入した環境で実際に動作テストを行った結果、正常動作が確認できた内容になります。

Linux(Podman on Fedora 33)

  • Linuxデスクトップ上でVS Codeを起動し、同OS上でPodmanによるコンテナを実行
  • 動作確認OS:Fedora 33 WorkStaion
  • ポイント:
    • VS Codeのサポート構成
    • Podmanは一般ユーザーで実行可能
    • SELinuxの無効化は不要(エラー対応のソース修正は必要)
  • 詳細は発表資料P.16を参照:https://speakerdeck.com/tnk4on/remote-development-with-podman?slide=16

Windows(Podman on WSL2)

  • Windowsデスクトップ上でVS Codeを起動し、WSL2内でPodmanによるコンテナを実行
  • OS:Windows 10 + WSL2(Ubuntu-20.04)
  • ポイント:
    • VS Codeの非サポート構成
    • Remote - WSLで接続した環境上で、さらにRemote - Containersを実行
    • Podmanは一般ユーザーで実行可能
  • 詳細は発表資料P.20を参照:https://speakerdeck.com/tnk4on/remote-development-with-podman?slide=20

MacでもVS Code + Podmanで開発を行いたい!

どうしてもコンテナの実行にDockerを使わずにPodmanを使いたい、またはDokcerが実行できないOS環境の場合。Podmanで「Dockerを実行できるコンテナ」を動かす→(Docker in Podman)。

Podmanを実行するLinux環境は別途用意が必要

(参考)Docker in Docker

  • Dockerの上で(中で?)Dockerを動かす技術
  • Dockerオフィシャルコンテナイメージあり

https://hub.docker.com/_/docker
  • Docker in PodmanはこのコンテナイメージをPodmanで動かしたもの

Docker in Podmanの実行方針

  • Docker in Dockerのコンテナイメージを使用
  • TCPで直接ソケット接続する
  • Podmanコマンドはルート権限で実行する
    • 一般ユーザーだとdocker runでエラー発生。コンテナの実行ができない。
  • Cgroup v1に変更
  • 実行コマンド
$ sudo podman run --log-level=debug -e DOCKER_TLS_CERTDIR="" --privileged -dit --name dind -p 2375:2375 docker:dind

Docker in Podman on Fedora

  • ローカル端末からコンテナ実行されているDockerホストへTCP直接接続

まとめ

  • VS Code + Remote Development + Podmanのサポート構成はLinux環境のみ
    • Fedora 33 Workstationで動作確認済み
  • Windows環境ではWSL2を併用することでPodmanの利用は可能
    • Windows 10 + WSL2(Ubuntu-20.04)で動作確認済み
  • Macの場合はPodmanの実行ができないため、Docker in Podmanの技術を使う
    • Dockerをコンテナ実行環境として動作確認済み
    • ただし、Mac以外にPodmanを実行できるLinux環境は用意する必要がある
  • まだまだPodmanの利用における制限は多いが、今後のアップデートでDockerとの選択が容易にできるようになることを期待したい
脚注
  1. ドキュメントに記載は無いが動作検証の結果から判断 ↩︎