Ansibleを使ってDockerコンテナを立ち上げる(モジュール編)
以前、Ansible-benderによるDockerコンテナの管理に関する記事を書きましたが、今回はansibleが提供されているdocker関連のモジュールでdockerコンテナのイメージ取得からビルド、Docker Hubへのpushを行っていきたいと思います。
実施すること
・dockerイメージの取得
・取得したイメージを基にフレームワークNuxt.jsのコンテナ構築
・もとになったイメージをDocker Hubへpush
参考資料
使用モジュール
今回はこちらのモジュールを使用しました。
使用した各種ツール
OS:Linux Mint 19.03 Tricia
ansible: 2.9.10
docker: 19.03.11
docker API: 1.40
python: 3.8.2
Dockerですが、pipパッケージからDocker SDK for Pythonをインストールすることが必須で、これがないとdockerを入れていたとしてもdockerモジュールがない、とエラーが出てしまいます。またdocker_moduleのいくつかの機能はansible 2.8以降に追加されたものが多いのでバージョンを2.8以上に上げた方がいいみたいです。
$ pip install docker
$ pip show docker
Name: docker
Version: 4.2.1
Summary: A Python library for the Docker Engine API.
Home-page: https://github.com/docker/docker-py
Author: None
Author-email: None
License: Apache License 2.0
Location: /home/yuta/.pyenv/versions/3.8.2/lib/python3.8/site-packages
Requires: requests, websocket-client, six
Required-by:
ディレクトリ構成
$ tree
├── README.md
├── dockerFile
│ ├── Dockerfile
│ └── app/(内容過多のため省略)
└── build_image.yml
ここにあるappディレクトリですが、ローカル環境側に用意したNuxt.jsのひな形が格納されています。以下のビルド作成時に事前に用意しましたが、こちらの準備方法は、最後のおまけに記載いたします。
Playbookの作成
build_image.yml
- name: Build node.js image
hosts: localhost
tasks:
- name: build node.js
docker_image:
build:
path: ./dockerFile
name: yuta28/ansible-test
tag: testimage
push: yes
source: build
build_image.ymlのplaybookの中身です。
docker_imageモジュールではイメージ名を決めるnameパラメータが必須であり、ここでは後々私のdocker hubへプッシュするために私のdocker hubアカウント名/レポジトリ名にしました。
buildモジュールですが、こちらは2.8以降に追加された機能でイメージの作成方法に関するオプションが選べます。pathパラメータでは、Dockerfileが配置されているディレクトリを記載することで配下のDockerfileに記述されたイメージのビルドを行います。
Dockerfileの作成
FROM node:latest
ENV NUXT_HOST=0.0.0.0
WORKDIR /app
COPY ./app/package.json ./app/yarn.lock ./
RUN yarn install
COPY ./app .
CMD ["yarn", "run", "dev"]
Dockerfileでは、nodeのdockerイメージを取得しローカルに置いてあったappディレクトリをコンテナへ配置して、nodeパッケージのyarnを起動するようにしています。
コンテナ起動
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yuta28/ansible-test testimage 45b79868e00a 2 days ago 1.43GB
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6650182cd7b yuta28/ansible-test:testimage "docker-entrypoint.s…" About a minute ago Up About a minute thirsty_turing
$ docker run -it yuta28/ansible-test:testimage
yarn run v1.22.4
$ nuxt
ℹ NuxtJS collects completely anonymous data about usage. 00:27:17
This will help us improving Nuxt developer experience over the time.
Read more on https://git.io/nuxt-telemetry
? Are you interested in participation? Yes
╭────────────────────────────────────────╮
│ │
│ Nuxt.js @ v2.13.0 │
│ │
│ ▸ Environment: development │
│ ▸ Rendering: server-side │
│ ▸ Target: server │
│ │
│ Listening: http://172.17.0.2:3000/ │
│ │
╰────────────────────────────────────────╯
ℹ Preparing project for development 00:27:21
ℹ Initial build may take a while 00:27:21
✔ Builder initialized 00:27:21
✔ Nuxt files generated 00:27:21
✔ Client
Compiled successfully in 10.86s
✔ Server
Compiled successfully in 7.16s
ℹ Waiting for file changes 00:27:35
ℹ Memory usage: 215 MB (RSS: 312 MB) 00:27:35
ℹ Listening on: http://172.17.0.2:3000/
イメージが作成されたことを確認したらコンテナを起動して、http:172.17.0.2:3000をブラウザで開いてみればNuxt.jsのサンプルページへアクセスすることができることを確認できました。
Docker Hubへのpush
Playbookの中にあるpush: yesでログイン済みのDocker Hubへイメージをpushすることができます。
おまけ
事前にローカル上で用意したNuxt.jsのappディレクトリの準備について記載します。
まず単にNodeのイメージを取得し、appディレクトリをホームディレクトリとするコンテナを構築できるDockerfileを作成します。
FROM node:latest
WORKDIR /app
ビルドされたイメージでコンテナを起動後、yarn create nuxt-appによりNuxt.jsの環境を構築していきます。
$ docker run --rm -it 65c7177eb328 bash
root@65c7177eb328:/app#
root@65c7177eb328:/app# yarn create nuxt-app
~~~~~~~~~~~~省略~~~~~~~~~~~~
🎉 Successfully created project test
To get started:
yarn dev
To build & start for production:
yarn build
yarn start
Done in 67.72s.
上記のコマンドを実行したら対話式にNuxt.jsの環境を構築していくので選択肢によって進めていきます。最後にSuccessfullyと表示されたら構築完了です。
コンテナ内のappディレクトリにNuxt.jsの雛形があるので、ローカルにコピーすればOKです。
$ docker cp 65c7177eb328:/app .
反省点
ansible関連よりもdockerコマンドを忘れることが多くてそこでエラーが多く発生してしまったことが反省点になります。
前回はansible-benderでDockerfileを使わずにコンテナ起動できましたが、docker_imageモジュールはDockerfileを呼び出すようなものなので、いちいちDockerfileを作成する手間があります。その分こちらの方が動きが分かりやすいところがありますので、docker_imageモジュールでできた結果をansible-benderで再現してみる検証などを行って理解を深めていきたいと思います。