気ままに

プログラム関連で困ったことを調べて気ままに投稿

今更ながらDockerでCentOS PHP5.6 の環境を構築

複数のPHPのバージョンを入れて開発することになり、どうしてもローカルのMacで複数のバージョンのPHPを動かすには問題が多く、 これは仮想環境にしなとということで、せっかくなのではやりのDockerを使ってコンテナ環境で開発環境を構築してみたよ。

Dockerのインストール

ダウンロードページからOSに合わせてDockerをインストール

設定とか色々他のサイトにゆずり、dockerで、環境構築の手順をまずは

Dockerのコンテナのイメージ確認

お試しで、以下の環境をインストール

種類 docker hub コンテナ,タグ
PHP https://hub.docker.com/_/php/ php:5.6.33-apache
Postgres https://hub.docker.com/_/postgres/ postgres:10.2

Postgresのコンテナ起動

$ docker run -d --name postgres102 -e POSTGRES_PASSWORD=pass -p 5432:5432 postgres:10.2
Unable to find image 'postgres:10.2' locally
10.2: Pulling from library/postgres
3e731ddb7fc9: Pull complete
6c47120e994b: Pull complete
5f766d668e8a: Pull complete
25131cac3889: Pull complete
64d99bc5f521: Pull complete
52f77b20404c: Pull complete
f170bb6b5bb2: Pull complete
13d81ba24d2f: Pull complete
2a967418f27e: Pull complete
e2be162d20ac: Pull complete
8809054a7d3a: Pull complete
330d4f0775cd: Pull complete
ff84a9ce0acb: Pull complete
Digest: sha256:7361bae1fbf5642099663d1f02dc949cabde1f86727bf8ff00d0a8806640a617
Status: Downloaded newer image for postgres:10.2
13f5208513e94b4243abe4acfb126516d5fb74edd28575b9ced705922c4a0c3f

bashでログインする

$ docker exec -ti postgres102 bash

PHPコンテナ起動

$ docker run -d --name php56 php:5.6.33-apache

起動済みの コンテナを確認

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
b0ea94c2781b        php:5.6.33-apache   "docker-php-entrypoi…"   3 hours ago         Exited (0) 16 minutes ago                            php56
13f5208513e9        postgres:10.2       "docker-entrypoint.s…"   4 hours ago         Up 4 hours                  0.0.0.0:5432->5432/tcp   postgres102

起動済みコンテナの削除

$ docker rm -f b0ea94c2781b

port 変更して起動( -p ホスト:コンテナ)

$ docker run -p 8000:80 --name php56 -d php:5.6.33-apache

ホスト側のポートを8000に設定したので、Macの場合 http://localhost:8000 にアクセスすると表示される

  • PHPコンテナにbashでログイン
$ docker exec -ti php56 bash

これだと、phpのコンテナからpostgresのコンテナへアクセスできないので、

$ docker run -p 8000:80 --name php56 -d php:5.6.33-apache --link postgres102

これで、postgres102という名前でpostgresへアクセスができるようになる。 またpgCommanderなどからpostgresへ接続する場合は、 ログイン情報を設定してやる必要がある。 設定は、環境変数に設定するので、以下の内容を引数で渡す。

  • POSTGRES_DB
  • POSTGRES_PASSWORD
  • POSTGRES_USER

詳しくはここ

run — Docker-docs-ja 17.06.Beta ドキュメント

$ docker run -p 8000:80 --name php56 -d php:5.6.33-apache --link postgres102 -e POSTGRES_DB=db -e POSTGRES_PASSWORD=password -e POSTGRES_USER=pg_user

これだと長いし、毎回書くのが大変、そこでDockerファイルでこの情報をまとめる

# 使うイメージの指定
FROM postgres:10.2

# ポートを割り当て
EXPOSE 5432:5432

# 環境変数の設定
ENV POSTGRES_DB=db POSTGRES_PASSWORD=password POSTGRES_USER=pg_user

Dockerfileで起動するには、まずimageを作成する必要がある。

docker build .
docker run

これで、先程と同じようにpostgresが起動できる。

まずは、ここまで。 docker-compose を使うと複数のコンテナを起動して、リンクしてなどを1ファイルで管理(別ファイルに設定を切り出すことも可能)できるので便利。

dockerは、サーバの知識も必要だけど、コマンドの意味とサーバの設定がどうなったかを確認するのが、最初はミスに気づかずに起動しなくなったりも、、、

Dockerfileは、buildするとそのコンテナを使いまわすので、Dockerfileを書き換るだけじゃなくbuildのし直したが必要です。 また、imageが残ったままだと不便なので、最初は以下のコマンドで、一度削除してからbuildすることをオススメします。

docker stop
docker rmi $(docker -qa)

こうするとdockerのコンテナを停止して、停止中のimage含め削除することができます。

とても参考になった本は、これ

良書だから、つい最近第2版がでたようです。

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

以上