VSCodeのRemote Containers + Dockerを試した
Jul 17, 2022 10:20 · 2308 words · 5 minute read
これまでちょっとしたツールはローカルで動かしていたのですが、「実践Docker」を読んだことをきっかけにDockerで動かすようになりました。
実践Dockerコマンドチートシート · kapieciiのブログ
今回はVSCodeのRemote Containers Extensionを使ってみたので、色々と試した結果を残しておきます。
目次
- Remote Containers?
- Remote Containersをインストール
- Remote Containersを使ってみる
- Remote Containersで作られたイメージとコンテナ
- 設定ファイル「devcontainer.json」
- 余談1 PythonのImageファイルについて調べる
- 余談2 Python Docker Imageのサイズ
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」が使われています。
余談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系であれば何でもいい」という場合はサイズが小さい方が使い勝手が良さそうです。