VSCodeのRemote Containers + Dockerを試した

Jul 17, 2022 10:20 · 2308 words · 5 minute read Docker

これまでちょっとしたツールはローカルで動かしていたのですが、「実践Docker」を読んだことをきっかけにDockerで動かすようになりました。

実践Dockerコマンドチートシート · kapieciiのブログ

今回はVSCodeのRemote Containers Extensionを使ってみたので、色々と試した結果を残しておきます。

目次

Remote Containers?

VSCodeの拡張機能です。開発環境のDocker ContainerにVSCodeからアクセスすることができます。

Developing inside a Container using Visual Studio Code Remote Development

Remote Containersをインストール

VSCodeを起動後、Remote Containers拡張機能を追加します。

Remote Containersを使ってみる

今回はPythonの3.10.5のDocker Imageを使います。

作成したDockerfileは下記の通り。
サンプルとしてrequestsをpip installしています。

% cat Dockerfile 
FROM python:3.10.5
RUN pip install requests

Dockerfileと実行したいPythonのコードを同じディレクトリに置きます。

% tree .
.
├── Dockerfile
└── test.py

0 directories, 2 files
% cat test.py 
import requests
print('test')

Dockerfileを置いたディレクトリをVSCodeで開き、左下の緑の部分をクリック。

「Reopen in Container」を選択

「From Dockerfile」を選択

Docker Imageのビルドとコンテナの実行が成功すると、左下の緑の部分に「Dev Container: Existing Dockerfile」と表示されます。
VSCodeのTerminalを開き、Pythonスクリプトを実行すると、コンテナの中でスクリプトが実行されます。
pip installしたrequestsも問題なくimportできています。

VSCodeのTerminalからpip installすることもできます。

root@00daaaaaaaa4:/workspaces/remote-containers-test# pip install numpy
Collecting numpy
  Downloading numpy-1.23.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.0 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 17.0/17.0 MB 5.3 MB/s eta 0:00:00
Installing collected packages: numpy
Successfully installed numpy-1.23.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 22.0.4; however, version 22.1.2 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
root@00daaaaaaaa4:/workspaces/remote-containers-test#

Remote Containersで作られたイメージとコンテナ

Remote Containersを実行すると、「vsc-remote-containers-test-1f86b5ec8f4505b162f733e36f9f7a47」というイメージと「distracted_mcnulty」という名前のコンテナが作られていました。

文字列の中の「remote-containers-test」の部分は実行しているディレクトリ名です。

$ docker image ls
Password:
REPOSITORY                                                    TAG                    IMAGE ID       CREATED         SIZE
vsc-remote-containers-test-1f86b5ec8f4505b162f733e36f9f7a47   latest                 4eb441da6b46   37 hours ago    930MB
$ docker container ls -a
CONTAINER ID   IMAGE                                                         COMMAND                  CREATED        STATUS                      PORTS     NAMES
00d9e6205454   vsc-remote-containers-test-1f86b5ec8f4505b162f733e36f9f7a47   "/bin/sh -c 'echo Co..."   37 hours ago   Exited (0) 36 hours ago               distracted_mcnulty

設定ファイル「​​devcontainer.json」

Remote ContainersからDockerを起動すると「devcontainer.json」という設定ファイルが作られます。
デフォルトの内容はこちら。

$ cat .devcontainer/devcontainer.json 
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.241.1/containers/docker-existing-dockerfile
{
	"name": "Existing Dockerfile",

	// Sets the run context to one level up instead of the .devcontainer folder.
	"context": "..",

	// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
	"dockerFile": "../Dockerfile"

	// Use 'forwardPorts' to make a list of ports inside the container available locally.
	// "forwardPorts": [],

	// Uncomment the next line to run commands after the container is created - for example installing curl.
	// "postCreateCommand": "apt-get update && apt-get install -y curl",

	// Uncomment when using a ptrace-based debugger like C++, Go, and Rust
	// "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],

	// Uncomment to use the Docker CLI from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker.
	// "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ],

	// Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
	// "remoteUser": "vscode"
}

設定値の解説を含めたドキュメントはこちら。

devcontainer.json reference (containers.dev)

設定サンプルを公開してくれているブログはこちら。

DockerとRemote Containersでの開発環境が最高過ぎる - Sweet Escape (keisuke69.net)

余談1 PythonのImageファイルについて調べる

PythonのDocker Imageを使うのが初めてだったので、Imageファイルについて調べてみました。

Python - Official Image | Docker Hub

今回使った3.10.5のDocker ImageのDockerfileがこちら

python/Dockerfile at 56cea612ab370f3d05b29e97466d418a0f07e463 · docker-library/python (github.com)

buildpack-depsというDocker Imageを使っています。

#
# NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"
#
# PLEASE DO NOT EDIT IT DIRECTLY.
#

FROM buildpack-deps:bullseye

# ensure local python is preferred over distribution python
ENV PATH /usr/local/bin:$PATH

(以下、省略)

Buildpack-deps - Official Image | Docker Hub

buildpack-depsは開発に便利なパッケージなどが最初から内包されており、pip、npm、gemが使える状態になっているとのこと。
更に元を辿っていくと、ベースとして「FROM debian:bullseye」が使われています。

buildpack-deps/Dockerfile at 98a5ab81d47a106c458cdf90733df0ee8beea06c · docker-library/buildpack-deps (github.com)

余談2 Python Docker Imageのサイズ

色々なパッケージが追加され、レイヤーが積み重なることで、そこそこのImageサイズになっています。
ubuntu:22.04のImageサイズと比較すると、ubuntu:22:04が77.8MB、pytho3.10.5が920MBでした。

REPOSITORY                                                    TAG                    IMAGE ID       CREATED         SIZE
python                                                        3.10.5                 930516bcf910   4 days ago      920MB
ubuntu                                                        22.04                  27941809078c   5 weeks ago     77.8MB

開発に使うマシンのストレージ状況次第では、Ubuntuなどをペースにして自分で必要なツールだけをインストールするほうが良いかもしれません。 試しに下記のDockerfileをビルドしたところ、Imageサイズは約半分の469MBになりました。

$ cat Dockerfile 
FROM ubuntu:22.04

RUN apt update && apt dist-upgrade -y && apt install python3 python3-pip -y
​​REPOSITORY                                                    TAG                    IMAGE ID       CREATED          SIZE
ubuntu-python                                                 01                     5a3dda5d2ad1   30 seconds ago   469MB

Pythonのバージョンを指定したり、その他のライブラリなどが必要な場合はもう少しサイズが膨らむでしょうが、「3.x系であれば何でもいい」という場合はサイズが小さい方が使い勝手が良さそうです。

tweet Share