Docker ITかあさん

ITかあさん

Dockerでふるーーいphp5.2環境の構築

PHPの古い環境用意するのに、調べたこと、やったことをメモ。

参考

Docker を使って PHP 5.2 環境を用意してみる

これだとurlがrewriteに対応していないので追加

docker pull image

dockerイメージを取得します

docker pull tommylau/php-5.2
docker pull tommylau/nginx
docker pull mysql:5.7

docker image list

itkaasan@itkaasan-ThinkPad:~/work/$ docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 2f52e94d8acb        12 days ago         373MB
tommylau/nginx      latest              75d215ac1943        12 months ago       109MB
tommylau/php-5.2    latest              7e7ee5c92d52        13 months ago       371MB

my.cnfとnginxの設定ファイルをコンテナからコピー

MySQLの設定ファイルとnginxの設定を上書きしたいので設定ファイルをコンテナからマシンにコピーします、

※取り急ぎコピーして作ったものを記事の一番最後に貼っておきます

docker cp [コンテナ名]:[コンテナのディレクトリ] [ホストのコピー先ディレクトリ]

docker cpコマンドにて設定ファイルを複製しました。

あとはこのファイルをカレントディレクトリに置いて、起動させます

hogeディレクトリを、マウントディレクトリとしてrunコマンドで起動・開始します

mysql5.7コンテナを作成

hogehogeという名称のDBも一緒に作成しました

docker run –name mysql5.7 -v ~/hoge/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=hogehoge

mysql5.7とリンクしながらphp5.2の入ったコンテナを起動

docker run –name php -v ~/hoge:/var/www/html –link mysql5.7:mysql -d tommylau/php-5.2

php5.2とリンクしつつ、nginxを起動

docker run –name nginx -v ~/hoge:/var/www/html -v ~/hoge/default.conf:/etc/nginx/conf.d/default.conf –link php:php -p 9000:80 -d tommylau/nginx

http://localhost:9000
で、アクセスできます

取り急ぎ無事動きを確認してからと思ったのでdocker-composeに対応していません。。今度対応しよう。。

docker -v オプションで、コンテナにファイルを上書きできるっていうのは初めて知った。

nginxの設定ファイルとmysqlの設定ファイル

docker MySQL 後からバージョンをかえる

docker-compose.yml に記載しておいたMySQLのバージョンを後からやっぱり変えたい時。

Laravel5.4とMySQL5.6では相性が悪いので、MySQLのバージョンを上げることになったので、なんとなくメモ。
Laravel5.4から標準のcharasetがutf8mb4に変わったことに起因します

そこで、あとからやっぱりMySQLのバージョンを変更したい時の手順です。

docker imageなければ追加

docker pull mysql:5.7
docker-compose.ymlのMySQLのバージョンを5.7に変更
docker stop mysql56 docker
docker rm mysql56 docker
docker-compose up -d

一度MySQLコンテナごと破棄しているので、もう一度migrationを実行する必要があります。

HelloDockerFile!!DockerFileからPHP7×MySQL5.7×Apache環境を作る

HelloDockerFile!! 初めてのDockerFileからPHP7×MySQL5.7×Apache環境を作る

docker

Docker Hubにはたくさんの公式リポジトリがあって phpの公式のイメージももちろんあるのですが、試した結果やはりCentOS7をベースに構築した方がなんだかんだ良いということになりました。
ざっくり手順をまとめましたので何かの参考になれば幸いです

docker pullでMySQLの5.7バージョンのイメージをpullする

docker pull mysql:5.7

pullしたmysql:5.7のイメージからMySQLサーバーコンテナを起動する

docker runコマンドでコンテナ名の指定とMySQLのrootユーザーのパスワードとイメージの指定を行って起動します。

起動したMySQLコンテナにSequel Proを使ってアクセスする

スクリーンショット 2017-07-20 17.12.13

クライアントPC(Dockerのコンテナをインストしたマシン)から見ると今起動したMySQL5.7のコンテナはlocalhostになるので127.0.0.1(localhost)の見方になります。
先ほど設定したrootのパスワードを指定してログインします。

起動したMySQLコンテナにログインしてMySQLを直接叩く

