Day-to-day the memorandum

やったことのメモ書きです。

dokcerをやってみた(前篇)

CentOS7にdockerを入れてApache+PHP+MySQL+phpMyAdminの環境を構築してみたのでその時のメモ(完全自分用)

はじめに

dockerをインストールする環境を晒しておきます。

$ uname -a
Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

yumでdockerをインストールします。

$ yum -y install docker

ちなみにこの時のdockerのバージョンは以下です。

$ docker --version
Docker version 1.9.1, build 78ee77d/1.9.1

dockerはイメージを使ってコンテナを立てます。
なのでそのイメージを作ってみます。

フォルダ構成

例のごとくフォルダ構成を書いておきます。

docker
   ├─ Dockerfile
   ├─ conf
        ├─ phpMyAdmin.conf

Dockerfileの作成

まずDockerfileを作成します。

#os image
FROM centos:latest

#Apache
RUN yum -y install httpd
RUN systemctl enable httpd

#wget
RUN yum -y install wget

#MySQL
RUN wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
RUN rpm -Uvh mysql-community-release-el7-5.noarch.rpm
RUN sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/mysql-community.repo
RUN yum -y --enablerepo=mysql56-community install mysql-community-server 
RUN systemctl enable mysqld

#PHP
RUN yum -y install php php-mysql php-mbstring

#phpMyAdmin
RUN yum install -y epel-release
RUN yum install --enablerepo=epel -y phpMyAdmin
COPY conf/phpMyAdmin.conf /etc/httpd/conf.d/phpMyAdmin.conf

FROMはイメージを作成するときにベースとなるイメージを指定します。
以下のサイトから検索して、いろいろなイメージを指定することができます。
https://hub.docker.com/
検索後、詳細ページにタグ込みで載っているので使いたいイメージのバージョンまで指定できます。
今回はofficialのcentosのlatestを使用します。
タグを省略すると自動的にlatestタグがついたイメージが使われます。

RUNは実行したいコマンドを記述できます。
ここではApacheやらMySQLやらをインストールしています。

COPYはファイルなどをコピーすることができます。
例のごとくphpMyAdminの設定ファイルをコピーしています。

ほかにもコンテナを起動するときに実行したいコマンドを指定できる「ENTRYPOINT」や「CMD」があります。

ざっと説明をしましたが詳しい仕様はリファレンスへ
https://docs.docker.com/engine/reference/builder/

イメージの作成

Dockerfileがあるディレクトリで以下のコマンドを実行します。

$ docker build -t sample:sample .

書式は以下のとおりです。
docker build [ -t イメージ名 [ :タグ名 ] ] Dockerfileのあるディレクトリ
「-t」 オプションでイメージに名前を付けることができます。

以下のコマンドでイメージが作成されているか確認します。

$ docker images

REPOSITORYがsample,TAGがsampleのイメージが作成されいるはずです。
TAGを省略すると自動的にlatestが付きます。

コンテナの作成

では作成したイメージからコンテナを起動してみます。

$ docker run --privileged -itpd 8080:80 --name sample sample /sbin/init

docker run コマンドでコンテナを作成し、起動します。
「-i」ホストの入力をコンテナの標準出力をつなげるもの。
「-t」コンテナ内の標準出力とホスト側の出力をつなげるもの。ttyを確保する?(表現があってるかわかりません。)
「-p」ホストとゲストのポートフォワーディングを設定しています。
「-d」コンテナをバッググラウンドで起動します。
「--name」--name 作るコンテナ名 使うイメージ名
という書式です。指定しない場合は適当につけられます。
「--privileged」については調べ切ってないので、割愛します・・・。
最後はrun時に実行するコマンドを書いています。
上記の場合だと「/sbin/init」になります。
「--privileged」と「/sbin/init」を指定しないと「systemctl」コマンドが動かなかったため上記のようにしています。
(「Failed to get D-Bus connection: Operation not permitted」というエラーがでる。)
またバッググラウンドで起動する場合、プロセスが終了すると勝手にコンテナも終了してしまうので、動き続けるプロセスを実行させる必要があります。
httpdをフォアグランドで実行するなど)

アクセス

dockerホストの8080にアクセスしてApacheのテストページが表示されたと思います。

ちなみにコンテナの中に入るときは

$ docker exec -it sample /bin/bash

execコマンドは起動しているコンテナに追加でコマンドを実行することができます。
上記の場合は「/bin/bash」を実行してコンテナの中に入っています。
コンテナからホストに戻る場合は「Ctrl + p」と「Ctrl + q」で戻ることできます。

ざっとこんな感じでしょうか。

Dockerのコマンド

上記にないコマンド

$ docker start sample   #コンテナを起動する。
$ docker stop sample    #コンテナを停止する。
$ docker attach sample  #コンテナに入る。
$ dokcer ps             #起動しているコンテナを表示する。
$ docker ps -a          #すべてのコンテナを表示する。
$ docker rm sample      #コンテナを削除する。
$ docker rmi sample     #イメージを削除する。

おわりに

今回は1つのコンテナにApacheMySQLを構築しましたが、本当は1コンテナにつき1サービスでやるべきらしいです。
後篇はApacheMySQLを1コンテナずつに構築し、それを管理するDocker-comporserについて書きたいと思います。
(書けるといいなあ)