(最終更新月:2023年8月)
✔当記事は以下のような方に向けて書かれています
「DockerfileでUbuntuベースのコンテナを起動したい」
「DockerfileでFROM Ubuntuから始まる基本的な書き方を学びたい」
「DockerfileでUbuntuコンテナの実例を見てみたい」
✔当記事を通してお伝えする内容
- DockerfileとUbuntuの基本的な理解
- DockerfileでFROM Ubuntuを書くための手順とその応用
- Ubuntuベースのコンテナを起動する実際の使用例
当記事では、Dockerfileの基本から、さまざまなイメージのファイル例まで、より具体的にイメージがわくように詳細をご説明しています。
ぜひ最後までお読みください。
DockerとDockerfileの理解
DockerとDockerfileについての基本を見ていきましょう。
基本を確認いただいたうえで、本題へ進みます。
- Dockerとは?
- Dockerfileの力
Dockerとは?
Dockerとは、コンテナ型の仮想化技術を提供するプラットフォーム。
Dockerを使うことで、どんな環境でも同じように動作するアプリケーションを作ることが可能です。
開発環境と本番環境での動作の違いをなくせるので、開発からデプロイに至るプロセスがスムーズになります。
Dockerfileの力
Dockerfileは、Dockerコンテナの設定と構築を自動化するためのスクリプトファイルです。
Dockerfileの中には、以下の情報を記述します。
- 使用する基本イメージ
- インストールするパッケージ
- 設定する環境変数
例えば、Pythonのランタイムと必要なライブラリが書かれたDockerfileを作ることで、開発者間での環境の差異をなくすことが可能です。
必要な環境の構築
こちらでは、Dockerfileを扱ううえでの環境構築についてお伝えしていきます。
- DockerとUbuntuの導入
- 適切なテキストエディタの準備
DockerとUbuntuの導入
Dockerを使用するには、まずDockerをインストールする必要があります。
各OSにより、方法は異なるので、詳しくは以下をご覧ください。
適切なテキストエディタの準備
Dockerfileを書く際には、シンタックスハイライトや自動補完などの機能があるテキストエディタが便利です。
とくにVisual Studio Codeであれば、プラグインを活用してDockerfileの編集が容易になるでしょう。
コーディングなどの作業効率が向上します。
UbuntuベースのDockerfileの作成
こちらでは、UbuntuベースのDockerfileの作成についてお伝えしていきます。
- DockerfileからUbuntuコンテナを作る
- Dockerfileイメージからコンテナを立ち上げる
DockerfileからUbuntuコンテナを作る
Ubuntuを基盤としたDockerfileを作成しましょう。
基本となるFROM ubuntu
の記述から始め、その後に必要なパッケージのインストールや設定などをおこないます。
# ベースイメージとしてUbuntuを指定
FROM ubuntu:20.04
# タイムゾーンの設定を非対話的に行うための環境変数
ENV DEBIAN_FRONTEND=noninteractive
# システムのアップデートと必要なパッケージのインストール
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
curl \
vim \
&& rm -rf /var/lib/apt/lists/*
# コンテナ起動時のコマンドを指定
CMD ["/bin/bash"]
Dockerfileを元にイメージを作りには以下を実行してください。
docker build -t <イメージ名> .
Dockerfileイメージからコンテナを立ち上げる
Ubuntuを基盤としたシンプルなイメージから、コンテナを起動させましょう。
docker run -it <作成したイメージ名> /bin/bash
これでコンテナ内の/bin/bashが起動しアクセスできます。
具体例はこちらです。
$ docker run -it myubuntu /bin/bash
root@084486c95426:/#
DockerfileでのUbuntu操作
こちらでは、DockerfileでのUbuntu操作について詳しくお伝えしていきます。
Ubuntuベースのイメージを作るときに、覚えておくととても便利です。
- システムの更新
- 必要パッケージのインストール
システムの更新
Dockerfile内で、Ubuntuのシステムを更新するコマンドを書きましょう。
コンテナを最新の状態で起動できます。
RUN apt-get update && apt-get upgrade -y
最新のセキュリティパッチや依存関係の解決ができるため、安定したコンテナの構築が可能です。
必要パッケージのインストール
Ubuntuの土台に、アプリケーションに必要なパッケージを用意しましょう。
これにより、コンテナ間の環境が統一できます。
以下は、curlやvimなどのパッケージをインストールするコマンドです。
apt-get install -y \
curl \
vim \
Dockerfileのカスタマイズ
Dockerfileのカスタマイズ方法も見ていきましょう。
Dockerfileのカスタマイズにより、より効率的なコンテナの構築が可能になります。
- 環境変数の設定
- メインコマンドの設定
環境変数の設定
Dockerfile内では、環境変数の設定が可能です。
環境変数は、アプリケーションの設定や接続情報などを管理するために使用します。
以下は、データベースの接続情報をENV
キーワードで設定する方法です。
# ベースイメージとしてPythonを指定(例として)
FROM python:3.8-slim
# データベースの接続情報を環境変数として設定
ENV DB_HOST=database_host
ENV DB_PORT=5432
ENV DB_NAME=mydatabase
ENV DB_USER=username
ENV DB_PASSWORD=password
# アプリケーションのコードや依存関係のコピー、インストールなどのその他の命令...
# アプリケーションの起動コマンド
CMD ["python", "app.py"]
これにより、コード内での硬直した設定を避け、柔軟に環境を変更できるようになります。
ただし実際の運用環境では、パスワードや他の秘密情報をDockerfileに直接書くのはセキュリティ上のリスクがあります。
秘密情報の管理には、Dockerの秘密情報管理機能や外部の秘密情報管理ツールの使用がおすすめです。
メインコマンドの設定
Dockerfileにおいて、コンテナの起動時に実行されるメインコマンドを設定してみましょう。
Webサーバーの実行コマンドなど、コンテナ起動時に必ず実行したいコマンドをCMD
キーワードで設定します。
# ベースイメージとしてNode.jsを指定
FROM node:14
# アプリケーションのディレクトリを作成
WORKDIR /usr/src/app
# アプリケーションの依存関係をコピー
COPY package*.json ./
# 依存関係のインストール
RUN npm install
# アプリケーションのソースコードをコピー
COPY . .
# コンテナの起動時に実行されるメインコマンドを設定
CMD ["npm", "start"]
この設定により、コンテナの起動と同時に必要なプロセスを自動的に開始できるようになります。
Dockerイメージの生成とコンテナの起動
こちらでは、Dockerイメージの生成とコンテナの起動についてお伝えしていきます。
うえのプロセスをより細かく解説していきます。
- DockerfileからDockerイメージへの変換
- Dockerイメージからコンテナの生成
DockerfileからDockerイメージへの変換
DockerfileからDockerimageへの変換は、コンテナを作成するための基本的なプロセスです。
docker build
コマンドを用いて、Dockerfileの指示に従いイメージを作成します。
docker build -t <イメージ名> .
このプロセスを通じて、コンテナのテンプレートとなるイメージが生成されます。
詳しくはこちらをご覧ください。
Dockerイメージからコンテナの生成
Dockerイメージから実際のコンテナを生成してみましょう。
docker run
コマンドを使用して、作成したイメージからコンテナを実行する方法です。
docker run -it <イメージ名> /bin/bash
このほかにも、オプション設定やポートのマッピングなど、コンテナの実行をカスタマイズする方法は多数あります。
詳しくはこちらをご覧ください。
追加確認:wgetの効果
wgetはファイルのダウンロードをコマンドラインからおこなうユーティリティです。
このコマンドを、Dockerfile内で記述し、実行も可能です。
例として、nginxのソースコードをダウンロード・コンパイルするプロセスをご覧ください。
# ベースイメージとしてUbuntuを指定
FROM ubuntu:20.04
# タイムゾーンの設定を非対話的に行うための環境変数
ENV DEBIAN_FRONTEND=noninteractive
# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
wget \
build-essential \
libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev
# nginxのソースコードをダウンロード
WORKDIR /tmp
RUN wget http://nginx.org/download/nginx-1.19.0.tar.gz \
&& tar -zxvf nginx-1.19.0.tar.gz
# ソースコードをコンパイル
WORKDIR /tmp/nginx-1.19.0
RUN ./configure \
&& make \
&& make install
# nginxを起動するコマンドを設定
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
wgetの使用により、迅速かつ確実に必要なファイルを取得できるようになります。
nginxのソースコードURLを、ダウンロードしたいURLに置き換えてください。2023年8月時点で使用は確認できてますが、時期により使えないこともございます。
Dockerfile最適化のヒント
こちらでは、「Dockerfile最適化のヒント」をお伝えします。
Dockerfileをより効率的に書くための参考にしてください。
- Dockerfileの書き方へのヒント
- ビルドと実行時間の短縮テクニック
Dockerfileの書き方へのヒント
Dockerfileを最適化するポイントは以下のとおり。
- レイヤのキャッシュを効果的に利用する
requirements.txtを先にコピーして依存関係をインストール。ソースコードの変更が頻繁におこなわれても依存関係のインストール部分のキャッシュが再利用されるようにする。 - 不要なキャッシュの削除
pip installの際に–no-cache-dirオプションを使用して、pipのキャッシュをイメージに含めないようにする。 - 不要なファイルの削除
テストやバージョン管理、開発ツールに関連するファイルやディレクトリを削除する。イメージのサイズを減少させています。
具体例としては、以下のようになります。
# ベースイメージとしてPythonを指定
FROM python:3.8-slim
# アプリケーションのディレクトリを作成
WORKDIR /app
# 依存関係のファイルを先にコピー
COPY requirements.txt .
# 依存関係のインストール
# - インストール後にキャッシュを削除してイメージサイズを減少させる
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションのソースコードをコピー
COPY . .
# 不要なファイルやディレクトリを削除
RUN rm -rf tests/ .git/ .vscode/
# アプリケーションの起動コマンドを設定
CMD ["python", "app.py"]
ビルドと実行時間の短縮テクニック
ビルドと実行時間を短縮する方法も見ていきましょう。
具体的には以下のような方法を参考にしてください。
- マルチステージビルドの活用
- 適切なベースイメージの選択
- レイヤの最適化
1. マルチステージビルドの活用
マルチステージビルドは、ひとつのDockerfile内で複数のビルドステージを持つことができる機能のこと。
最終的なイメージサイズを小さく保ちつつ、ビルド過程で必要なツールやライブラリの使用が可能です。
# ビルドステージ
FROM golang:1.14 AS build
WORKDIR /src
COPY . .
RUN go build -o app .
# 実行ステージ
FROM debian:buster-slim
COPY --from=build /src/app /app
CMD ["/app"]
この例では、Goのアプリケーションをビルドするためのステージと、実際にアプリケーションを実行するためのステージを分けています。
これにより、最終的なイメージにはビルドツールなどが含まれず、イメージサイズが小さくなります。
2. 適切なベースイメージの選択
ベースイメージの選択は、最終的なイメージサイズやセキュリティに大きな影響を与えます。
可能な限り、必要な機能に特化した軽量なイメージの選択がおすすめです。
例えば、node:14
よりもnode:14-slim
やnode:14-alpine
を選択することで、イメージサイズを大幅に削減できます。
3. レイヤの最適化
不要なファイルを削除する際や、キャッシュをクリアする際には、同じRUN命令内でおこないましょう。
Dockerイメージはレイヤーで構成されており、RUN命令を最小限にすることで、無駄なレイヤーの作成を防げます。
RUN apt-get update && apt-get install -y some-package && rm -rf /var/lib/apt/lists/*
これらの最適化テクニックを適用することで、Dockerのビルドと実行時間を短縮し、開発の迅速化とリソースの節約が実現します。
まとめ
当記事では、UbuntuベースのDockerfileについてご紹介してきました。
- Dockerfileでイメージを作成できる
- イメージから任意のコンテナを起動できる
- Dockerfileではさまざまな設定・カスタマイズが可能
DockerとDockerfileの理解と使用は、現代のソフトウェア開発において必須のスキルといえます。
Dockerをマスターすることで、より迅速で確実な開発プロセスを実現し、ビジネスやプロジェクトの成功に貢献できるでしょう。
最新のテクノロジートレンドに追従し、スキルをさらに磨いていくことをおすすめします。