7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Docker】コンテナでアプリを開発するときにやっていること

Posted at

今までコンテナを使ってアプリを開発してきたなかで気付いた、スムーズに開発ができるようになるコツをまとめてみたいと思います。

頻繫に変更するファイルがあるディレクトリをマウントする

方法

docker runコマンドだと-vでディレクトリをマウントします。

docker run -v <ホストディレクトリ>:<コンテナディレクトリ> <イメージ名>

docker-compose.ymlだとvolumesでマウントします。

docker-compose.yml
version: '3'
services:
  example:
    build: .
    volumes:
      - <ホストディレクトリ>:<コンテナディレクトリ>

理由

開発中でソースコードや設定ファイルを変えてから素早く動作確認したいとき、いちいちビルドして最新のファイルを反映しなくてよくなるからです。
Pythonとかのビルドが必要ない言語だと特に便利です。

頻繫に確認したいファイルがあるディレクトリをマウントする

方法

頻繫に変更するファイルがあるディレクトリをマウントすると同じです。
私が良くマウントするのは、アプリの実行結果として作成されるアウトプットファイルがあるフォルダやログファイルがあるフォルダです。

理由

わざわざコンテナの中に入ってcatコマンドなどで見るのはめんどくさいです。ホスト側から直接見られる方が便利です。
もしログファイルのように見たいだけで、ホスト側から間違って変更したくない場合はボリュームのマウントのときにroをつければread-onlyになります。

docker run -v <ホストディレクトリ>:<コンテナディレクトリ>:ro <イメージ名>
docker-compose.yml
version: '3'
services:
  example:
    build: .
    volumes:
      - <ホストディレクトリ>:<コンテナディレクトリ>:ro

開発環境用のDockerfileをつくる

方法

Dockerfile.devのように、開発用とわかるようなファイル名にします。
使用するときは、コマンドで明示的にファイルを指定します。

docker build . -f ./Dockerfile.dev -t docker-dev
docker run docker-dev

理由

開発環境だけコンテナにインストールしたいライブラリやコマンドがあったりすると、開発のときだけ書き足して、本番環境で使うときはまた消してを繰り返すのは面倒だからです。

開発環境用のdocker-compose.ymlをつくる

方法

Dcokerfileのときと同じく、docker-compose.dev.ymlなどでつくります。
buildで任意のDockerfileを指定することもできます。

version: '3'
services:
  example-dev:
    build:
      context: .
      dockerfile: Dockerfile.dev

使用するときも同じく、コマンドで明示的にファイルを指定します。

docker-compose -f docker-compose.dev.yml build
docker-compose -f docker-compose.dev.yml up -d

理由

開発環境ではdocker-compose.ymlで指定する環境変数の値が違う(DBの接続情報、デバッグフラグ)ことがよくあります。
Dockerfileと同じく、毎回書き換えるのは面倒なので分けると便利です。

README.mdを作成して普段使うコマンドをまとめる

方法

こんな感じで、普段使うコマンドをメモ程度でいいのでREADME.mdにまとめておきます。

README.md

# example

## ローカル開発環境

ビルド

$ docker-compose -f docker-compose.dev.yml build --no-cache

起動

$ docker-compose -f docker-compose.dev.yml up -d

コンテナに入る

$ docker exec -it <コンテナ名 or コンテナID> bash

スクリプト実行

# /src/start.sh

## 本番環境用イメージ作成

$ docker build -t example-prod .

理由

後から自分が見返したときに楽です。
バグに気づいて直すときに、コンテナの使い方を忘れててもスムーズに思い出せますし、もし他の人が使うってなった時も最低限の使い方が書いてあれば、0から説明する手間も省けます。

ずっと起動させて使うコンテナは、自動で起動するようにする

方法

プロセスが永続的に実行されているDBやapacheサーバーが入っているコンテナやttytrueを設定しているコンテナに対して、restartalwaysに設定することで、ホストの起動と同時に自動でコンテナも立ち上がるように設定できます。

docker run --restart=always <イメージ名>
docker-compose.yml
version: '3'
services:
  example:
    build: .
    restart: always

理由

いちいちDocker Desktopを開いたりdocker psコマンドを使ったりして、「あのコンテナって起動してたっけ?」と確認する手間が省けます。クラウドサービスみたいにお金がかかるわけでもなく、ただただ便利。
プロセスが増えるのでホストが重くならないようにだけ注意しましょう。

Dockerfileで必要なコマンド、シンボリックリンク、エイリアスを設定する

方法

開発でコンテナに入って使用するものは、DockerfileのRUNで予め用意された状態のイメージにします。
必要なライブラリをインストールしたり、binにシンボリックリンクを作成します。

Dockerfile
FROM python:latest

# コマンドインストール
RUN apt-get update 
RUN apt-get install -y vim

# 自分で追加したライブラリのシンボリックリンク作成
ADD ./lib /opt/lib
RUN ln -s /opt/lib/example/example.py /bin/example

# エイリアス設定
RUN echo "alias ll='ls -al'" >> ~/.bashrc

理由

ローカルで開発するときは、docker execでコンテナに入ってあれこれすることがたまにあります。
そんなとき、Dockerイメージがミニマム構成なゆえにコマンドが少なすぎると感じたので、予めDockerfileでインストールしてしまったら楽だなと思ったからです。

さいごに

最後までありがとうございます。
コンテナ使ったアプリ開発の参考にして頂ければ嬉しいです。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?