Raspberry Pi 2 Alpine Linux(3.8.1) - TEST

学習用に構築したRaspberry Pi 2 on Alpine Linux(3.8.1) + dockerで簡単なテストをしてみたいと思います。

Alpineの公式イメージにnginx + phpをインストールして動作を確認してみます。

コンテナの作成

Alpineの公式イメージ

# docker pull alpine


ちょっと確認してみるとrcコマンドが入ってないようです。
イメージサイズも4.01MBとあって初期インストールパッケージも少ないですね。

新たにnginxコンテナ作成

# docker container run --privileged -d -p80:80 --name nginx_alpine alpine /sbin/init
# docker container exec -it nginx_alpine /bin/sh

コンテナに入ってbashをインストール後はdocker cpで.bashrcをコピー /bin/bashで入り直しています。

# apk update
# apk add openrc bash

nginxインストール

# apk add nginx
# nginx -v
nginx version: nginx/1.14.0
# rc-update add nginx
# rc-service nginx start

rc-service nginx startを実行するとネットワーク関連でエラーが出てしまいます。
dockerコンテナ内ではinterfaces設定が必要ないので/etc/init.d/nginxのネット項目をコメントアウトします。

/etc/init.d/nginx
#depend() {
#   need net
#   use dns logger netmount
#}


一旦exitしてコンテナを再スタート
# docker container restart nginx_alpine
無事動き出しました。

php7インストール

# apk add php7-fpm

nginx同様/etc/init.d/php-fpm7もネットをコメントアウト

/etc/init.d/php-fpm7
#depend() {                                              
#       need net                                         
#       use apache2 lighttpd nginx                       
#}

/etc/php7/php-fpm.d/www.confの編集

/etc/php7/php-fpm.d/www.conf
user = nginx
group = nginx

listen.owner = nginx
listen.group = nginx
# rc-update add php-fpm7
# rc-service php-fpm7 start


php-fpm7も無事動きました。

nginx default.conf設定
apkでインストールされるnginxにはhtml関連ファイルは一切入ってないので頑張って編集するかコピーしなければいけません。ファイルの置き場所は/usr/share/nginx/htmlです。
phpは以下の設定で動きました。

/etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        root   /usr/share/nginx/html;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }
}
# rc-service nginx restart
# rc-service php-fpm7 restart

raspbianコンテナを作成

Alpine Linuxからraspbianベースイメージを使ってコンテナを作成してみました。
作成方法は前回の記事と一緒です。スタートすると問題なく動くのですが再スタートすると以下のようなエラーが出てしまいます。Webるとこの手のエラーはいろいろ報告されていますがdiskless Alpineでの有効な対策はいまのところ見つかっていません。回復するにはOSのリブートをする必要があります。

# docker container start nginx_alpine
Error response from daemon: cgroups: cannot find cgroup mount destination: unknown
Error: failed to start containers: nginx_alpine


今回作成したコンテナをcommitしてみました。比較するとAlpineベースは圧倒的に小さいですね。小さいコンテナを積み上げていくという概念がよくわかると思います。

dockerの基本的な使い方は目的にあった信頼できるイメージがあればコンテナ外から設定ファイルを付け加えていくという方法のようです。いずれそんな使い方ができるかもしれません。(?)

Raspberry Pi 2 Alpine Linux(3.8.1)

前回から作業を進めているRaspberry Pi ZERO(W)のAlpine Linux(3.8.1)ですがOSとしては動作するのですがDockerの運用となるといろいろ問題があるようです。

Dockerは有線(eth0)に対してブリッジを張るようでwifiのみではdockerはboot時でクラッシュしてしまいます。ちなみにpiの仕様上と思いますがLANケーブルを接続しなくても認識できるeth0デバイスを接続すればwifiからdockerは使用可能になります。
但し公式のコンテナでも特にエラーは出ないのですが動かない(lsリストに載ってこない)ものが多いということで折角zeroで環境を作ったので予備のpi2での運用に切り替えることにしました。

