Blog

DockerでさくらVPS上にLAMP環境を1から作る

  • Update2016-08-01
  • Category
    • Backend
  • Other--
DockerでさくらVPS上にLAMP環境を1から作るのサムネイル画像

最近やっとDockerを使い始めました。ちょうど一昨日あたりか、Dockerのバージョンも正式版が出たようで、今後ますます使われそう。

今回は備忘録として、DockerをさくらVPS上で1からLAMPで構築してみたので備忘録メモとして残しておきます。なお、dockerの基本的な事については細かく書いていないのでドットインストールとか参考にしてください。

今回作る環境ですが、古いのも何なので、現時点(2016/8/1)での最新版で構築したいと思います。

OS:Ubuntu16.04
php:7.0.9
mysql:5.7
phpmyadmin:4.6.3

なお、さくらVPS上でUbuntu16.04はカスタムイメージ上からインストールできますのでインストール時の設定などは省略します。自分はこちらを参考にしました。

カスタムOSインストールガイド – Ubuntu 16.04

まずお決まりのアップデートをします。

sudo apt-get update
sudo apt-get upgrade
sudo reboot

vimをインストールしておきます。

sudo apt-get install vim

鍵認証の設定

SSHの設定を開いて、rootでのログインをnoにするなどの変更をします。

sudo vim /etc/ssh/sshd_config
(ポート番号変更、rootログインno)
sudo /etc/init.d/ssh restart

Macターミナル、Windowsの方はPuttyのごった煮などを使ってアクセスしてみます。以下はMacターミナルの方法です。ユーザー名kote2でアクセスしています。

ssh kote2@***.***.***.*** -p 10022 #***は自分のサーバーのIP

さてMac側に戻ってきて今度は鍵を作成

cd #ホームディレクトリに戻る。一応。
cd .ssh #.sshディレクトリ作成
ssh-keygen -t rsa #秘密鍵・公開鍵作成
(適宜id_rsa_**など名前変更) #
cat id_rsa_sakura_vps2.pub #公開鍵の内容を表示$内容をコピーしておく

サーバー側でMacでコピーしておいたキーをauthorized_keysに追記します。パーミッションもこの時変更するのを忘れずに。

mkdir .ssh
chmod 700 .ssh
cd .ssh
vim authorized_keys
(コピーしてきたキーをペースト)
chmod 600 authorized_keys

以下でアクセスできればOKです。

ssh -i .ssh/id_rsa_sakura_vps2 kote2@***.***.***.*** -p 10022

無事アクセスできたらSSHの設定を開いて追加でログイン方法でパスフレーズをnoにします。

sudo vim /etc/ssh/sshd_config
(ログインパスno)
sudo /etc/init.d/ssh restart

Dockerのインストール

基本的には公式ドキュメントを参考に。
https://docs.docker.com/engine/installation/linux/ubuntulinux/

ここいら辺は公式ドキュメント通りにやるだけです。

ssh -i .ssh/id_rsa_sakura_vps2 kote2@***.***.***.*** -p 10022
uname -r #カーネルの確認
sudo wget -qO- https://get.docker.com/ | sh #インストール
docker -v #インストールのバージョン確認
sudo service docker start #docker起動
sudo docker run hello-world #hello worldコンテナ起動。この時はsudoをまだ使う。

Ubuntuは初期でrootは使えないので設定

sudo su -
passwd #パスワードも設定

root権限でお使いのユーザーをdockerグループに登録します。これをやるとdockerコマンドを使うときにsudoをつけなくても良くなります。

su -
sudo groupadd docker
sudo usermod -aG docker kote2
cat /etc/group | grep kote2 #確認
exit #接続し直す
docker run hello-world #sudoをつけなくてもコンテナ起動

Dockerイメージ

まずDorckerイメージをバックグラウンドで起動してみます。-dオプションはバックグラウンドで起動という意味です。

docker run -d php:7.0-apache #コンテナを起動
docker images #dockerイメージ一覧を表示
docker ps #起動中のコンテナを確認

次はブラウザで表示を確認します。-pオプションはポート番号指定で左側がホスト、右側がコンテナ側です。以下の場合はdockerコンテナ80番ポートをホスト側の80番ポートに転送します。

docker run -p 80:80 -d php:7.0-apache
(ブラウザにアクセス。ForbiddenならOK)
docker ps #起動中のコンテナを確認
docker rm -f ***(コンテナID) #コンテナIDのコンテナを削除

