Dockerデータボリューム、Dockerfile作成とAlibaba Cloudレジストリ活用

1. コンテナデータボリューム

データの永続化やホストとの共有を実現する仕組み。たとえば、Tomcatのログやアプリケーションディレクトリをコンテナ外にマウントすることで、コンテナ内に入らずにファイル操作が可能になる。

1.1 バインドマウントによる直接マウント

# ホストの絶対パスをコンテナ内のディレクトリにマウント
docker run -it -v /host/path:/container/path image_name

# 例:ホストの /MyDockerCentos をコンテナ内の /MyDockerCentos01 にマウント(読み取り専用)
docker run -it -v /MyDockerCentos:/MyDockerCentos01:ro centos

マウント状況は docker inspect で確認可能。JSON出力中の Mounts セクションに以下のような情報が含まれる:

"Mounts": [
  {
    "Type": "bind",
    "Source": "/MyDockerCentos",
    "Destination": "/MyDockerCentos01",
    "RW": false
  }
]

1.2 Dockerfileによるボリューム定義

Dockerfile内で VOLUME 命令を使うことで、イメージ作成時にデータボリュームを定義できる。

# mydockerfile の内容
FROM centos
VOLUME ["/dataVol1", "/dataVol2"]
CMD echo "build complete!"
CMD ["/bin/bash"]

このDockerfileをビルド:

docker build -f ./mydockerfile -t custom-centos .

生成されたコンテナを起動後、/ 配下に dataVol1dataVol2 が存在することを確認できる。

docker inspect で確認すると、これらのボリュームはデフォルトで /var/lib/docker/volumes/ 下に自動生成されるローカルボリュームとしてマウントされている。

2. Dockerfileの基本構文

Dockerfileは、Dockerイメージを自動的に構築するためのスクリプト。主な命令は以下の通り:

  • FROM:ベースイメージを指定
  • RUN:ビルド時に実行するコマンド
  • CMD:コンテナ起動時のデフォルトコマンド(最後のもののみ有効)
  • ENTRYPOINT:CMDと異なり、docker run の引数で上書きされない
  • EXPOSE:公開するポートを宣言
  • WORKDIR:作業ディレクトリを設定
  • ENV:環境変数を定義
  • COPY / ADD:ファイルをイメージにコピー(ADDはURLや圧縮展開も対応)
  • VOLUME:永続化用ディレクトリを定義
  • ONBUILD:子イメージビルド時にトリガーされる命令

2.1 .dockerignore の活用

ビルドコンテキストに不要なファイルを除外するための設定ファイル。例:

# ルート直下の abc で始まるファイル・ディレクトリを除外
/abc*

# 全てのサブディレクトリ下の abc* を除外
**/abc*

# README.md だけは除外しない
*.md
!README.md

Dockerfile.dockerignore 自体はビルドに必要なので、常に送信されるが、COPY/ADD ではコピーされない。

3. カスタムCentOSイメージの作成

vim、treeをプリインストールし、80番ポートを公開するCentOSイメージを構築。

FROM centos
RUN yum install -y vim tree
EXPOSE 80
CMD ["/bin/bash"]

ビルドコマンド:

docker build -f ./Dockerfile -t mycentos .

docker history <image_id> で各レイヤーのサイズとコマンドを確認可能。

4. JDK + Tomcat 組み込みイメージの作成

ローカルにあるJDKとTomcatのtar.gzをイメージに組み込む。

FROM centos
MAINTAINER huang <841396397@qq.com>

ADD jdk-8u221-linux-i586.tar.gz /usr/local/
ADD apache-tomcat-8.5.43.tar.gz /usr/local/

RUN yum install -y vim wget tree bash-completion

ENV JAVA_HOME=/usr/local/jdk1.8.0_221
ENV CATALINA_HOME=/usr/local/apache-tomcat-8.5.43
ENV PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

WORKDIR $CATALINA_HOME
EXPOSE 8080

CMD ["sh", "-c", "$CATALINA_HOME/bin/startup.sh && tail -F $CATALINA_HOME/logs/catalina.out"]

ビルド後、以下のようにデータボリューム付きで起動:

docker run -d \
  -p 8001:8080 \
  --name mycat \
  -v /host/webapps:/usr/local/apache-tomcat-8.5.43/webapps \
  -v /host/logs:/usr/local/apache-tomcat-8.5.43/logs \
  --privileged \
  mytomcat

5. Alibaba Cloud Container Registry へのイメージ登録

カスタムイメージをクラウドレジストリに保存・配布する手順。

5.1 イメージのタグ付けとプッシュ

# ローカルイメージにレジストリ向けタグを付与
docker tag mytomcat registry.cn-shenzhen.aliyuncs.com/namespace/repo:1.0

# Alibaba Cloud にログイン
docker login --username=your_account registry.cn-shenzhen.aliyuncs.com

# イメージをプッシュ
docker push registry.cn-shenzhen.aliyuncs.com/namespace/repo:1.0

5.2 レジストリからの取得

docker pull registry.cn-shenzhen.aliyuncs.com/namespace/repo:1.0

プライベートリポジトリの場合は、事前にRAMユーザーやアクセストークンの設定が必要。公開イメージは「イメージ検索」から、プライベートイメージは「自分のリポジトリ」→「イメージバージョン管理」から確認可能。

タグ: Docker Dockerfile Alibaba Cloud Container Registry データボリューム コンテナ永続化

8月10日 07:58 投稿