Edited at

Dockerイメージの作り方

More than 1 year has passed since last update.

Docker(ドッカー)イメージはコンテナの元だ。例えば、MySQLを運用するコンテナはMySQLイメージで起動する。ドッカーイメージはDockerfile (ドッカーファイル)で定義する。単純なネイティブなコードは入っていないプロジェクトを下記のドッカーファイルでイメージに生成できる:


Dockerfile

# FROM <イメージ名>:<バージョンタグ>

# このイメージを元に使って
FROM node:8.2.1-alpine

# イメージの中にアプリ用ディレクトリを作成
RUN mkdir -p /opt/myapp

# イメージの中の"cd"
WORKDIR /opt/myapp

# Dockerfileのディレクトリの中身をイメージの中のWORKDIRにコピー
COPY . .

# コンテナのポート8000をホストに開示
EXPOSE 8000

# イメージの起動の時実行されるコマンド
CMD ["npx", "http-server", "-p", "8000"]


上記のドッカーファイルはAlpineと言う軽いLinuxを利用する。

ネイティブなコードをコンテナの中でコンパイルする必要がある場合、Dockerfileにコンパイルステップが必要:


Dockerfile

# FROM <イメージ名>:<バージョンタグ>

# このイメージを元に使って
FROM node:8.2.1-alpine

# イメージの中にアプリ用ディレクトリを作成
RUN mkdir -p /opt/myapp

# イメージの中の"cd"
WORKDIR /opt/myapp

# Dockerfileのディレクトリの中身をイメージの中のWORKDIRにコピー
COPY . .

# コンパイルステップは一つのRUNだけで行う
RUN \
# コンパイルに必要な依存をインストール
apk add --no-cache --virtual build-deps \
python=2.7.13-r1 \
make=4.2.1-r0 \
g++=6.3.0-r4 && \
# コンパイル
npm rebuild && \
# コンパイル依存はもういらないのでイメージに無駄に入らないように同じRUNの中でアンインストール
apk del build-deps

# コンテナのポート8000をホストに開示
EXPOSE 8000

# イメージの起動の時実行されるコマンド
CMD ["npx", "http-server", "-p", "8000"]



ドッカーイメージの生成

Dockerfileのディレクトリの中で:

docker build --tag <organization>/<project>:<tag> .

organization(任意): 普通にDocker Hubでのアカウント名

project(必須): プロジェクト名

tag(任意): 設定しないといつもlatestタグがイメージに付けられる。


コンテナの起動

docker run --publish 8000:3000 --detach --name mycontainer --env PORT=3000 <organization>/<project>:<tag>

上記のコマンドでPORT=3000という環境変数がコンテナに渡されて、コンテナのポート3000がホストOSのポート8000でアクセスできるように起動される。


最新のMySQLイメージでコンテナを起動:

docker run --name my-mysql-container --env MYSQL_ROOT_PASSWORD=mypassword --detach mysql:latest