ちなみに起動したコンテナは-aオプションをつけると確認できます。また、起動したことのあるコンテナを一括削除する方法もあります。テストする際よく使うので覚えておくと便利かも。

docke ps -a #起動中、または起動したことのあるコンテナ一覧
docker rm -f $(docker ps -a -q)#登録されているコンテナを一括消去

今度は–nameでコンテナ名をつけて起動します。またコンテナ上で起動しているターミナルを利用してindex.phpを書き出します。

docker run -p 80:80 --name php -d php:7.0-apache
docker exec -ti php bash #ターミナルに入る
echo ' index.php #index.phpファイルを作る
(ブラウザにアクセス。phpinfoが出ていればOK)

ホスト側にindex.phpを作成する

先程はコンテナにアクセスしてindex.phpを書き出しましたが、コンテナを止めたりするとindex.phpも消えちゃいます。なので今度はホスト側にindex.phpを持ってそれを表示させます。

ホスト側でindex.phpを作成し、-vオプションでコンテナ側のディレクトリをホスト側のディレクトリに転送するようにします。

vi /var/www/html/index.php #場所はどこでもよいです
(phpinfo();を記述)
docker rm -f ***(コンテナID)
docker run -p 80:80 -v /var/www/html:/var/www/html --name php -d php:7.0-apache

これでホスト側のindex.phpを読みに行きます。

MySQLコンテナの作成

先ほどのコンテナはそのまま起動しつつMySQLコンテナを作ります。

docker run --name mysql -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7
docker exec -ti mysql bash #mysqlコンテナのターミナルにアクセス
mysql -ppass #MySQLにログイン。確認したらByeしてください。

Dockerfileでの自動化

今までは手動でコンテナを作ってきましたが、Dockerfileを使って自動化してみます。

docker rm -f $(docker ps -a -q) #まずコンテナを一括消去
(適当な場所にDockerfileを作って以下を記入。例では/home/kote2/dockerに作ります。)
FROM php:7.0-apache
RUN apt-get update && \
  docker-php-ext-install pdo_mysql mysqli mbstring

docker build -t php:custom /home/kote2/docker #php:customというイメージを作成

Docker Hub上のMySQLはcharacter setがlatinになっているので、起動する際設定ファイルを使用して一部書き換えるようにしてみます。以下を記述して適当な場所に保存してください。

/home/kote2/docker/mysql_custom.conf

[mysqld]
character-set-server=utf8

では先ほど作成したdockerイメージを使ってApacheコンテナを起動してみます。以前のMySQLコンテナは削除しておきます。

docker rm -f $(docker ps -a -q) #コンテナ一括消去
docker run --name mysql -v /home/kote2/docker:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7 #起動

ApacheコンテナとMySQLコンテナをリンクさせる

起動したMySQLコンテナを以下コマンドでリンクさせてApacheコンテナを起動します。–linkを使います。

docker run -p 80:80 -v /var/www/html:/var/www/html --link mysql:mysql --name php -d php:custom
docker exec -ti php bash #ターミナルに接続
cat /etc/hosts #mysqlがあれば成功

phpmyadminを使って確認してみる

次はphpmyadminを使ってブラウザ上でデータベースにアクセスできるか確認します。ホスト側にphpmyadminのファイルを展開します。

cd /var/www/html
sudo wget https://files.phpmyadmin.net/phpMyAdmin/4.6.3/phpMyAdmin-4.6.3-all-languages.tar.gz
sudo tar zxf phpMyAdmin-4.6.3-all-languages.tar.gz
sudo rm phpMyAdmin-4.6.3-all-languages.tar.gz
sudo mv phpMyAdmin-4.6.3-all-languages myadmin
cd myadmin
sudo cp config.sample.inc.php config.inc.php
sudo vi config.inc.php #以下を記述
$cfg['Servers'][$i]['host'] = 'mysql';

phpmyadminにアクセスし、root,passでログインできればOKです。

PDOでデータを入れてみる

最後にphpからデータが入れられるか確認します。phpmyadminからデータベース作成します。

CREATE DATABASE test;
USE test;
CREATE TABLE test(name VARCHAR(100));

test.phpを作成し、アクセスします。

$db = new PDO('mysql:host=mysql;dbname=test', 'root', 'pass');
$db->query("INSERT INTO test VALUES('kote2さん')");
$st = $db->query("SELECT * FROM test");
var_dump($st->fetchAll());

phpmyadmin上でデータが入ってるか確認します。

いじょ!