この記事では、Dockerを使用してアセンブラ環境を構築し、シンプルなプログラムで「Hello, World!」を出力する方法を詳しく解説します。
プログラミング初心者の方でも安心して取り組めるよう、丁寧に説明します。
必要なツール
- Docker: コンテナ技術を使用して簡単に環境を構築できます。
- Docker Compose: Docker環境の管理を効率化するツール。
Dockerがまだインストールされていない場合は、Docker公式サイトを参考にインストールしてください。
アセンブラ環境を構築
作業用ディレクトリを作成し、以下の2つのファイルを準備します。
Dockerfile
Dockerコンテナの環境を定義するファイルです。
# ベースイメージとしてDebianの特定バージョンを指定 (例: bullseye)
FROM debian:bullseye
# パッケージキャッシュを削除するオプションを追加
RUN apt-get update && \
apt-get install -y \
nasm \
gcc \
make \
nano \
&& apt-get clean && \
apt-get autoremove
# 作業ディレクトリを作成
WORKDIR /app
# デフォルトのエントリーポイントを指定しない
CMD ["bash"]
FROM debian:bullseyeFROM命令は、ベースイメージ(基礎となるOSや環境)を指定します。
バージョンを固定することで、予期せぬ動作変更を防ぎ、環境の再現性を高めます。
特定バージョン(bullseyeなど)は、一定期間セキュリティアップデートが提供されるため、安全性が確保されています。
apt-getはDebian系Linuxで使用されるパッケージ管理ツールで、必要なソフトウェアをインストールします。
apt-get update
パッケージリストを最新の状態に更新。
Debianのリポジトリからインストール可能なソフトウェア一覧を取得し、古い情報によるインストールエラーを防ぎます。
apt-get install -y
必要なソフトウェアパッケージをインストール。-yオプションはインストール確認の対話(Yes/No)を省略して自動的に進めます。
インストールされるパッケージ
- nasm:アセンブラ(アセンブリ言語コンパイラ)です。
- gcc:GNU Compiler Collectionの一部で、Cコンパイラです。
アセンブリのコンパイル後に実行可能ファイルを作成するリンカのldコマンドを含んでいます。 - make:ビルド自動化ツール。(今回は特に使用しません。)
- nano:テキストエディタです。
&& apt-get clean && apt-get autoremove
システムをクリーンアップし、不要なデータを削除してイメージサイズを最小化します。
- apt-get clean:ダウンロードしたパッケージキャッシュを削除します。
- apt-get autoremove:使用されていない依存パッケージを削除します。
WORKDIR /app
コンテナ内での作業ディレクトリを指定しています。/appはアプリケーション関連ファイル(例えばアセンブリコードやコンパイル結果)を格納するディレクトリになります。
docker-compose.yaml
docker-compose.yamlは、Docker Composeを使って複数のDockerコンテナを一括管理するための設定ファイルです。
ここでは、1つのサービス(my-app)を定義しています。
services:
my-app:
build: .
volumes:
- .:/app
working_dir: /app
command: tail -f /dev/null
services:
コンテナで実行するサービスを定義します。
my-app:my-appサービスを定義しています。
build: .
Dockerイメージをビルドするためのディレクトリを指定します。
「.」は、docker-compose.yamlが存在するカレントディレクトリを意味しています。
volumes:
ホストマシンのディレクトリとコンテナ内のディレクトリを共有(マウント)します。
.:/app
ホスト側(左): .は、現在のカレントディレクトリ。
コンテナ側(右): /appは、コンテナ内のディレクトリ。
この設定により、ホストマシンのカレントディレクトリとコンテナ内の/appディレクトリが同期されます。
working_dir: /app
コンテナ内でのデフォルトの作業ディレクトリを指定します。
この設定により、コンテナ内でのコマンド実行時に常に/appディレクトリが使用されます。
この設定がない場合、デフォルトではコンテナのルートディレクトリ(/)が使用されます。
command: tail -f /dev/null
コンテナ起動時に実行するコマンドを指定します。
tail -f /dev/nullは、無限ループで空のファイル(/dev/null)を監視します。
tail -f /dev/nullを実行することで、コンテナが停止しないようにしています。
通常、コンテナはメインプロセスが終了すると停止します。
Dockerコンテナを構築して起動
以下のコマンドを順に実行します。
# Docker Composeでコンテナをビルドして起動
docker compose up -d
起動中のコンテナを確認するには、次のコマンドを使用します。
docker ps -a
コンテナが正常に起動していれば、次に進みます。
コンテナにログインしてアセンブリコードを準備
コンテナ内で作業を行います。
コンテナにログイン
次のコマンドでコンテナにアクセスします。
# 起動しているコンテナを調べる
docker ps -a
#コンテナにログインする
docker exec -it <コンテナ名> sh
アセンブリコードを書く
nanoエディタを使って、以下の内容でhello.asmというファイルを作成します。
section .data
hello db 'Hello, World!',0xA
hello_len equ $ - hello
section .text
global _start
_start:
mov rax, 1 ; syscall: write
mov rdi, 1 ; stdout
mov rsi, hello ; メッセージのアドレス
mov rdx, hello_len ; メッセージの長さ
syscall
mov rax, 60 ; syscall: exit
xor rdi, rdi ; exit code 0
syscall
アセンブリコードをコンパイルして実行
以下の手順でコードをコンパイルし、実行します。
NASMでコンパイル
次のコマンドでアセンブリコードをコンパイルします。
nasm -f elf64 hello.asm -o hello.o
-f elf64で出力するファイル形式(フォーマット)を指定します。elf64は64ビット環境用のELF(Executable and Linkable Format)形式を指定しています。
ELFは、LinuxやUNIX系OSで使用される実行可能ファイル、オブジェクトファイル、共有ライブラリの標準形式です。
-oオプションは、出力ファイル名を指定しています。
リンカで実行可能ファイルを作成
コンパイルされたオブジェクトファイルを実行可能ファイルにリンクします。
ld -o hello hello.o
ldはGNU Binutils(GNUビルドユーティリティ)の一部で、リンカ(linker)と呼ばれるツールです。リンカは、オブジェクトファイル(.o形式)を結合し、実行可能なバイナリを生成します。
-oオプションは、出力ファイル名を指定しています。
実行
リンクしたプログラムを実行して結果を確認します。
./hello
以下のように表示されれば成功です。
Hello, World!
参考
アセンブラ(Linux) 環境構築とHelloWorldの表示
基本を再チェック~gcc~
コンテナを停止
作業が完了したら、次のコマンドでコンテナを停止します。
docker compose down
まとめ
この手順を通じて、Dockerを利用したアセンブラ環境の構築と「Hello, World!」の出力を体験できました。
Dockerを使うことで、ホスト環境に影響を与えることなく、安全に学習環境を整えることが可能です。

