Help us understand the problem. What is going on with this article?

Dockerを使用したAmazonLinuxの開発環境作成

More than 1 year has passed since last update.

はじめに

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 見返して少しわかりずらかったので修正。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away