カードの作成

今回は32GBのカードを使ってみました。disklessとあってOSの起動領域は本当少なくていいですね。

一応1000MiBで3個残りをdocker用に割り当てました。
インストールをやり直す時はbootのFAT32をフォーマット、再度書き込めばOKです。
基本のカード作成だけは2〜3分で完了できるようになりました。

ssh接続

前回からまた何度かカードを作り直したのですが初回の接続からキャンセルを喰らうようになりました。初期設定が面倒ですが鍵認証で行くことにしました。
鍵認証の具体的な方法は他を参照してもらうとして接続する側(pi3 root)でssh-keygenを実行、鍵を作成します。パスフレーズは空が使いやすいでしょう。公開鍵は作成したパーテーションに保存。ポイントは以下のとおり
インストールが正常に完了したら鍵(id_rsa.pub)をauthorized_keysに読み込ます
sshd_configを編集、rootログイン可とする
設定が保存できるようにlbu.listを作成

# mkdir ~/.ssh && chmod 700 ~/.ssh
# mount /dev/mmcblk0p2 /mnt
# cp /mnt/id_rsa.pub ~/.ssh
# cd ~/.ssh
# cat id_rsa.pub >> authorized_keys
# chmod 600 authorized_keys
# vi /etc/ssh/sshd_config
PermitRootLogin yes
# vi /etc/apk/protected_paths.d/lbu.list
+root/*/
+root/*/*
# lbu ci -d 忘れずに!
# reboot

rebootして設定が消えていないことを確認
OKだったらカードをZERO(Pi2)に挿し替えて起動
鍵認証はバッチリですねパスワードなしOK
user作成時などパスワード変更を求めてくることがありますが正規の手順でOKです。また戻すことも可能です。

環境設定

# apk add bash vim shadow tmux

sudoはエラーでうまく動かなかったのでroot lohinで運用することにしました。

Persistent storage(永続ストレージ)

当初の設定はほとんどZEROで実行しています。disklessのためメモリの50%の中で動作しているようです。

OSや最低限のツール、dockerを導入するとほぼ一杯になってしまいます。
tmpfs 217.1M 186.2M 30.9M 86% /
そこでwiki.alpinelinux.org/wiki/Raspberry_PiにあるPersistent storage(永続ストレージ)を設定してみました。
OS領域には1GB取っているので512MBをを割り当てることにしました。

# mount /media/mmcblk0p1 -o rw,remount
/etc/fstab 手作業で編集(ro -> rw)
/dev/mmcblk0p1  /media/mmcblk0p1 vfat    rw,relatime,fmask=0022,dmask=0022,errors=remount-ro 0 0
# dd if=/dev/zero of=/media/mmcblk0p1/persist.img bs=1024 count=0 seek=524288
0+0 records in
0+0 records out
# apk add e2fsprogs
# mkfs.ext4 /media/mmcblk0p1/persist.img

# mkfs.ext4 /media/mmcblk0p1/persist.img
mke2fs 1.44.4 (18-Aug-2018)
Creating filesystem with 131072 4k blocks and 32768 inodes
Filesystem UUID: 0d7ee3d4-8734-4c8f-8ac0-72b35e2ac35a
Superblock backups stored on blocks: 
	32768, 98304
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

# echo "/media/mmcblk0p1/persist.img /media/persist ext4 rw,relatime,errors=remount-ro 0 0" >> /etc/fstab
# mkdir /media/persist 
# mount -a

/etc/fstab に追記されます。

/media/mmcblk0p1/persist.img     /media/persist ext4 rw,relatime,errors=remount-ro 0 0
overlay /usr overlay lowerdir=/usr,upperdir=/media/persist/usr,workdir=/media/persist/.work 0 0
# lbu ci -d 忘れずに!

