#はじめに
Dockerとは、「開発環境を簡単に作れる便利なツール」です。
本格的に野球しようと思っても、場所作るの大変ですよね…。
ベースを用意して、距離測って置いて、バットもボールも観客席も用意して…。
しかし!Dockerを使えば一瞬でPayPayドームが出来上がります!(出来上がりません。)
野球場は無理ですが、システム開発環境であれば可能です。
- LAMPサーバー
- Wordpress
- Rails+DB etc...
瞬時にシステム開発環境を作成し、その環境を複数人に配ることが可能という便利なアプリです。
##この記事について
この記事で、コンテナ等の概念は特に触れていません。
以下のような目的で記事を作成しています。
- 実際にDockerを触れてみて、システム環境が整う感覚を味わえる。
- 後日思い出すときにすぐに引き出せる。
ネズコーーー!!!!!!
Dockerがんばって使えるようになるぞーーー!!!
##実行環境
- Mac Catalina
- Docker for Mac
※インストールまだの方は、上記公式サイトよりお願いします。
##参考にさせていただいたサイト
特に一番上のサイトを勉強及び参考にさせていただきました。概念もしっかり記述されているので、この記事の読者の方、是非閲覧されてください。
- 【連載】世界一わかりみが深いコンテナ & Docker入門 〜 その1:コンテナってなに? 〜
- DockerfileのRUN命令とCMD命令の違い【Docker】
- Docker ドキュメント日本語化プロジェクト
- Docker入門(第六回)〜Docker Compose〜
- docker-compose
up
とかbuild
とかstart
とかの違いを理解できていなかったのでまとめてみた - docker-compose.ymlの書き方について解説してみた
#では、やってみましょう!
##Dockerfileからコンテナを作成
CentOS7にPHPとApachをインストールしたコンテナを作成します。
###流れ
① Dockerfileを任意の場所に作成(ファイル名:dockerfile)
② 作成したDockefileからイメージを作成。
③ イメージを元にコンテナを作成する。
###手順
####① まずはdockerfileをPCに作成する。
#DockerHubからcentos7のイメージをもとにする。
FROM centos:centos7
#centos7のイメージの中でApachとphpをインストール
RUN yum -y install httpd php
#Åpachを起動するためのコマンドを実行
CMD ["/usr/sbin/httpd","-DFOREGROUND"]
####② 作成したDockerfileを元に、イメージを作成。
オプション等の説明はDocker ドキュメント日本語化プロジェクトを参照。
#内容
docker build -t イメージ名:タグ名 Dockerfileのディレクトリ
#例|イメージ名はlamptest。タグは1.0。カレントディレクリのdockerfileを使用
docker build -t lamptest:1.0 .
####③ 作成したイメージを元にコンテナ起動
#内容
docker run -d -p ポート番号:ポート番号 --name コンテナ名 イメージ名:タグ名
#例|ポート80版を8080版に割り当てる。
# コンテナ名はtestserver。
# イメージとタグは、lamptest:1.0を使用する。
docker run -d -p 8080:80 --name testserver lamptest:1.0
http://localhost:8080にアクセスすると、以下画面が表示されます。
###※補足※ コンテナの操作
#起動
docker start コンテナ名
#停止
docker stop コンテナ名
#コンテナの中に入る
docker exec -i -t コンテナ名 bash
###dockerfileコマンドの詳細説明
使用頻度の多いものを簡潔に記載しています。
より詳しい説明はDocker ドキュメント日本語化プロジェクトを参照してください。
####From
Dockerイメージをベースに作成する。
#内容
FROM イメージ名:タグ名
#例|centosのイメージをベースにする
FROM centos:centos7
####Run
FROMで指定したイメージ対してコマンドを実行。
#内容
FROM 実行するコマンド
#例|yumでhttpdのインストール
RUN yum -y install httpd
####COPY
Dockerイメージ内(コンテナ内)にコピーしたいファイルを指定。
#内容
FROM イメージ内にコピーしたいファイルのパス コピー先イメージのパス
#例|Dockerfileと同じディレクトリにあるhogeファイルを、/tmpディレクトリにコピー。
COPY hoge.txt /tmp
####ADD
URLが指定できる、tarアーカイブ(gzip、bzip2、xz)で圧縮されるファイルを指定すると自動展開される。
それ以外は、COPYコマンドと同じ。
#内容
ADD イメージ内にコピーしたいファイルパスやURL コピー先のイメージパス。
#例|tar.gzファイルを展開しつつ、イメージ格納
ADD hoge.tar.gz /tmp
#例|URL先のファイルを、指定したディレクトリに保存する。
ADD https://zukan.pokemon.co.jp/detail/025 /tmp
####RUN
イメージ作成時に、コマンドを実行する。
#内容
RUN コマンド オプション
#例|lsコマンドを-aのオプションを添えて。
RUN ls -a
####CMD
コンテナ起動時に、コマンドを実行する。
#内容
CMD [ コマンド , オプション ]
#例|lsコマンドを-aのオプションを添えて。
CMD [ ls , -a ]
####ENV
環境変数数に値を入れる。(イコールは省略可能。)
#内容
ENV 環境変数名=環境変数の値
ENV 環境変数名 環境変数の値
#例|環境変数MIZUNOKOKYUにichinokataを挿入
ENV MIZUNOKOKYU=ichinokata
####USER
ユーザー実行名の切り替え
#内容
USER ユーザー名
#例|ユーザー名をakiunleashに切り替え
USER akiunleash
##docker-composeで複数のコンテナを作成・連携
アプリとデータベースの複数のコンテナを、一つのシステムとして構築が可能です。
RailsとPostgreSQLのコンテナを別々に作成し、一つのシステムとして連携してみましょう。
###流れ
① docker-compose.yml等の必要なファイルを作成
② docker-compose runを使用してイメージ及びコンテナの作成
③ Gemfileが更新されるので、docker-compose bulde で再度構築
④ Rails側からPostgreSQLに接続できるようusernameやpasswordを設定変更
⑤ RailsからPostgreSQLのデータベースの作成
⑥ 完成!
###手順
####以下4つのファイルを準備します。
- docker-compose.yml
- dockerfile
- Gemfile
- Gemfile.lock
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_PASSWORD=password
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
# DockerHubからcentos7のイメージをもとにする。
FROM ruby:2.3.3
# パッケージ管理ソフトのアップデートからの
# build-essential libpq-dev nodejs をインストール
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
# コンテナ内にmyappディレクトリ作成
RUN mkdir /myapp
# ワークディレクトリに設定
WORKDIR /myapp
# dockerfileと同ディレクトリにあるファイルを、コンテナ内に作成
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
# Gemfileにかかれてるrailsをインストール
RUN bundle install
# Railsのファイル及びディレクトリをコンテナに作成
ADD . /myapp
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'
#空ファイル
####上記ファイルが保存されたディレクトリでコマンド実行
docker-compose run web rails new . --force --database=postgresql
####Gemfileが更新されるので、再度Gemをインストールするためコマンド実行
docker-compose build
####データーベースと接続するための情報を編集する。
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password: password
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
production:
<<: *default
database: myapp_production
username: myapp
password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
###アプリを起動してみましょう!
docker-compose up -d
####今の状態はデータベースが無いので作成します。
docker-compose run web rake db:create
####確認!
http://localhost:3000/にアクセスし以下のページが表示されれば成功です。
不要なコンテナが含まれている場合は一度ダウンして、再起動すると消えます。
# 一度ダウン
docker-compose down
# 再度アップ
docker-compose up -d
###docker-compose.ymlの解説
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_PASSWORD=password
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
項目 | 説明 |
---|---|
version | docker-composeのバージョン |
services | コンテナ名(WEBとDBを作成) |
image | Docker Hubからイメージを使用 |
environment | 環境変数を設定 |
build | 指定したdockerfileを使用する。 |
command | コンテナ作成後に実行するコマンド |
volumes | ファイルをマウント |
ports | ポートの指定 |
depends_on | 起動順序 |
#最後に
Dockerとはどういうものかの感覚を掴むための助けになれば幸いです。
内容に誤りがありましたら、ご指摘いただけると助かります。
#変更履歴
日付 | 内容 |
---|---|
2020/11/18 | 初版 |