docker
dockerfile
alpinelinux

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