さてこのPersistent storageですがapk addしたパッケージはlbu ci -dを実行するとメモリに読み込まれ実行しなければPersistent storageの/usr以下に保存されます。(rebootしておくのがいいtでしょう)
但しdockerのようにbootから起動が必要なものはlbu ci -dしてメモリに保存しなければいけません。システムに直接関係しているアプリケーションはやはりメモリにインストールが必要です。

dockerインストール

Docker https://wiki.alpinelinux.org/wiki/Docker

# apk add docker
# rc-update add docker boot
# lbu ci -d 忘れずに!
# reboot

# docker -v (起動を確認)
Docker version 18.06.1-ce, build d72f525745
当サイトの目的はAlpine Linux上で走るdockerだったりするので/var/lib/dockerを用意していたmmcblk0p4にマウントします。またmmcblk0p2,mmcblk0p3もマウント
外部のストレージはマウントできません。

# mkdir /media/reserve
# mkdir /media/share

/etc/fstab 編集(当サイト現状のfstab)

/dev/cdrom      /media/cdrom     iso9660 noauto,ro 0 0
/dev/usbdisk    /media/usb       vfat    noauto,ro 0 0
/dev/mmcblk0p1  /media/mmcblk0p1 vfat    rw,relatime,fmask=0022,dmask=0022,errors=remount-ro 0 0
/dev/mmcblk0p2  /media/reserve   ext4    defaults,noatime  0 0
/dev/mmcblk0p3  /media/share     ext4    defaults,noatime  0 0
/dev/mmcblk0p4  /var/lib/docker  ext4    defaults,noatime  0 0
/media/mmcblk0p1/persist.img     /media/persist ext4 rw,relatime,errors=remount-ro 0 0
overlay /usr overlay lowerdir=/usr,upperdir=/media/persist/usr,workdir=/media/persist/.work 0 0
# lbu ci -d 忘れずに!
# reboot

冒頭に述べたとおりZEROではDockerの運用に問題があったためPi2に挿し替えました。

ネットワークは有線です。
pi2ではtmpfsも大分余裕ができました。
/var/lib/dockerやその他も正常にマウントできています。
Persistent storageはoverlay /usrとして見えています。
Docker ComposeはPersistent storageにインストールしていますがまだ試すに至っていないので正しく動作するかはわかっていません。


次回はこのRaspberry Pi 2 + Alpine Linux + Docker で簡単なテストをしてみたいと思います。

Raspberry Pi (Docker Container)のソースリストについて

今回新たにRaspbianベースのイメージをpullコンテナを作成してみたのですが前回のソースリスト設定の項目に誤りがありました。

実際は簡単にできるんですね。訂正したいと思います。

前回同様ビルドしたnginx_1.15.3-1~stretch_armhf.debとphp7.0-fpmをインストールしてみました。

コンテナの作成

$ docker pull schachr/raspbian-stretch
$ docker container run --privileged -d -p 80:80 --name nginx_raspbian schachr/raspbian-stretch /bin/systemd
$ docker container exec -it nginx_raspbian /bin/bash

コンテナ内で作業

# apt update

apt updateを実行して使いやすいエディタをインストール

# apt install vim less

ソースリストの編集
/etc/apt/sources.list

#deb http://archive.raspbian.org/raspbian stretch main
deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi

apt updateを実行、追加するだけで同様に取得してくれるようです。

# apt update

インストール

# apt install openssl php7.0-fpm

nginx_1.15.3-1~stretch_armhf.debはdocker cpで

# docker cp nginx_1.15.3-1~stretch_armhf.deb nginx_raspbian:/root
# dpkg -i ~/nginx_1.15.3-1~stretch_armhf.deb
# rm ~/nginx_1.15.3-1~stretch_armhf.deb

ファイル編集
/etc/nginx/conf.d/default.conf

    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        root   /usr/share/nginx/html;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }

/etc/php/7.0/fpm/pool.d/www.conf

listen.owner = nginx
listen.group = nginx

/usr/share/nginx/html/phpinfo.php

<?php
phpinfo();
?>

サービスを起動

# systemctl restart php7.0-fpm
# systemctl restart nginx

