Docker コンテナを利用することで、C 言語の開発環境を簡単に用意できます。
この記事では、以下の環境でDocker コンテナにC 言語の開発環境を用意する手順について説明しています。
実行環境
Windows 11+Docker Desktop+WSL2(Ubuntu)環境で、VS Codeのターミナルを利用する。
Docker Desktopインストール
Dockerの公式サイトよりDocker Desktopインストーラーをダウンロードし実行する。
利用規約への同意など画面に従いインストールを完了後、サインインする。
Docker Desktop起動後、設定画面「Resources」>「WSL Integration」の「Enable WSL integration」にチェックをする。
WSL2(Windows Subsystem for Linux)にUbuntuをインストール
WSL を使用して Windows に Linux をインストールする方法を参考にLinux ディストリビューション(この記事ではUbuntu)をインストールする。
「Enabled distributions」セクションのEnable integration with additional distros:Ubuntuのトグルをオンにする。
VS Code (Visual Studio Code)使用
VS Code に Remote – WSL 拡張をインストールしてターミナルで Ubuntu を操作する。
【参考】VS Codeインストール方法
- Visual Studio Code の公式ページにアクセスし、 「Download for Windows」ボタンをクリックしてインストーラをダウンロードする。
- 使用許諾契約への同意など画面に従いインストールを完了する。
- VS Code左サイドバーの拡張機能アイコンをクリックして、Remote – WSLを検索しインストールする。
- CTRL+Shift+PでコマンドパレットをWSLで検索し、WSL:WSLへの接続とWSL:ディストリビューションを使用してWSLに接続行いをUbuntu選択する。
- VS Codeの左下に緑色の接続インジケーターが、WSL: Ubuntuとなっていることを確認する。
C 言語の開発環境を構築する
WSL2 と Docker Desktop の連携確認
VS Codeターミナル画面で、dockerコマンドを実行して使えることを確認する。
#VS Codeターミナル画面操作
$ docker version
Client:
Version: 28.2.2
API version: 1.50
Go version: go1.24.3
Git commit: e6534b4
Built: Fri May 30 12:07:14 2025
OS/Arch: linux/amd64
Context: default
Server: Docker Desktop 4.0.0 ()
Engine:
Version: 28.2.2
API version: 1.50 (minimum version 1.24)
Go version: go1.24.3
Git commit: 45873be
Built: Fri May 30 12:07:26 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.27
GitCommit: 05044ec0a9a75232cad458027ca83437aae3f4da
runc:
Version: 1.2.5
GitCommit: v1.2.5-0-g59923ef
docker-init:
Version: 0.19.0
GitCommit: de40ad0
作業ディレクトリの作成
以下の作業ディレクトリを作成する。
cd ~
mkdir -p projects/c-dev-docker/src
cd projects/c-dev-docker
【作業ディレクトリ構成】
projects/
└── c-dev-docker/
└── src/
Dockerfile の作成
c-dev-docker/ディレクトリに、developer(UID/GID=1000)ユーザーを作成し、gcc/make/gdb/vim/nano をインストールするDockerfileを作成する。
# Dockerfile
FROM ubuntu:22.04
ARG DEBIAN_FRONTEND=noninteractive
# 必要パッケージをインストール(build-essential に make, gcc 含む)
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
gdb \
vim \
nano \
&& rm -rf /var/lib/apt/lists/*
# 一般ユーザー 'developer' を作成
RUN groupadd --gid 1000 developer \
&& useradd --uid 1000 --gid developer --create-home --shell /bin/bash developer
# ワークディレクトリを developer のホーム下に設定
WORKDIR /home/developer/workspace
# 所有権を developer に
RUN chown -R developer:developer /home/developer
# 以降は developer 権限で実行
USER developer
# デフォルトシェル
CMD ["bash"]
docker-compose.yml の作成
docker-compose を使って、developer ユーザーとしてコンテナを起動します。
# docker-compose.yml
version: "3.8"
services:
c-dev:
build:
context: .
dockerfile: Dockerfile
image: c-dev:latest
user: "1000:1000" # developer ユーザーで動作
volumes:
- ./src:/home/developer/workspace/src # ホストの src をマウント
working_dir: /home/developer/workspace
tty: true
Makefile の作成
通常ファイル(hello)とデバッグファイル(hello_dbg)を同時にビルドし、make clean で両方を削除するMakefileファイルをsrc/ディレクトリに作成します。
# src/Makefile
CC = gcc
CFLAGS = -Wall
DBGFLAGS = -Wall -g
SRC = hello.c
# デフォルト: 通常版とデバッグ版を両方ビルド
all: hello hello_dbg
# 通常ビルド
hello: $(SRC)
$(CC) $(CFLAGS) $< -o $@
# デバッグ情報付きビルド
hello_dbg: $(SRC)
$(CC) $(DBGFLAGS) $< -o $@
# クリーン
clean:
rm -f hello hello_dbg
C言語 サンプルプログラムの作成
src/ディレクトリに、Hello, Docker C World!を表示するだけのサンプルプログラム(hello.c)を以下の内容で作成します。
#hello.cファイル
/* src/hello.c */
#include <stdio.h>
int main(void) {
printf("Hello, Docker C World!\n");
return 0;
}
ここまでの作業で、ファイルディレクトリ構成は、下記の様になっています。
【作業ディレクトリとファイル構成】
projects/
└── c-dev-docker/
├── Dockerfile
├── docker-compose.yml
└── src/
├── hello.c
└── Makefile
イメージのビルドとコンテナの起動
docker-compose.ymlとDockerfileに従って、イメージファイル(c-dev:latest)をビルドします。
#イメージファイル(c-dev:latest)のビルド
cd ~/projects/c-dev-docker
docker-compose build
コンテナの起動
ビルドしたイメージを指定してコンテナを起動します。
コンテナ起動すると、コンテナ内のシェル(bash)が開きます。
#コンテナの起動
docker-compose run --rm c-dev
【コンテナ内のシェル(bash)が起動】
developer@<container-id>:~/workspace$
Makefile でビルド
makeコマンドで、src/hello.c と src/hello.dbg が生成されます。
make -C src
【参考】
make -C ディレクトリ名 [ターゲット]
動作:
1.指定されたディレクトリに移動
2.そのディレクトリでMakefileを探す
3.makeコマンドを実行
4.元のディレクトリに戻る
【make -C src 実行後のディレクトリとファイル構成】
projects/
└── c-dev-docker/
├── Dockerfile
├── docker-compose.yml
└── src
├── Makefile
├── hello
├── hello.c
└── hello_dbg
バイナリファイルの実行
バイナリファイルを実行すると、Hello, Docker C World!が表示されます。
./src/hello
Hello, Docker C World!
./src/hello_dbg
Hello, Docker C World!
デバッグ(GDB)
デバッグ版バイナリを直接使って GDB でステップ実行できます。
#デバッグ開始
gdb src/hello_dbg
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04.2) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from src/hello_dbg...
#mainの先頭にbreak pointを設定し、実行する。
(gdb) break main
Breakpoint 1 at 0x1151: file hello.c, line 5.
(gdb) run
Starting program: /home/developer/workspace/src/hello_dbg
warning: Error disabling address space randomization: Operation not permitted
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main () at hello.c:5
5 printf("Hello, Docker C World!\n");
(gdb) step
Hello, Docker C World!
6 return 0;
(gdb) step
7 }
(gdb) step
[Inferior 1 (process 46) exited normally]
(gdb) quit
#デバッグ終了
まとめ
これで、Windows 11+Docker Desktop+WSL2(Ubuntu)環境において、Docker コンテナ上に非 root ユーザーで Makefile による通常版・デバッグ版のビルドから実行までの作業を行いました。
あとは同じ手順でライブラリの追加やデバッグ環境の拡張も簡単に行えます。
余裕ができたら、色々と試してみましょう。