ターミナルからコンテナにログインして、クエリを直接叩くことも可能です。
手順としては、docker psコマンドで起動中のMySQLコンテナのCONTAINER IDをコピーしてdocker exec コマンドでコンテナの中に入り、先ほど設定したMySQLのrootパスワードを指定するだけです

CentOS7イメージをベースにPHP7のイメージを作成する

ざっくり構成と手順

  • CentOS7のイメージをベースにPHP7のDockerFileを作成
  • docker imageをビルド
  • docker runでコンテナを作成・起動

参考

Dockerコンテナ内のCentOS7にPHP7をインストールする
今回はPHPについてのみ必要だったので、NPMパッケージ周りのインストールは取り外しました。

ビルド実行

カレントディレクトリにDockerFileがある想定で(DockerFileがあるディレクトリ出ないと buildできません)

docker build -t your-image-name .

ビルドしたらdocker run で起動します

解説

/your-app-source-dir:/var/www/html

apahceのデフォルトのDocumentrootディレクトリと、Dockerを起動しているクライアントマシンのソースコードのディレクトリを指定します。これでDockerのCentOS中のApacheのDocumentRootがリンクしてくれます

privilegedオプション

コンテナのすべてのデバイスへのアクセス許可の設定になります。説明が長くなるので下記リンクを参照してください。
詳しくはこちら。

-p 8000:80

ポート番号8000としました。ポートフォワードしてます。なので、今回 Dockerで起動したコンテナにブラウザからアクセスする場合はhttp://localhost:8000と、なります。

80:80

にしてあげればhttp://localhost/でアクセスができますので、本番環境をDockerで起動したコンテナとする場合は80ポートをそのまま使ってあげれば良いことになります。

your-php-container-name your-php-image

コンテナの名称は何も設定しなくても問題ないですが、よくわからない謎のコンテナ名がランダムでつけられるので管理の都合としても設定した方が良いです。imageの名称は省略できません。何のイメージを使ってそもそもコンテナを立ち上げるか
というコマンドなので必須です。imageが存在しなければ失敗します。

DFOREGROUND

フォアグランドで実行できるようにすることです。画面上で動かすことがフォアグランドですね。あとでDockerのコンテナにログインしてApacheをごにょごにょして再起動するのにこのオプションが必要になります。

そのほか各種設定の為に必要なこと

コンテナへアクセス


DockerのApacheは直後はそもそも起動していません。.htaccessの許可もされていない、 phpはエラーも吐かない設定になっているので、PHPがインストされたCentOS7のDockerコンテナにアクセスして 各種設定をしてからApacheを起動してあげる必要があります。
これらはDockerの説明ではなくあくまでもCentOS7にインストされているApacheの設定とやり方は同等になります。

PHPからMySQLへのアクセス

クライアントマシンからブラウザベースでアクセスするときはlocalhostですが、対コンテナ間ではlocalhostではアクセスすることはできません。
IPアドレスを取得して

それからIPアドレスベースでMySQLに繋げばいいですね

Sequal ProなどMySQLへDockerをインストしているクライアントマシンから直接アクセスする際はlocalhostでアクセスできますね。

まとめ

プロジェクトでちょいちょいDockerを使うことが増えたのでDockerFileを初めて書いてbuildしてみたのですが、PHPからMySQLへコンテナ間の通信をする方法がわからなかったり、
当たり前に使っていたapacheの再起動が使えなかったりとかなり戸惑いました。本当であればdockerをrunしてコンテナの起動のタイミングとapacheを同時に起動したかったのですが、
/usr/sbin/httpd -DFOREGROUND
と、すればApacheがDockerの立ち上げと同時に立ち上がることも分かっているのですが、すると今度はapacheの再起動ができません。CentOS7のサービス(デーモン)が使えないのです。
ちょっと今後の課題とします・・・
なお、PHP7は公式イメージもあるのですが、色々設定を変えようと思った際、Mobyを公式は使っていて、CentOS系の知見に頼りたかったが為にCentOS7ベースで構築しました。
結果、この方が構築には早かった次第です

Docker不要なコンテナ、イメージを大掃除!コンテナとイメージの一括削除