Raspberry Pi3 ZERO(W) Alpine Linux(3.8.1)インストール

Alpine Linux(3.8.1)がリリースされています。
dockerコンテナを運用するにはやはり軽量OSがいいでしょうということで学習用にAlpine LinuxをRaspberry Piにインストールしてみたいと思います。

Alpine Linuxは超軽量ということもあってdebian系と比べるとシステム系のコマンドが大分違うように感じます。またRaspberry Piに配布されているイメージはdiskless modeというこれまた一癖ある仕様かなと思います。
Alpine Linuxに関する情報はTutorials and Howtos当りにあります。(一部古いものもある)
検索すると結構関連情報(ヒント)が見つかると思います。
Raspberry Pi3,zero(W)のwifiドライバーは調べるとbrcmが使われるようです。raspbianのdmesgを調べるとこれが見つかります。

$ dmesg | grep brcm
[    6.140562] brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43430-sdio.bin for chip 0x00a9a6(43430) rev 0x000001

一旦alpineをインストールして調べると/lib/firmware/brcm以下に見つかります。
以上を踏まえて有線なしwifiインストールでいってみたいと思います。

インストール環境

基本の初期インストールはどうしてもディスプレー、キーボードが必要になってしまいます。
運用についてはzero(W)を想定していますがディスプレーやらキーボードを繋ぎ変えるのが面倒(設定も)なためRaspberry Pi3でカードを作成、インストール、ネットワーク設定まで実施、その後はzero(W)に挿し替えてRaspberry Pi3からsshでzero(W)に接続、設定を続行します。

カードの作成

パーティションエディタ(gparted)を起動(作成するカードを間違えないように!)

alpineのOS領域とデータ保存などにするためパーテーションを分けて作成します。
8GBのカード(/dev/sdaで認識)を3000MiBで切ってFAT32でフォーマット、alpineに割り当てて残りをEXT4にしています。
パーテーションを作成したらsda1のフラグをbootにチェックを入れます。


https://alpinelinux.org/downloads/からRASPBERRY PI(armhf)をダウンロード
sda1にコピーして展開、元ファイルは削除します。
特に編集する項目はありません。抜き差しして正常にマウント、ファイルが見えていればOK

Alpine Linux(3.8.1)のインストール

wifiセットアップのため接続情報を用意しておきます。
Pi3にカードをセットしてpower on

# root Enter
# setup-alpine
keyboard
Select keyboard layout [none]: jp
Select variant []: jp

ホスト名はかっこいい名前を!

Enter system hostname (short form, e.g. 'foo') [localhost]: alpine

IPはdhcpで設定してみます。([dhcp]でアドレスを指定すると固定IPになる)
表示はコピーできないので大分端折っています。

