見出し画像

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/            

画像1

イメージが作成されたことを確認したらコンテナを起動して、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で再現してみる検証などを行って理解を深めていきたいと思います。

この記事が気に入ったらサポートをしてみませんか?