Docker不要なコンテナ、イメージを大掃除!コンテナとイメージの一括削除

go言語を最近趣味で始めたのですが何せ始めたばかりなもんで次々dockerのイメージを追加しまくってdockerのイメージリストがすごいことに。。
そんな訳で、今回はぐっちゃぐちゃになったDockerのイメージとコンテナのお掃除をしたいと思います!

コンテナの削除

まずはコンテナの削除から。コンテナに対して使ってないイメージの削除 という手順が取れるのでまずはコンテナから削除しています。

コンテナの一覧

$ docker ps

CONTAINER IDを指定して対象のコンテナを削除する

$ docker rm 98908bd74987

このとき、コンテナは停止してないと削除することができません。

再度コンテナの一覧

$ docker ps

停止中だろうがとにかくコンテナ一括削除してやるぜオラオラー!

-f フォースオプションをつけて強制的にオラオラ一括削除

$ docker rm -f $(docker ps -a -q)

今回だと一括削除だけれども、起動中のコンテナIDを指定して削除するケースでもforceオプションつけることで強制削除が可能。

続きましてー、イメージの削除

どんどんイメージ追加していくと、コンテナよりもイメージがどんどん増えてしまいますねー。
### イメージ一覧

$ docker images

IMAGE IDを指定して削除

$ docker rmi 6d9bf2aec386

発生するエラー

Error response from daemon: conflict: unable to delete 6d9bf2aec386 (must be forced) – image is referenced in multiple repositories

複数のリポジトリから参照されているイメージだから削除できないよ。強制的にやって
とあります。

IMAGE IDを指定して強制削除

$ docker rmi 6d9bf2aec386 -f

未使用のイメージの一括削除

$ docker rmi `docker images -aq`

所要時間わずか5分!Microsoft AzureでWordPress on Dockerが使える!

Microsoft AzureでWordPress on Dockerが使える!

docker_wordpress

ローカルの開発環境はDockerでWordPressイメージですって?じゃあ本番環境ももちろんDockerですよね?

開発環境と本番環境で環境の差分はつきもの。だったら最初から環境が全く同じ、Docker で開発してるのなら検証サーバーも本番サーバーもDockerで環境統一した方が楽じゃない?ってなことでMicrosoft AzureでDockerを入れて、WordPressのイメージも突っ込んでみました。所要時間はなんと5分ほど。このブログ記事書いてる方がよっぽど時間かかっちゃったよ。

まずはMicrosoft Azureのクラシックサーバーに Dockerをインストールするところから

スクリーンショット 2017-05-07 23.50.48

Docker on Ubuntu Serverを今回は導入しました。

スクリーンショット 2017-05-07 23.51.06

デプロイモデルはクラシックのみ対応しているようです。

スクリーンショット 2017-05-07 23.55.19

価格レベルやリソースグループ 認証方式や初期ユーザを設定して作成します

スクリーンショット 2017-05-07 23.55.31

はい、Dockerのクラウド環境はひとまずこれだけ。あとはSSHで接続してコマンドラインでDockerにWordPressイメージを追加しましょう

SSHよりクラウドサーバにアクセス

SSHから作成したAzure のサーバーにアクセスします。

WordPressより先にMySQLコンテナを追加

DBの名称、ユーザ名 パスワードを設定します。

$ docker run –name wordpress-mysql -e MYSQL_ROOT_PASSWORD=xxxx -e MYSQL_USER=xxxx -e MYSQL_PASSWORD=xxxx -e MYSQL_DATABASE=xxxx -d mysql

次にWordPressのコンテナを入れます。xxxxはコンテナ名なので自由に設定。-p 8080:80でポートフォワードしています。

$ docker run –name xxxxx -p 8080:80 –link wordpress-mysql:mysql -d wordpress

これだけで終了!!!!2つしかコマンドを打っていませんね!素晴らしい。

ブラウザからアクセス

事前にAzureのコンパネから80ポートの解放は行っておいて ブラウザからアクセスできるようにしてあげます。

http://yourDNSName:8080 でブラウザからアクセスしてください

スクリーンショット 2017-05-12 12.05.55

WordPressユーザなら大好きなあの画面が登場!!

無事設置が完了しました!