Which one do you want to initialize? [eth0] Enter
Ip addres for eth0?  [dhcp] Enter
which one ----- initialize? [wlan0] Enter
Buffallo-G-110=psk (ステーションが表示)
Type the ---- connct to: Buffallo-G-110
---- --- Pre Shared key: xxxxxxxxxxxxxx
Ip address for wlan? [dhcp] Enter
Do you want ------ ? [no] Enter
wdhcpc:sending select for 192.168.0.166 (dhcpでIP取得)
Changing password for root
New password: (rootパスワード)
Retype password: (rootパスワード)
Which timezone are you in? ('?' for list) [?] Asia/Tokyo
HTTP/FTP proxy URL? (http://proxy:8080') [none] Enter
Enter mirror number [f]: done (ネットワークが有効になっていないので取得できない)
Which SSH server? [openssh] Enter
Which NTP client to run? [chrony] Enter
Which disk(s) would you like to use? [none] Enter
---- ----- ----- ----- ---- [mmcblkp01] Enter
---- ----- ----- --- [media/mmcblkp01/cache] Enter
alpine #

取り敢えずインストールが完了しました。
# ip aで見ると設定した内容が反映されていますがまだ有効になっていません。

起動時wifiを有効にします。

# rc-update add wpa_supplicant boot

rebootする前に変更を記憶します。disklessの場合はなにか変更を加えたら必ず実行します。

# lbu ci -d

再起動してネットワークが有効になっているか確認します。

# ip a
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:27:eb:95:d9:14 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.166/24 scope global wlan0

yahooはpingを返してくれます。

# ping -c 3 yahoo.co.jp
PING yahoo.co.jp (182.22.59.229): 56 data bytes
64 bytes from 182.22.59.229: seq=0 ttl=47 time=35.139 ms
64 bytes from 182.22.59.229: seq=1 ttl=47 time=20.057 ms
64 bytes from 182.22.59.229: seq=2 ttl=47 time=21.332 ms

--- yahoo.co.jp ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 20.057/25.509/35.139 ms

setup-alpineは何度でもやり直しできます。(一からですが)
有線では2度目にリポジトリを取得します。wifiは初期化するので無理
同一ネットワーク帯に2個のIPを配置することはできないのでwifiを使用する時は/etc/network/interfacesのeth0を無効(コメントor削除)にしておきます。
繋がるネットワークができたら以降はこのファイルで有線、無線、固定、dhcpの変更ができます。
apk addできるまではデフォルトのviエディタを使うことになると思います。
数回インストールをやり直しましたが慣れてくるとカード作成からここまで10分もかからないでできます。

デフォルトのsshはrootからログインできません。userを作成するまでrootからのログインを許可
32行目当りに追記

/etc/ssh/sshd_config
#PermitRootLogin prohibit-password
PermitRootLogin yes

# lbu ci -d 忘れずに!
# poweroff

zero(W)にカードをセット起動、pi3からログイン
zero(W)から起動するとdhcpから取得するIPは変わってしまうと思います。なんらかの方法でIPを捜す必要があります。スマホを利用するとか当サイトではPi3にnmapをインストールしています。

# apt install nmap
# nmap -sP 192.168.0.0/24

Raspberry Pi特有の問題としてクロックを変更する必要があるようです。

# rc-update add swclock boot
 * service swclock added to runlevel boot
# rc-update del hwclock boot
 * service hwclock removed from runlevel boot

# lbu ci -d 忘れずに!
rebootして再ログイン

# rc-status
なんか出てますね。
acpid [ crashed ]
pi3では出ていなかったのでzero(W)特有の問題と思われます。

取り敢えずサービスを止めます。

# rc-update del acpid
 * service acpid removed from runlevel default

# lbu ci -d 忘れずに!

以下は試しに有線でインストール取得したリポジトリです。
正規に取得した場合2行目のmain以降はコメント扱いになっているので解除してやります。
/etc/apk/repositoriesに追記

/media/mmcblk0p1/apks
http://dl-cdn.alpinelinux.org/alpine/v3.8/main
http://dl-cdn.alpinelinux.org/alpine/v3.8/community
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing

# lbu ci -d 忘れずに!

 # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/main/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/testing/armhf/APKINDEX.tar.gz
v3.8.1-1-g91d49cb572 [http://dl-cdn.alpinelinux.org/alpine/v3.8/main]
v3.8.1-1-g91d49cb572 [http://dl-cdn.alpinelinux.org/alpine/v3.8/community]
v3.8.0-1995-gca2ab7494b [http://dl-cdn.alpinelinux.org/alpine/edge/main]
v3.8.0-1944-g009fc7167b [http://dl-cdn.alpinelinux.org/alpine/edge/community]
v3.8.0-1940-g1a4a0a7c7c [http://dl-cdn.alpinelinux.org/alpine/edge/testing]
OK: 21677 distinct packages available

ユーザー作成
ディフォルトではadduserが使えます。

adduser -u 1000 -g 1000 -h /home/pi pi

# lbu ci -d 忘れずに!
忘れないでlbuしたのですが再起動するとpiのホームディレクトリや/rootにscpしたファイルがきれいさっぱり無くなってしまいました。
調べてみるとlbuで保存する対象も設定が必要ということです。まだよくわかっていないのですがWeb情報を頼りに以下を設定しています。
piのホームディレクトリはmkdir chownで再作成
/etc/apk/protected_paths.d/lbu.list 新規作成

+home/*/
+home/*/*
+root/*/
+root/*/*

# lbu ci -d 忘れずに!
# lbu lsすると保存リストを表示します。
再起動すると無事保存されるようです。但しネットワークなどを変更すると無くなってしまうこともあるようです。

/dev/mmcblk0p2のマウント
ホームディレクトリや設定ファイルのバックアップなどにも使えます。
/mntは汎用に使うとして/srvにマウントしました。

/etc/fstab 追記
/dev/mmcblk0p2  /srv    ext4    defaults,noatime  0 0

パッケージインストール

# apk add bash tmux sudo shadow

以降適宜 # lbu ci -d 忘れずに! # reboot
shell 変更

# chsh -s /bin/bash

# apk add docker メインの実験環境
# apk add bind-tools ネットワークツール

sshに叱られる
当初は順調に稼働していたのですが次第にssh接続が切れる、最後にはログインできなくなってしまいました。
メッセージは次のとおり
root@192.168.0.188’s password:
PTY allocation request failed on channel 0
WARNING: Your password has expired.
Password change required but no TTY available.
Connection to 192.168.0.188 closed.
パスワードをチェンジしろと言っています。
接続できているときにrootでpasswdしても変更を拒否されてしまいます。
pi3にカードをセットして直ログイン、パスワードを変更、IPを固定IPに変更しました。
詳しいことはわかりませんが原因は2枚のカードを作り直す際に同Ip、同パスワードを使い廻したため不正ログインとPi3にみなされたようです。

追記
#鍵認証でログインすると問題なく接続できるようです。

その後は問題なく稼働しています。
.bashrc .vimrcなどコピーしてさらに必要なコマンドは都度追加、unix系コマンド操作に関してはraspbian lite並になりました。
若干変態的なところがありますが設定ファイルが非常にシンプル、ディレクトリ構成もシンプルなところに好感が持てます。
どこまで使いこなせるかわかりませんがもう少し勉強してみたいと思います。

Raspberry Pi docker Nginx Web Server

nginxにはstable版とmainline版がありますが今回はコンテナ内でmainline版をbuild、ビルドしてできたファイルを別のコンテナにインストールしてnginx serverを動かしてみたいと思います。

mainline版は約1ヶ月毎に新機能やbugfixその他変更が加わります。当サイトのRaspberry Piでは無理にmainline版を追いかける必要はないのですが初回インストール時位は最新のバージョンにしたいものです。

現時点(20180912)の最新バージョンはnginx 1.15.3

元ネタはこちらです。
Raspberry Piにnginx (mainline)をインストール

ビルド用コンテナの作成

コンテナイメージは前回作成したstretch_liteを使います。

$ docker container run --name nginx_build -v ~/build:/mnt -it stretch_lite-img /bin/bash

コンテナ内で作業開始
認証キーの登録

# curl http://nginx.org/keys/nginx_signing.key | apt-key add -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1561  100  1561    0     0   2774      0 --:--:-- --:--:-- --:--:--  2772
OK

ソースリストの登録

/etc/apt/sources.list.d/nginx.list
deb-src http://nginx.org/packages/mainline/debian/ stretch nginx

コンパイルに必要なパッケージのインストール

# apt update && apt -y upgrade
# apt -y build-dep nginx

作業ディレクトリの変更
共有ディレクトリに/mnt/nginx_1.15.3を作成

# mkdir /mnt/nginx_1.15.3
# cd /mnt/nginx_1.15.3

ビルドを実行(約10分)
ソースを取得する際下記のメッセージが出ますがダウンロードはできているのでOKと思います。
stretchでは特にoptionを指定する必要はないようです。

# apt-get -y source nginx
W: ファイル 'nginx_1.15.3-1~stretch.dsc' がユーザ '_apt' からアクセスできないため、ダウンロードは root でサンドボックスを通さずに行われます。 - pkgAcquire::Run (13: 許可がありません)
# cd nginx-*
# export DEB_BUILD_MAINT_OPTIONS=hardening=+pie
# dpkg-buildpackage -uc -b
# cd ../
# ls -la nginx_*~stretch_armhf.deb
-rw-r--r-- 1 root root 724588  9月 12 22:41 nginx_1.15.3-1~stretch_armhf.deb
# exit

共有ディレクトリ~/build/nginx_1.15.3内にはnginx_1.15.3-1~stretch_armhf.debができています。

Web Server用コンテナの作成

ビルドしたnginx_1.15.3-1をインストールするため新たにWeb Server用として上記同様のコンテナイメージ(stretch_lite)から作成します。
ネットワークはnginx_networkを作成して固定IPを割り当ててみます。

$ docker network create --subnet=172.21.0.0/24 nginx_network
$ docker container run --privileged -d --net=nginx_network --ip=172.21.0.11 -p 80:80 --name nginx_server -v ~/build:/mnt stretch_lite-img /lib/systemd/systemd
$ docker container ls
85913f8c1af1  stretch_lite-img  "/lib/systemd/systemd" 2 minutes ago  Up 2 minutes        0.0.0.0:80->80/tcp   nginx_server
$ ping -c 3 172.21.0.11
PING 172.21.0.11 (172.21.0.11) 56(84) bytes of data.
64 bytes from 172.21.0.11: icmp_seq=1 ttl=64 time=0.248 ms
64 bytes from 172.21.0.11: icmp_seq=2 ttl=64 time=0.125 ms
64 bytes from 172.21.0.11: icmp_seq=3 ttl=64 time=0.186 ms

--- 172.21.0.11 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2111ms
rtt min/avg/max/mdev = 0.125/0.186/0.248/0.051 ms

コンテナに入って作業開始

$ docker container exec -it nginx_server /bin/bash

nginxのインストール

# dpkg -i /mnt/nginx_1.15.3/nginx_1.15.3-1~stretch_armhf.deb
以前に未選択のパッケージ nginx を選択しています。
(データベースを読み込んでいます ... 現在 15203 個のファイルとディレクトリがインストールされています。)
.../nginx_1.15.3-1~stretch_armhf.deb を展開する準備をしています ...
----------------------------------------------------------------------

Thanks for using nginx!

Please find the official documentation for nginx here:
* http://nginx.org/en/docs/

Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* http://nginx.org/en/support.html

Commercial subscriptions for nginx are available on:
* http://nginx.com/products/

----------------------------------------------------------------------
nginx (1.15.3-1~stretch) を展開しています...
nginx (1.15.3-1~stretch) を設定しています ...
invoke-rc.d: policy-rc.d denied execution of start.
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.
systemd (232-25+deb9u4) のトリガを処理しています ...
# systemctl start nginx


無事動いているようです。


インストールされる/etc/nginx以下の設定ファイルはパッケージからインストールされるdebian(raspbian)形式とは違って多分nginxデフォルトの形式と思います。
dpkg -iで導入する際は既存の設定ファイルがあっても問答無用で置き換えてしまうので注意が必要です。

php7.0-fpmのインストール、設定

# apt install php7.0-fpm

nginxデフォルトの設定ファイルでphpが動く最低限の設定をしてみます。
/etc/nginx/conf.d/default.conf
index.phpを追記

location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }

location ~ \.php$を以下のとおり

location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        root   /usr/share/nginx/html;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }

/etc/php/7.0/fpm/pool.d/www.conf
www-dataからnginxに変更

listen.owner = nginx
listen.group = nginx

/usr/share/nginx/html/phpinfo.php

<?php
phpinfo();
?>
# systemctl restart nginx
# systemctl restart php7.0-fpm


ブラウザからhttp://172.21.0.11/phpinfo.php

Top