はじめに
Dockerを使用してAmazonLinuxの開発環境(Nginx+PHP56+PHP-fpm-5.6)を作ろうとした際の自分のメモになります。
最終的にはEc2 Container Serviceでレポジトリの登録まで行います。
※今回の目標はvagrantと同じように使うことを想定します。
環境
MAC 10.10.5
Docker V 1.12.3-beta30
前提
AWS CLIのインストール
Ec2 Container Serviceでレポジトリの作成
概要
以下を参考にしました。わかりやすくて感謝です。
参考リンク:Amazon Linuxがコンテナ化されたので、Macで動かしてみた。
Step1 ログイン
とりあえずAmazonLinuxのイメージをPullする為にログインをします。
$ aws ecr get-login --region ap-northeast-1 --registry-ids 137112412989
docker login -u AWS -p XXXXXXXXXX(省略!) -e none https://137112412989.dkr.ecr.ap-northeast-1.amazonaws.com
ログインする為の情報がでますので、その内容をコピペし実行します。
$docker login -u AWS -p XXXXXXXXXX(省略!) -e none https://137112412989.dkr.ecr.ap-northeast-1.amazonaws.com
Flag --email has been deprecated, will be removed in 1.13.
Login Succeeded
これでログイン完了です。
Step2 Dockerのイメージをpull
Docker のイメージをPullします。
$ docker pull 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest
latest: Pulling from amazonlinux
e2daa1633485: Pull complete
Digest: sha256:939657b06a824c58f1532b104ba423c0c5efc16552c01427d96e9da20f8b2680
Status: Downloaded newer image for 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux latest feee9aea7094 11 days ago 328.3 MB
Step3 Dockerのイメージの起動
Dockerのイメージを起動します。
$ docker run -it 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest /bin/bash
bash-4.2#
Step4 SSH等をインストール
Dockerfileでbuildすればいいですが、今回は手動でやります。
なんとなくよく使っているのを入れときます。
$ yum -y install openssh-server openssh vim wget nginx
ついでにec2-userと同じことができるようなユーザを作成しておきます。
bash-4.2# useradd -g nginx -s /bin/bash devel
bash-4.2# yum -y install sudo
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest | 2.1 kB 00:00
amzn-updates/latest | 2.3 kB 00:00
Resolving Dependencies
--> Running transaction check
:
Dependency Installed:
vim-minimal.x86_64 2:7.4.1967-1.42.amzn1
Complete!
bash-4.2# echo "# devel " > /etc/sudoers.d/devel
bash-4.2# echo "devel ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/devel
bash-4.2# su - devel
Last login: Fri Nov 11 02:17:54 UTC 2016 on console
[devel@e17d83813adc ~]$ sudo su -
-bash-4.2#
PEMでログインできるようにします。
[devel@e17d83813adc ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/devel/.ssh/id_rsa):
Created directory '/home/devel/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/devel/.ssh/id_rsa.
Your public key has been saved in /home/devel/.ssh/id_rsa.pub.
The key fingerprint is:
df:f9:aa:9a:d8:bc:14:b5:03:8f:3f:eb:bc:f8:c8:f2 devel@e17d83813adc
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . . |
| = . |
| S + |
| + o . |
| . + o |
| .* = o . |
| .oE=Bo... |
+-----------------+
[devel@e17d83813adc .ssh]$ ls
id_rsa id_rsa.pub
[devel@e17d83813adc .ssh]$ mv id_rsa.pub authorized_keys
※id_rsaがpemになります。
Step5 PHP・nginx・mysqlをインストール
Dockerfileでbuildすればいいですが、今回は手動でやります。
bash-4.2# yum install php56 php56-mbstring php56-pdo php56-ldap php56-xml php56-mcrypt php56-gd php56-imap php56-pecl-imagick php56-pecl-apc php56-jsonc php56-fpm php56-mysqlnd curl-devel mysql-server mysql nginx
ちなみにnginxはこのままだと起動できませんでした。以下の追加が必要です。
参考
/etc/sysconfig/network: No such file or directory
-bash-4.2# echo "NETWORKING=yes" >/etc/sysconfig/network
Step6 monit 設定
このまま起動してもchkconfigの設定は無効なのでmonitを使用してデーモンの常駐させます。
bash-4.2# yum install monit
nginx,mysqld,sshd,php-fpm-5.6を監視させ起動させるようにする。
bash-4.2# cat /etc/monit.d/sshd.conf
check process sshd
with pidfile "/var/run/sshd.pid"
start program "/etc/init.d/sshd start"
stop program "/etc/init.d/sshd stop"
if failed port 22 protocol ssh then restart
if 5 restart within 5 cycles then alert
bash-4.2# cat /etc/monit.d/nginx.conf
check process nginx
with pidfile "/var/run/nginx.pid"
start program "/etc/init.d/nginx start"
stop program "/etc/init.d/nginx stop"
if failed port 80 protocol http
then restart
group nginx
bash-4.2# cat /etc/monit.d/mysqld.conf
check process mysqld
with pidfile "/var/run/mysqld/mysqld.pid"
start program "/etc/init.d/mysqld start"
stop program "/etc/init.d/mysqld stop"
if failed unixsocket /var/lib/mysql/mysql.sock then restart
if 5 restarts within 5 cycles then timeout
bash-4.2# cat /etc/monit.d/php-fpm-5.6.conf
check process php-fpm-5.6
with pidfile /var/run/php-fpm/php-fpm-5.6.pid
start program = "/etc/init.d/php-fpm-5.6 start" with timeout 60 seconds
stop program = "/etc/init.d/php-fpm-5.6 stop"
if failed unixsocket /var/run/php-fpm/php-fpm.sock then restart
if 5 restarts within 5 cycles then timeout
起動用のシェルを書き、docker起動時にそれを読ませる。
※rmはしなくてもOK。イメージ保存した時に起動してたので存在してただけです・・・
bash-4.2# cat /bin/init
#!/bin/bash
rm -fr /var/run/php-fpm/php-fpm-5.6.pid
rm -fr /var/run/php-fpm/php-fpm.sock
/sbin/service monit start
/bin/bash
bash-4.2# chmod 755 /bin/init
参考
MonitでSSH,Nginx,MySQLのサービス死活監視を行うChef Cookbook
Dockerでmonitを動かす(NginxとPHP(hhvm)とMySQL)
Step7 インストール後の設定
これでだいたいのインストール物は入ったはずなのであとは設定するだけ。
こちらはそれぞれだと思いますので割愛します。
(そのうち書くかも?)
Step8 最後にコミット
まずコンソールから抜けるのでctrl+qをします。
docker ps を使用しコンテナIDを調べます。
bash-4.2#
(ctrl + q)
$ docker ps -a
コミットを行いタグをつけます。containerName,imageNameは適当につけてください。
$ docker commit コンテナID containerName
$ docker tag containerName [自分のEc2 Container Serviceのレポジトリ]:imageName
Pushします。
$ docker push [自分のEc2 Container Serviceのレポジトリ]:imageName
The push refers to a repository [自分のEc2 Container Serviceのレポジトリ]
a9a8a5248aca: Pushed
b7f26e1ed260: Layer already exists
fcce637aae97: Layer already exists
imageName: digest: sha256:XXXXXXXXXXX size: 5314
あとがき
次回起動する時は以下で起動して下さい。
$ docker run -i -d -p 8080:80 -p 10022:22 -t [自分のEc2 Container Serviceのレポジトリ]/test/repo:base-set1
pullしてとってきた場合は以下のような感じかな。
$ docker run -i -d -p 8080:80 -p 10022:22 -t [自分のEc2 Container Serviceのレポジトリ]:imageName
Webは以下でアクセスできます。
https://localhost:8080
またSSHアクセスは以下の通りとなります。
$ ssh -p 10022 -i id_rsa devel@localhost
その他
参考
Amazon Linuxがコンテナ化されたので、Macで動かしてみた。
/etc/sysconfig/network: No such file or directory
MonitでSSH,Nginx,MySQLのサービス死活監視を行うChef Cookbook
Dockerでmonitを動かす(NginxとPHP(hhvm)とMySQL)
修正履歴
2016/12/01 見返して少しわかりずらかったので修正。