- 投稿日:2020-09-18T22:37:53+09:00
DockerでSQLServerを起動&初期データ登録
SQLServerのDockerコンテナに初期データを投入して起動します。
マイクロソフト公式のDockerイメージを使用します。MySQLだと初期データ投入の仕組みが初めから組み込まれていますが、SQLServerにはそれないのでシェルを作成しました。Microsoft SQL Server Dockerイメージ(https://hub.docker.com/_/microsoft-mssql-server)
参考:公式からリンクされているデータ投入サンプル(https://github.com/twright-msft/mssql-node-docker-demo-app)
Qiita Docker for Windowsを使って、SQL Server Express を使用するディレクトリー構成
|- docker-compose.yml |- docker |- mssqlserver |- Dockerfile |- initdb.d |- entrypoint.sh |- import-data.sh |- demo.sql |- Demo.dbo.DEMO.csv |- data |- log |- secrets各ファイル
docker-compose.yml
environmentで設定しているSQL Serverの環境変数についてはこちらを参照。
docker-compose.ymlversion: '3' services: mssql: build: context: ./docker/mssqlserver/ image: mssql ports: - 1433:1433 environment: - ACCEPT_EULA=Y - SA_PASSWORD=password - MSSQL_PID=Express # SQL Serverのエディションまたはプロダクトキー - MSSQL_LCID=1041 # ロケールID 日本語 (https://www.ryadel.com/en/microsoft-windows-lcid-list-decimal-and-hex-all-locale-codes-ids/) - MSSQL_COLLATION=Japanese_CI_AS # 照合順 volumes: - ./docker/mssqlserver/initdb.d:/docker-entrypoint-initdb.d - ./docker/mssqlserver/data:/var/opt/mssql/data - ./docker/mssqlserver/log:/var/opt/mssql/log - ./docker/mssqlserver/secrets:/var/opt/mssql/secDockerfile
初期データと投入用シェルスクリプトをコピーし、entrypoint.shを呼び出します。
(ちなみにEXPOSE
はただのドキュメントらしいです。)DockerfileFROM mcr.microsoft.com/mssql/server:2017-latest USER root SHELL ["/bin/bash", "-c"] WORKDIR /docker-entrypoint-initdb.d COPY ./initdb.d/ /docker-entrypoint-initdb.d/ RUN chmod -R +x /docker-entrypoint-initdb.d EXPOSE 1433 ENTRYPOINT ["/bin/bash", "./entrypoint.sh"]entrypoint.sh
データ登録のシェルとSQLServerを同時起動します。ここで少しはまったのですがSQLServerの起動を先にするとimport-data.sh実行後コンテナが停止してしまいます。SQLServerを後ろにするとコンテナは起動し続けます。(つまりDockerは一番最後に実行したプロセスが生きているかどうかでコンテナを停止するのか判断している?)
Initialize MS SQL in Docker container - create database at startup(https://www.softwaredeveloper.blog/initialize-mssql-in-docker-container)
entrypoint.sh#!/bin/bash LOG_OUT=/var/opt/mssql/log/init-stdout.log LOG_ERR=/var/opt/mssql/log/init-stderr.log exec 1>>$LOG_OUT exec 2>>$LOG_ERR # SQL Serverが前だとコンテナが停止してしまいます。 #/opt/mssql/bin/sqlservr & /docker-entrypoint-initdb.d/import-data.sh /docker-entrypoint-initdb.d/import-data.sh & /opt/mssql/bin/sqlservrimport-data.sh
SQLServerと同時起動するので、インスタンスが起動するまで初めに20秒スリープします。また、SQLやCSVインポートを実行してエラーの場合1秒待って再実行するようにしています。
import-data.sh#!/bin/bash sleep 20 if [ `ls -U1 /var/opt/mssql/data | grep DEMO | wc -l` -eq 0 ]; then cd /docker-entrypoint-initdb.d sql_files=`ls *.sql` for file in $sql_files; do for i in {1..30}; do /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -i $file if [ $? -eq 0 ] then echo "${file} completed." break else echo "${file} failed." sleep 1 fi done done csv_files=`ls *.csv` for file in $csv_files; do for i in {1..30}; do table_name=`basename $file .csv` /opt/mssql-tools/bin/bcp $table_name in $file -c -t',' -S localhost -U sa -P $SA_PASSWORD if [ $? -eq 0 ] then echo "${file} completed." break else echo "${file} failed." sleep 1 fi done done fi
- 投稿日:2020-09-18T22:21:24+09:00
[Docker] Hugo でサイトを構築し、GitHub で公開
概要
Docker 上で Hugo のサイトをを構築し、GitHub で公開する手順についてまとめる。
前提
- Git の基本知識
- GitHub のアカウントがある
- Docker の基本知識
- ターミナルが利用できる
環境
作業フォルダ名は、「DockerHugo」とする。
Hugo の仮想環境起動の docker-compose.yml は[Docker] Hugo を利用するための環境構築を参照。DockerHugo ├── docker-compose.yml全体像
新しい Hugo サイトを作成
コンテナで以下のコマンドを入力
コンテナhugo new site hogeルートフォルダ(ここでは「DockerHugo」フォルダ)に hoge フォルダが作成される。hoge フォルダの中身は以下の通り
hoge ├── archetypes │ └── default.md ├── config.toml ├── content ├── data ├── layouts ├── static └── themes 6 directories, 2 files利用したいテーマのダウンロード
hugo ではたくさんのテンプレートが提供されている。themes.gohugo.ioで利用したいテンプレートを探す
参考:Hugo のテーマのランキングサイトここでは [Learn] を選択する。[Demo] をクリックするとテーマを利用したサイトが確認できる
ローカル PC のターミナルを起動し、「DockerHugo」 フォルダーで、以下を実行
ローカルPCgit init git submodule add https://github.com/matcornic/hugo-theme-learn.git hugo/themes/learnthemes/learn フォルダの中身は以下の通り
learn ├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── archetypes │ └── default.md ├── data │ └── webpack_assets.json ├── exampleSite │ ├── config.toml │ ├── content │ │ ├── _index.md │ │ ├── about │ │ │ └── _index.md │ │ ├── contact.md │ │ └── post │ │ ├── _index.md │ │ ├── chapter-1.md ・ ・ ・ 26 directories, 101 fileshtml や css などサイトの構成に必要なファイルが DL されたことを確認できる
config.toml
に追記ローカル PC のターミナルの hoge フォルダで以下を実行
ローカルPCecho 'theme = "learn"' >> config.tomlconfig.toml ファイルに追記される
config.tomlbaseURL = "http://example.org/" languageCode = "en-us" title = "My New Hugo Site" theme = "learn"コンテンツファイルの追加
hugo new
コマンドを実行すると、コンテンツファイルは以下に格納される
content/指定したフォルダ名/ファイル名
コンテナのターミナルの hugo フォルダで以下を実行
コンテナhugo new posts/my-first-post.md作られたファイルを確認すると、以下の項目が追加されている
my-first-post.md--- title: "My First Post" date: 2020-09-16T13:53:14Z draft: true ---デフォルトでは「draft: true」となっていて、下書き (draft) はビルド(「hugo」コマンド)されない。ビルドしたい場合は必ず 「draft:false」 にする
このファイルは Web ファイルの中身を記述するファイルなので、以下のように追記する
# タイトル hoge サイトを作成してみるHugo サーバーを起動
ビルド前にブラウザで確認するために、Hugo サーバーを起動する
コンテナのターミナルの hugo フォルダで以下を実行
コンテナhugo server -D「-D」 をつけると、draft(下書き)も表示される
作成された Web サイトを確認する
ブラウザで http://localhost:1313/ を開く
ページのカスタマイズについては別記事に記載する
config.toml
ファイルの修正サイトの全体的な設定は、
config.toml
ファイルで行う。
以下のように変更config.tomlbaseURL = "" # 相対パスを true にしている場合不要 languageCode = "ja" # 多言語対応しないので必要ないが、"ja"に変更しておく title = "My New Hugo Site" theme = "learn" publishDir = "../docs" # hugo コマンドを実行したときに格納されるファイル置き場 relativeURLs = true # 相対パスで保存に変更(デフォルトでは絶対パス(relativeURLs =false))パラメーターの詳細についてはConfigure Hugoを参照
publishDir = "docs"
に変更した理由について補足今回は GitHub Pages で Web サイトを公開する。Github Pages では、Web ページを構築するファイルを格納するフォルダーは [(roots)] か [docs] フォルダーしか指定できない。そのため、
publishDir = "../docs"
に変更した
デフォルトでは 「public」 フォルダーが指定されている。
relativeURLs = "true"
にした理由について補足絶対パスから相対パスにしたことで、フォルダーを移動時にも対応できるようにした
静的サイトをビルド
コンテナの「DockerHugo」 フォルダー(ルートフォルダ)で以下を実行
コンテナhugoconfig.toml で 「publishDir = "docs"」と記載したため、docs フォルダーの中に、html や css ファイルなどが生成された
docs $ tree . ├── 404.html ├── categories │ ├── index.html │ └── index.xml ├── css │ ├── atom-one-dark-reasonable.css │ ├── auto-complete.css │ ├── featherlight.min.css ・ ・ ・ 8 directories, 82 filesGitHub Pages で公開
git コマンド、または SourceTree を利用して GitHub Pages に公開する
詳細は下記の記事を参照
・[ターミナル] git/github を管理する方法
・[SourceTree] ローカル/リモートリポジトリの管理参考
- 投稿日:2020-09-18T18:58:47+09:00
nginx+php-fpmのミニマムサイズDockerイメージ
要約
- 結論:
- 28.9MBで、Nginx+php-fpmのDockerコンテナ作成した
- Docker HUBだと大体48〜180MB
- 動機、疑問:
- 世間ではDockerコンテナは小さい方がよいとされてるらしい
- イメージレイヤやマルチステージビルドや&&で繋げるとかの技があるらしい
- Alpineとかmuslだけど性能大丈夫なのか?
- 参考: Why does musl make my Rust code so slow?- やること
- nginx + PHP-fpm(MySQL対応)の構成でちいさなイメージ・コンテナを作る
- 方法
- ソースからビルドしてchrootで動く環境を作る
- chroot環境をtar ballにまとめてイメージに放り込む
- 環境
- CentOS 6.8
↓以下、作成工程
nginxのインストール
1. ソースのダウンロード・展開
公式ウェブから
https://nginx.org/en/download.html$ wget https://nginx.org/download/nginx-1.18.0.tar.gz $ tar xvf https://nginx.org/download/nginx-1.18.0.tar.gz $ cd nginx-1.18.02. ./configure; make
./configure --help
でオプションを確認し、必要なオプションを指定して実行する。$ ./configure --help $ ./configure --prefix=/nginx $ make3. install & strip
$ sudo make install $ ls -lh /nginx/sbin/nginx -rwxr-xr-x. 1 root root 3.7M 9月 15 06:52 /nginx/sbin/nginx $ sudo strip /nginx/sbin/nginx $ ls -lh /nginx/sbin/nginx -rwxr-xr-x. 1 root root 706K 9月 15 09:40 /nginx/sbin/nginx $ sudo du -sh /nginx 788K /nginx/4. config
nginx.confを好みに設定する
- ユーザーnginx
- TCP 8080で待ち受け
- fpm-phpとの通信はunix socket$ sudo ed /nginx/conf/nginx.conf $ sed -n -e 2p -e 19,20p -e 28,32p nginx.conf user nginx; server { listen 8080; location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_index index.php; include fastcgi.conf; }MariaDB
phpにmysql対応させるためMariaDBのパッケージをインストールする。
1. yum install
MariaDB Web
https://mariadb.com/kb/en/yum/
https://mariadb.com/kb/en/mariadb-package-repository-setup-and-usage/$ curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \ > | sudo bash -s -- --mariadb-server-version="mariadb-10.1" $ sudo yum install MariaDB-shared.x86_64 MariaDB-devel.x86_642. パッケージの内容物の確認
$ rpm -ql MariaDB-shared $ rpm -ql MariaDB-develPHP/PHP-fpmのインストール
1. ソースのダウンロード・展開
$ wget https://www.php.net/distributions/php-7.4.10.tar.xz $ tar xvf php-7.4.10.tar.xz $ cd php-7.4.102. ./configure; make
./configure --help
でオプションを確認し、必要なオプションを指定して実行する。$ ./configure --help $ ./configure --prefix=/php7.4.10 \ > --disable-all \ > --enable-fpm \ > --with-mysqli=/usr/bin/mysql_config $ make $ make test3. install & strip
$ sudo make install $ sudo cp php.ini-development /php7.4.10/etc/php.ini $ sudo du -sh /php7.4.10 92M /php7.4.10/ $ sudo du -sh /php7.4.10/* 65M /php7.4.10/bin 28K /php7.4.10/etc 4.6M /php7.4.10/include 836K /php7.4.10/lib 56K /php7.4.10/php 22M /php7.4.10/sbin 0 /php7.4.10/var $ sudo strip /php7.4.10/bin/* /php7.4.10/sbin/* $ sudo du -sh /php7.4.10 30M /php7.4.10 $ sudo du -sh /php7.4.10/* 19M /php7.4.10/bin 28K /php7.4.10/etc 4.6M /php7.4.10/include 836K /php7.4.10/lib 56K /php7.4.10/php 6.1M /php7.4.10/sbin 0 /php7.4.10/var4. config
- php.iniを好みに設定する
$ sudo ed /php7.4.10/etc/php.ini
- php-fpm.confを好みに設定する
$ sudo ed /php7.4.10/etc/php-fpm.conf $ cat /php7.4.10/etc/php-fpm.conf |grep -v '^;' |grep -v '^$' daemonize = no [www] pid = /var/run/php-fpm.pid error_log = /var/log/php-fpm.log include=/php7.4.10/etc/php-fpm.d/*.conf
- php-fpm.d/*.confを好みに設定する
listenをnginx.confのunix socketと同一にし、権限をあわせる$ sudo ed /php7.4.10/etc/php-fpm.d/www.conf $ sed -n -e 2,8p /php7.4.10/etc/php-fpm.d/www.conf user = nginx group = nginx listen = /var/run/php-fpm.sock listen.owner = nginx listen.group = nginx listen.mode = 700daemontoolのインストール
ダウンロード・展開
$ wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz $ wget https://raw.githubusercontent.com/nkadel/daemontools-0.76-srpm/master/daemontools-0.76.errno.patch $ tar zxvf daemontools-0.76.tar.gz $ cd admin/daemontools-0.76パッチ・コンパイル・インストール
$ patch -p1 < daemontools-0.76.errno.patch $ ./package/compile $ cd command $ sudo mkdir /command $ for f in * ; do sudo install -o root -g root -m 0755 $f /command ; done設定
$ sudo mkdir -p /service/{nginx,php-fpm} $ sudo ed /service/nginx/run a #!/bin/sh exec /nginx/sbin/nginx -g "daemon off;" . w 51 q $ sudo chown root:root /service/nginx/run $ sudo chmod 755 /service/nginx/run $ sudo cp -a /service/nginx/run /service/php-fpm/run $ sudo ed /service/php-fpm/run 51 /exec/p exec /nginx/sbin/nginx -g "daemon off;" /exec/s|^.*$|exec /php7.4.10/sbin/php-fpm| /exec/p exec /php7.4.10/sbin/php-fpm w 40 q動作確認1
daemontoolsからphp-fpmとnginxを起動して正常動作確認する
$ PATH=/command:$PATH /command/svscan /service $ curl -i http://localhost:8080/index.html $ curl -i http://localhost:8080/test.phpchroot の作成
1. 必要なものを調べる
- lsofでnginxプロセスが使っているものをみる
$ sudo lsof -p `cat /var/run/nginx.pid` COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1855 root cwd DIR 253,0 44 77976878 /php7.4.10/etc/php-fpm.d nginx 1855 root rtd DIR 253,0 4096 128 / nginx 1855 root txt REG 253,0 722344 746527 /nginx/sbin/nginx nginx 1855 root mem REG 253,0 61560 136793635 /usr/lib64/libnss_files-2.17.so nginx 1855 root mem REG 253,0 11392 134348913 /usr/lib64/libfreebl3.so nginx 1855 root mem REG 253,0 2156240 136793618 /usr/lib64/libc-2.17.so nginx 1855 root mem REG 253,0 90248 134472992 /usr/lib64/libz.so.1.2.7 nginx 1855 root mem REG 253,0 402384 136871751 /usr/lib64/libpcre.so.1.2.0 nginx 1855 root mem REG 253,0 40600 136793622 /usr/lib64/libcrypt-2.17.so nginx 1855 root mem REG 253,0 142144 136793643 /usr/lib64/libpthread-2.17.so nginx 1855 root mem REG 253,0 19248 136793624 /usr/lib64/libdl-2.17.so nginx 1855 root mem REG 253,0 163312 134294602 /usr/lib64/ld-2.17.so nginx 1855 root DEL REG 0,4 225125 /dev/zero nginx 1855 root 0u CHR 1,3 0t0 4674 /dev/null nginx 1855 root 1u CHR 1,3 0t0 4674 /dev/null nginx 1855 root 2w REG 253,0 192 77977912 /var/log/nginx.error.log nginx 1855 root 3u unix 0xffff88003cd1cb40 0t0 225127 socket nginx 1855 root 4w REG 253,0 192 77977912 /var/log/nginx.error.log nginx 1855 root 5w REG 253,0 460 77977913 /var/log/nginx.access.log nginx 1855 root 6u IPv4 225124 0t0 TCP *:webcache (LISTEN) nginx 1855 root 7u unix 0xffff88003cd1c780 0t0 225128 socket
- lddでnginxとリンクしているものをみる
$ sudo ldd /nginx/sbin/nginx linux-vdso.so.1 => (0x00007ffd4753b000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fcf64b6b000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcf6494f000) libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fcf64718000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fcf644b6000) libz.so.1 => /lib64/libz.so.1 (0x00007fcf642a0000) libc.so.6 => /lib64/libc.so.6 (0x00007fcf63ed2000) /lib64/ld-linux-x86-64.so.2 (0x00007fcf64d6f000) libfreebl3.so => /lib64/libfreebl3.so (0x00007fcf63ccf000)
- straceでnginxの動作を確認する
$ sudo strace -f -p nginxのpid
- lsofでphp-fpmプロセスが使っているものをみる
$ sudo lsof -p `cat /var/run/php-fpm.pid ` COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php-fpm 1506 root cwd DIR 253,0 44 77976878 /php7.4.10/etc/php-fpm.d php-fpm 1506 root rtd DIR 253,0 4096 128 / php-fpm 1506 root txt REG 253,0 6301952 7316392 /php7.4.10/sbin/php-fpm php-fpm 1506 root mem REG 253,0 61560 136793635 /usr/lib64/libnss_files-2.17.so php-fpm 1506 root mem REG 253,0 106172832 201770171 /usr/lib/locale/locale-archive php-fpm 1506 root mem REG 253,0 402384 136871751 /usr/lib64/libpcre.so.1.2.0 php-fpm 1506 root mem REG 253,0 155744 136140229 /usr/lib64/libselinux.so.1 php-fpm 1506 root mem REG 253,0 15688 134559890 /usr/lib64/libkeyutils.so.1.5 php-fpm 1506 root mem REG 253,0 67104 134627596 /usr/lib64/libkrb5support.so.0.1 php-fpm 1506 root mem REG 253,0 88776 136793604 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 php-fpm 1506 root mem REG 253,0 210784 134627584 /usr/lib64/libk5crypto.so.3.1 php-fpm 1506 root mem REG 253,0 15856 134472995 /usr/lib64/libcom_err.so.2.1 php-fpm 1506 root mem REG 253,0 967760 134627594 /usr/lib64/libkrb5.so.3.3 php-fpm 1506 root mem REG 253,0 320720 134627580 /usr/lib64/libgssapi_krb5.so.2.2 php-fpm 1506 root mem REG 253,0 991616 138878729 /usr/lib64/libstdc++.so.6.0.19 php-fpm 1506 root mem REG 253,0 142144 136793643 /usr/lib64/libpthread-2.17.so php-fpm 1506 root mem REG 253,0 11392 134348913 /usr/lib64/libfreebl3.so php-fpm 1506 root mem REG 253,0 2156240 136793618 /usr/lib64/libc-2.17.so php-fpm 1506 root mem REG 253,0 2521144 134627604 /usr/lib64/libcrypto.so.1.0.2k php-fpm 1506 root mem REG 253,0 470376 134917281 /usr/lib64/libssl.so.1.0.2k php-fpm 1506 root mem REG 253,0 90248 134472992 /usr/lib64/libz.so.1.2.7 php-fpm 1506 root mem REG 253,0 3793048 134590359 /usr/lib64/libmysqlclient.so.18.0.0 php-fpm 1506 root mem REG 253,0 19248 136793624 /usr/lib64/libdl-2.17.so php-fpm 1506 root mem REG 253,0 1136944 136793626 /usr/lib64/libm-2.17.so php-fpm 1506 root mem REG 253,0 43712 136793647 /usr/lib64/librt-2.17.so php-fpm 1506 root mem REG 253,0 109976 136793645 /usr/lib64/libresolv-2.17.so php-fpm 1506 root mem REG 253,0 40600 136793622 /usr/lib64/libcrypt-2.17.so php-fpm 1506 root mem REG 253,0 163312 134294602 /usr/lib64/ld-2.17.so php-fpm 1506 root DEL REG 0,4 224808 /dev/zero php-fpm 1506 root mem REG 253,0 26970 201770170 /usr/lib64/gconv/gconv-modules.cache php-fpm 1506 root 0u CHR 1,3 0t0 4674 /dev/null php-fpm 1506 root 1u CHR 1,3 0t0 4674 /dev/null php-fpm 1506 root 2w REG 253,0 213 77977910 /var/log/php-fpm.log php-fpm 1506 root 3w REG 253,0 213 77977910 /var/log/php-fpm.log php-fpm 1506 root 4u unix 0xffff88003c070780 0t0 224809 socket php-fpm 1506 root 6u unix 0xffff88003c071680 0t0 224810 socket php-fpm 1506 root 7u unix 0xffff88003cd1d680 0t0 224811 /var/run/php-fpm.sock php-fpm 1506 root 8u a_inode 0,9 0 4670 [eventpoll]
- lddでphpがリンクしているものをみる
$ ldd /php7.4.10/sbin/php-fpm linux-vdso.so.1 => (0x00007ffd457e2000) libcrypt.so.1 => /usr/lib64/libcrypt.so.1 (0x00007f868e1e7000) libresolv.so.2 => /usr/lib64/libresolv.so.2 (0x00007f868dfcd000) librt.so.1 => /usr/lib64/librt.so.1 (0x00007f868ddc5000) libm.so.6 => /usr/lib64/libm.so.6 (0x00007f868dac3000) libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007f868d8bf000) libmysqlclient.so.18 => /usr/lib64/libmysqlclient.so.18 (0x00007f868d31b000) libz.so.1 => /usr/lib64/libz.so.1 (0x00007f868d105000) libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f868ce93000) libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f868ca30000) libc.so.6 => /usr/lib64/libc.so.6 (0x00007f868c662000) libfreebl3.so => /usr/lib64/libfreebl3.so (0x00007f868c45f000) libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f868c243000) /lib64/ld-linux-x86-64.so.2 (0x00007f868e41e000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f868bf3c000) libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x00007f868bcef000) libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x00007f868ba06000) libcom_err.so.2 => /usr/lib64/libcom_err.so.2 (0x00007f868b802000) libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00007f868b5cf000) libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f868b3b9000) libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x00007f868b1a9000) libkeyutils.so.1 => /usr/lib64/libkeyutils.so.1 (0x00007f868afa5000) libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007f868ad7e000) libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f868ab1c000)
- straceでphp-fpmの動作を確認する
$ sudo strace -f -p `cat /var/run/php-fpm.pid`2. choot環境の作成
/jail
にchroot環境を作成してゆく
- ディレクトリ作成
$ sudo mkdir -p /jail/{bin,etc,dev,var,usr,lib64,tmp} $ sudo mkdir -p /jail/var/{log,run,tmp} $ sudo ln -s bin /jail/command $ sudo ln -s ../lib64 /jail/usr/lib64 $ sudo chown -R root:root /jail $ sudo chmod -R 755 /jail $ sudo chmod 1777 /jail/tmp /jail/var/tmp
- mknod
$ ls -l /dev/{null,random,urandom,zero} crw-rw-rw-. 1 root root 1, 3 9月 17 00:50 /dev/null crw-rw-rw-. 1 root root 1, 8 9月 17 00:50 /dev/random crw-rw-rw-. 1 root root 1, 9 9月 17 00:50 /dev/urandom crw-rw-rw-. 1 root root 1, 5 9月 17 00:50 /dev/zero $ sudo mknod -m 0666 /jail/dev/null c 1 3 $ sudo mknod -m 0666 /jail/dev/random c 1 8 $ sudo mknod -m 0666 /jail/dev/urandom c 1 9 $ sudo mknod -m 0666 /jail/dev/zero c 1 5 $ ls -l /jail/dev/* crw-rw-rw-. 1 root root 1, 3 9月 17 02:47 /jail/dev/null crw-rw-rw-. 1 root root 1, 8 9月 17 02:47 /jail/dev/random crw-rw-rw-. 1 root root 1, 9 9月 17 02:47 /jail/dev/urandom crw-rw-rw-. 1 root root 1, 5 9月 17 02:47 /jail/dev/zero
- nginxとphpをコピーする
$ sudo mkdir -p /jail/nginx/{conf,html,logs,sbin} $ sudo chown -R root:root /jail/nginx $ sudo chmod -R 755 /jail/nginx $ sudo cp -a /nginx/sbin/nginx /jail/nginx/sbin/nginx $ sudo cp -a /nginx/conf/* /jail/nginx/conf $ sudo cp -a /nginx/html/* /jail/nginx/html $ sudo mkdir -p /jail/php7.4.10/{etc,sbin} $ sudo chown -R root:root /jail/php7.4.10 $ sudo chmod -R 755 /jail/php7.4.10 $ sudo cp -a /php7.4.10/etc/* /jail/php7.4.10/etc/ $ sudo cp -a /php7.4.10/sbin/php-fpm /jail/php7.4.10/sbin/php-fpm
- 動的ライブラリをコピー
nginxやphp-fpmがリンクしている動的ライブラリをコピーする
$ cd /lib64 $ sudo cp -a ld-2.17.so ld-linux-x86-64.so.2 /jail/lib64 $ sudo cp -a libdl-2.17.so libdl.so.2 /jail/lib64 $ sudo cp -a libpthread-2.17.so libpthread.so.0 /jail/lib64 $ sudo cp -a libcrypt-2.17.so libcrypt.so.1 /jail/lib64 $ sudo cp -a libpcre.so.1.2.0 libpcre.so.1 /jail/lib64 $ sudo cp -a libz.so.1.2.7 libz.so.1 /jail/lib64 $ sudo cp -a libc-2.17.so libc.so.6 /jail/lib64 $ sudo cp -a libfreebl3.so /jail/lib64 $ sudo cp -a libresolv-2.17.so libresolv.so.2 /jail/lib64 $ sudo cp -a librt-2.17.so librt.so.1 /jail/lib64 $ sudo cp -a libm-2.17.so libm.so.6 /jail/lib64 $ sudo cp -a libmysqlclient.so.18.0.0 libmysqlclient.so.18 /jail/lib64 $ sudo cp -a libssl.so.1.0.2k libssl.so.10 /jail/lib64 $ sudo cp -a libcrypto.so.1.0.2k libcrypto.so.10 /jail/lib64 $ sudo cp -a libstdc++.so.6.0.19 libstdc++.so.6 /jail/lib64 $ sudo cp -a libgssapi_krb5.so.2.2 libgssapi_krb5.so.2 /jail/lib64 $ sudo cp -a libkrb5.so.3.3 libkrb5.so.3 /jail/lib64 $ sudo cp -a libcom_err.so.2.1 libcom_err.so.2 /jail/lib64 $ sudo cp -a libk5crypto.so.3.1 libk5crypto.so.3 /jail/lib64 $ sudo cp -a libgcc_s-4.8.5-20150702.so.1 libgcc_s.so.1 /jail/lib64 $ sudo cp -a libkrb5support.so.0.1 libkrb5support.so.0 /jail/lib64 $ sudo cp -a libkeyutils.so.1.5 libkeyutils.so.1 /jail/lib64 $ sudo cp -a libselinux.so.1 /jail/lib64 $ sudo cp -a gconv /jail/lib64コピーした動的ライブラリにも再起的にlddして、他に依存している動的ライブラリがあれば、同様にコピーする
$ sudo ldd /jail/lib64/*
- 名前解決関係
$ sudo cp -a /lib64/libnss_{files,dns}* /jail/lib64 $ sudo cp -a /etc/{hosts,resolv.conf,nsswitch.conf,host.conf} /jail/etc
- タイムゾーン
$ sudo cp -a /usr/share/zoneinfo/Asia/Tokyo /jail/etc/localtime
- ネットワーク関係
$ sudo cp -a /etc/{protocols,services} /jail/etc
- ユーザー/グループ
$ sudo ed /jail/etc/passwd a nobody:x:99:99:nobody:/:/sbin/nologin nginx:x:995:992:nginx:/:/sbin/nologin . w q $ sudo ed /jail/etc/group a nobody:x:99: nginx:x:992: . w q $ sudo ed /jail/etc/shadow a nobody:*:14871:::::: nginx:*:14871:::::: . w q $ sudo ed /jail/etc/gshadow nobody::: nginx::: . w q $ sudo touch /jail/etc/shells $ sudo chown root:root /jail/etc/{passwd,group,shadow,gshadow,shells} $ sudo chmod 644 /jail/etc/{passwd,group,shells} $ sudo chmod 000 /jail/etc/{shadow,gshadow}busybox
nginxとphp-fpmを起動させるためだけに使うので
allnoconfig
で最小限にする$ wget https://git.busybox.net/busybox/snapshot/busybox-1_32_0.tar.gz $ tar zxvf busybox-1_32_0.tar.gz $ cd busybox-1_32_0 $ make allnoconfig $ ed .config 37095 /CONFIG_PREFIX/p CONFIG_PREFIX="./_install" /CONFIG_PREFIX/s|".*"$|"/jail"| /CONFIG_PREFIX/ CONFIG_PREFIX="/jail" w 37090 q $ make $ sudo make install $ ls -lh /jail/bin/{busybox,sh} -rwxr-xr-x. 1 root root 59K 9月 18 02:21 /jail/bin/busybox lrwxrwxrwx. 1 root root 7 9月 18 02:21 /jail/bin/sh -> busyboxdaemontools
$ sudo cp -a /command/* /jail/command $ sudo cp -a /service /jail/service動作確認2
- 起動
chroot内でnginxとphp-fpmを起動して動作確認する
$ sudo /usr/sbin/chroot /jail /command/svscan /service $ curl -i http://localhost:8080/index.html $ curl -i http://localhost:8080/test.php
- ログ
chroot内のログに出力されていることを確認
$ cat /jail/var/log/nginx.access.log $ cat /jail/var/log/nginx.error.log $ sudo cat /jail/var/log/php-fpm.logコンテナ作成
- chroot jailの容量
$ sudo du -sh /jail 29M /jail $ sudo du -sh /jail/* 344K /jail/bin 0 /jail/command 0 /jail/dev 704K /jail/etc 21M /jail/lib64 800K /jail/nginx 6.2M /jail/php7.4.10 20K /jail/service 0 /jail/tmp 0 /jail/usr 12K /jail/var
- tar ball作成
$ cd /jail $ sudo tar zcf /path/to/nginx-php-fpm.tar.gz . $ ls -lh /path/to/phpfpm-nginx.tar.gz -rw-r--r--. 1 root root 10M 9月 18 03:21 nginx-php-fpm.tar.gz
- Dockerfile
$ ed Dockerfile a FROM scratch ADD nginx-php-fpm.tar.gz / ENTRYPOINT ["/command/svscan", "/service"] . w q
- image作成
$ sudo docker image build -t local/nginx-php-fpm:0.1 . $ sudo docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE local/nginx-php-fpm 0.1 67efeeb7b9be About a minute ago 28.9MBということで、28.9MBのイメージが完成した。
動作確認3
コンテナ起動して正常動作を確認
$ sudo docker run -d --name nginx -p 8000:8080 local/nginx-php-fpm:0.1 $ sudo docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96e8dfaba37a local/nginx-php-fpm:0.4 "/command/svscan /se…" 5 seconds ago Up 4 seconds 0.0.0.0:8000->8080/tcp nginx $ curl -i http://localhost:8000/test.phpコンテナの容量
以下のとおり、28.9MB
$ sudo docker ps -s CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE 96e8dfaba37a local/nginx-php-fpm:0.4 "/command/svscan /se…" 11 minutes ago Up 39 seconds 0.0.0.0:8000->8080/tcp nginx 445B (virtual 28.9MB)
- 投稿日:2020-09-18T18:58:47+09:00
nginx+php-fpmの軽量コンテナ作った
要約
- 結論:
- 28.9MBで、Nginx+php-fpmのDockerコンテナ作成した。それだけ
- Docker HUBだと大体48〜180MB
- 動機、疑問:
- 世間ではDockerコンテナは小さい方がよいとされてるらしい
- イメージレイヤやマルチステージビルドや&&で繋げるとかの技があるらしい
- Alpineとかmuslだけど性能大丈夫なのか?
- 参考: Why does musl make my Rust code so slow?- やること
- nginx + PHP-fpm(MySQL対応)の構成でちいさなイメージ・コンテナを作る
- 方法
- ソースからビルドしてchrootで動く環境を作る
- chroot環境をtar ballにまとめてイメージに放り込む
- 環境
- CentOS 6.8
↓以下、作成工程
nginxのインストール
1. ソースのダウンロード・展開
公式ウェブから
https://nginx.org/en/download.html$ wget https://nginx.org/download/nginx-1.18.0.tar.gz $ tar xvf https://nginx.org/download/nginx-1.18.0.tar.gz $ cd nginx-1.18.02. ./configure; make
./configure --help
でオプションを確認し、必要なオプションを指定して実行する。$ ./configure --help $ ./configure --prefix=/nginx $ make3. install & strip
$ sudo make install $ ls -lh /nginx/sbin/nginx -rwxr-xr-x. 1 root root 3.7M 9月 15 06:52 /nginx/sbin/nginx $ sudo strip /nginx/sbin/nginx $ ls -lh /nginx/sbin/nginx -rwxr-xr-x. 1 root root 706K 9月 15 09:40 /nginx/sbin/nginx $ sudo du -sh /nginx 788K /nginx/4. config
nginx.confを好みに設定する
- ユーザーnginx
- TCP 8080で待ち受け
- fpm-phpとの通信はunix socket$ sudo ed /nginx/conf/nginx.conf $ sed -n -e 2p -e 19,20p -e 28,32p nginx.conf user nginx; server { listen 8080; location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_index index.php; include fastcgi.conf; }MariaDB
phpにmysql対応させるためMariaDBのパッケージをインストールする。
1. yum install
MariaDB Web
https://mariadb.com/kb/en/yum/
https://mariadb.com/kb/en/mariadb-package-repository-setup-and-usage/$ curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \ > | sudo bash -s -- --mariadb-server-version="mariadb-10.1" $ sudo yum install MariaDB-shared.x86_64 MariaDB-devel.x86_642. パッケージの内容物の確認
$ rpm -ql MariaDB-shared $ rpm -ql MariaDB-develPHP/PHP-fpmのインストール
1. ソースのダウンロード・展開
$ wget https://www.php.net/distributions/php-7.4.10.tar.xz $ tar xvf php-7.4.10.tar.xz $ cd php-7.4.102. ./configure; make
./configure --help
でオプションを確認し、必要なオプションを指定して実行する。$ ./configure --help $ ./configure --prefix=/php7.4.10 \ > --disable-all \ > --enable-fpm \ > --with-mysqli=/usr/bin/mysql_config $ make $ make test3. install & strip
$ sudo make install $ sudo cp php.ini-development /php7.4.10/etc/php.ini $ sudo du -sh /php7.4.10 92M /php7.4.10/ $ sudo du -sh /php7.4.10/* 65M /php7.4.10/bin 28K /php7.4.10/etc 4.6M /php7.4.10/include 836K /php7.4.10/lib 56K /php7.4.10/php 22M /php7.4.10/sbin 0 /php7.4.10/var $ sudo strip /php7.4.10/bin/* /php7.4.10/sbin/* $ sudo du -sh /php7.4.10 30M /php7.4.10 $ sudo du -sh /php7.4.10/* 19M /php7.4.10/bin 28K /php7.4.10/etc 4.6M /php7.4.10/include 836K /php7.4.10/lib 56K /php7.4.10/php 6.1M /php7.4.10/sbin 0 /php7.4.10/var4. config
- php.iniを好みに設定する
$ sudo ed /php7.4.10/etc/php.ini
- php-fpm.confを好みに設定する
$ sudo ed /php7.4.10/etc/php-fpm.conf $ cat /php7.4.10/etc/php-fpm.conf |grep -v '^;' |grep -v '^$' daemonize = no [www] pid = /var/run/php-fpm.pid error_log = /var/log/php-fpm.log include=/php7.4.10/etc/php-fpm.d/*.conf
- php-fpm.d/*.confを好みに設定する
listenをnginx.confのunix socketと同一にし、権限をあわせる$ sudo ed /php7.4.10/etc/php-fpm.d/www.conf $ sed -n -e 2,8p /php7.4.10/etc/php-fpm.d/www.conf user = nginx group = nginx listen = /var/run/php-fpm.sock listen.owner = nginx listen.group = nginx listen.mode = 700daemontoolのインストール
ダウンロード・展開
$ wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz $ wget https://raw.githubusercontent.com/nkadel/daemontools-0.76-srpm/master/daemontools-0.76.errno.patch $ tar zxvf daemontools-0.76.tar.gz $ cd admin/daemontools-0.76パッチ・コンパイル・インストール
$ patch -p1 < daemontools-0.76.errno.patch $ ./package/compile $ cd command $ sudo mkdir /command $ for f in * ; do sudo install -o root -g root -m 0755 $f /command ; done設定
$ sudo mkdir -p /service/{nginx,php-fpm} $ sudo ed /service/nginx/run a #!/bin/sh exec /nginx/sbin/nginx -g "daemon off;" . w 51 q $ sudo chown root:root /service/nginx/run $ sudo chmod 755 /service/nginx/run $ sudo cp -a /service/nginx/run /service/php-fpm/run $ sudo ed /service/php-fpm/run 51 /exec/p exec /nginx/sbin/nginx -g "daemon off;" /exec/s|^.*$|exec /php7.4.10/sbin/php-fpm| /exec/p exec /php7.4.10/sbin/php-fpm w 40 q動作確認1
daemontoolsからphp-fpmとnginxを起動して正常動作確認する
$ PATH=/command:$PATH /command/svscan /service $ curl -i http://localhost:8080/index.html $ curl -i http://localhost:8080/test.phpchroot の作成
1. 必要なものを調べる
- lsofでnginxプロセスが使っているものをみる
$ sudo lsof -p `cat /var/run/nginx.pid` COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1855 root cwd DIR 253,0 44 77976878 /php7.4.10/etc/php-fpm.d nginx 1855 root rtd DIR 253,0 4096 128 / nginx 1855 root txt REG 253,0 722344 746527 /nginx/sbin/nginx nginx 1855 root mem REG 253,0 61560 136793635 /usr/lib64/libnss_files-2.17.so nginx 1855 root mem REG 253,0 11392 134348913 /usr/lib64/libfreebl3.so nginx 1855 root mem REG 253,0 2156240 136793618 /usr/lib64/libc-2.17.so nginx 1855 root mem REG 253,0 90248 134472992 /usr/lib64/libz.so.1.2.7 nginx 1855 root mem REG 253,0 402384 136871751 /usr/lib64/libpcre.so.1.2.0 nginx 1855 root mem REG 253,0 40600 136793622 /usr/lib64/libcrypt-2.17.so nginx 1855 root mem REG 253,0 142144 136793643 /usr/lib64/libpthread-2.17.so nginx 1855 root mem REG 253,0 19248 136793624 /usr/lib64/libdl-2.17.so nginx 1855 root mem REG 253,0 163312 134294602 /usr/lib64/ld-2.17.so nginx 1855 root DEL REG 0,4 225125 /dev/zero nginx 1855 root 0u CHR 1,3 0t0 4674 /dev/null nginx 1855 root 1u CHR 1,3 0t0 4674 /dev/null nginx 1855 root 2w REG 253,0 192 77977912 /var/log/nginx.error.log nginx 1855 root 3u unix 0xffff88003cd1cb40 0t0 225127 socket nginx 1855 root 4w REG 253,0 192 77977912 /var/log/nginx.error.log nginx 1855 root 5w REG 253,0 460 77977913 /var/log/nginx.access.log nginx 1855 root 6u IPv4 225124 0t0 TCP *:webcache (LISTEN) nginx 1855 root 7u unix 0xffff88003cd1c780 0t0 225128 socket
- lddでnginxとリンクしているものをみる
$ sudo ldd /nginx/sbin/nginx linux-vdso.so.1 => (0x00007ffd4753b000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fcf64b6b000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcf6494f000) libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fcf64718000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fcf644b6000) libz.so.1 => /lib64/libz.so.1 (0x00007fcf642a0000) libc.so.6 => /lib64/libc.so.6 (0x00007fcf63ed2000) /lib64/ld-linux-x86-64.so.2 (0x00007fcf64d6f000) libfreebl3.so => /lib64/libfreebl3.so (0x00007fcf63ccf000)
- straceでnginxの動作を確認する
$ sudo strace -f -p nginxのpid
- lsofでphp-fpmプロセスが使っているものをみる
$ sudo lsof -p `cat /var/run/php-fpm.pid ` COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php-fpm 1506 root cwd DIR 253,0 44 77976878 /php7.4.10/etc/php-fpm.d php-fpm 1506 root rtd DIR 253,0 4096 128 / php-fpm 1506 root txt REG 253,0 6301952 7316392 /php7.4.10/sbin/php-fpm php-fpm 1506 root mem REG 253,0 61560 136793635 /usr/lib64/libnss_files-2.17.so php-fpm 1506 root mem REG 253,0 106172832 201770171 /usr/lib/locale/locale-archive php-fpm 1506 root mem REG 253,0 402384 136871751 /usr/lib64/libpcre.so.1.2.0 php-fpm 1506 root mem REG 253,0 155744 136140229 /usr/lib64/libselinux.so.1 php-fpm 1506 root mem REG 253,0 15688 134559890 /usr/lib64/libkeyutils.so.1.5 php-fpm 1506 root mem REG 253,0 67104 134627596 /usr/lib64/libkrb5support.so.0.1 php-fpm 1506 root mem REG 253,0 88776 136793604 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 php-fpm 1506 root mem REG 253,0 210784 134627584 /usr/lib64/libk5crypto.so.3.1 php-fpm 1506 root mem REG 253,0 15856 134472995 /usr/lib64/libcom_err.so.2.1 php-fpm 1506 root mem REG 253,0 967760 134627594 /usr/lib64/libkrb5.so.3.3 php-fpm 1506 root mem REG 253,0 320720 134627580 /usr/lib64/libgssapi_krb5.so.2.2 php-fpm 1506 root mem REG 253,0 991616 138878729 /usr/lib64/libstdc++.so.6.0.19 php-fpm 1506 root mem REG 253,0 142144 136793643 /usr/lib64/libpthread-2.17.so php-fpm 1506 root mem REG 253,0 11392 134348913 /usr/lib64/libfreebl3.so php-fpm 1506 root mem REG 253,0 2156240 136793618 /usr/lib64/libc-2.17.so php-fpm 1506 root mem REG 253,0 2521144 134627604 /usr/lib64/libcrypto.so.1.0.2k php-fpm 1506 root mem REG 253,0 470376 134917281 /usr/lib64/libssl.so.1.0.2k php-fpm 1506 root mem REG 253,0 90248 134472992 /usr/lib64/libz.so.1.2.7 php-fpm 1506 root mem REG 253,0 3793048 134590359 /usr/lib64/libmysqlclient.so.18.0.0 php-fpm 1506 root mem REG 253,0 19248 136793624 /usr/lib64/libdl-2.17.so php-fpm 1506 root mem REG 253,0 1136944 136793626 /usr/lib64/libm-2.17.so php-fpm 1506 root mem REG 253,0 43712 136793647 /usr/lib64/librt-2.17.so php-fpm 1506 root mem REG 253,0 109976 136793645 /usr/lib64/libresolv-2.17.so php-fpm 1506 root mem REG 253,0 40600 136793622 /usr/lib64/libcrypt-2.17.so php-fpm 1506 root mem REG 253,0 163312 134294602 /usr/lib64/ld-2.17.so php-fpm 1506 root DEL REG 0,4 224808 /dev/zero php-fpm 1506 root mem REG 253,0 26970 201770170 /usr/lib64/gconv/gconv-modules.cache php-fpm 1506 root 0u CHR 1,3 0t0 4674 /dev/null php-fpm 1506 root 1u CHR 1,3 0t0 4674 /dev/null php-fpm 1506 root 2w REG 253,0 213 77977910 /var/log/php-fpm.log php-fpm 1506 root 3w REG 253,0 213 77977910 /var/log/php-fpm.log php-fpm 1506 root 4u unix 0xffff88003c070780 0t0 224809 socket php-fpm 1506 root 6u unix 0xffff88003c071680 0t0 224810 socket php-fpm 1506 root 7u unix 0xffff88003cd1d680 0t0 224811 /var/run/php-fpm.sock php-fpm 1506 root 8u a_inode 0,9 0 4670 [eventpoll]
- lddでphpがリンクしているものをみる
$ ldd /php7.4.10/sbin/php-fpm linux-vdso.so.1 => (0x00007ffd457e2000) libcrypt.so.1 => /usr/lib64/libcrypt.so.1 (0x00007f868e1e7000) libresolv.so.2 => /usr/lib64/libresolv.so.2 (0x00007f868dfcd000) librt.so.1 => /usr/lib64/librt.so.1 (0x00007f868ddc5000) libm.so.6 => /usr/lib64/libm.so.6 (0x00007f868dac3000) libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007f868d8bf000) libmysqlclient.so.18 => /usr/lib64/libmysqlclient.so.18 (0x00007f868d31b000) libz.so.1 => /usr/lib64/libz.so.1 (0x00007f868d105000) libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f868ce93000) libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f868ca30000) libc.so.6 => /usr/lib64/libc.so.6 (0x00007f868c662000) libfreebl3.so => /usr/lib64/libfreebl3.so (0x00007f868c45f000) libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f868c243000) /lib64/ld-linux-x86-64.so.2 (0x00007f868e41e000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f868bf3c000) libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x00007f868bcef000) libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x00007f868ba06000) libcom_err.so.2 => /usr/lib64/libcom_err.so.2 (0x00007f868b802000) libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00007f868b5cf000) libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f868b3b9000) libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x00007f868b1a9000) libkeyutils.so.1 => /usr/lib64/libkeyutils.so.1 (0x00007f868afa5000) libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007f868ad7e000) libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f868ab1c000)
- straceでphp-fpmの動作を確認する
$ sudo strace -f -p `cat /var/run/php-fpm.pid`2. choot環境の作成
/jail
にchroot環境を作成してゆく
- ディレクトリ作成
$ sudo mkdir -p /jail/{bin,etc,dev,var,usr,lib64,tmp} $ sudo mkdir -p /jail/var/{log,run,tmp} $ sudo ln -s bin /jail/command $ sudo ln -s ../lib64 /jail/usr/lib64 $ sudo chown -R root:root /jail $ sudo chmod -R 755 /jail $ sudo chmod 1777 /jail/tmp /jail/var/tmp
- mknod
$ ls -l /dev/{null,random,urandom,zero} crw-rw-rw-. 1 root root 1, 3 9月 17 00:50 /dev/null crw-rw-rw-. 1 root root 1, 8 9月 17 00:50 /dev/random crw-rw-rw-. 1 root root 1, 9 9月 17 00:50 /dev/urandom crw-rw-rw-. 1 root root 1, 5 9月 17 00:50 /dev/zero $ sudo mknod -m 0666 /jail/dev/null c 1 3 $ sudo mknod -m 0666 /jail/dev/random c 1 8 $ sudo mknod -m 0666 /jail/dev/urandom c 1 9 $ sudo mknod -m 0666 /jail/dev/zero c 1 5 $ ls -l /jail/dev/* crw-rw-rw-. 1 root root 1, 3 9月 17 02:47 /jail/dev/null crw-rw-rw-. 1 root root 1, 8 9月 17 02:47 /jail/dev/random crw-rw-rw-. 1 root root 1, 9 9月 17 02:47 /jail/dev/urandom crw-rw-rw-. 1 root root 1, 5 9月 17 02:47 /jail/dev/zero
- nginxとphpをコピーする
$ sudo mkdir -p /jail/nginx/{conf,html,logs,sbin} $ sudo chown -R root:root /jail/nginx $ sudo chmod -R 755 /jail/nginx $ sudo cp -a /nginx/sbin/nginx /jail/nginx/sbin/nginx $ sudo cp -a /nginx/conf/* /jail/nginx/conf $ sudo cp -a /nginx/html/* /jail/nginx/html $ sudo mkdir -p /jail/php7.4.10/{etc,sbin} $ sudo chown -R root:root /jail/php7.4.10 $ sudo chmod -R 755 /jail/php7.4.10 $ sudo cp -a /php7.4.10/etc/* /jail/php7.4.10/etc/ $ sudo cp -a /php7.4.10/sbin/php-fpm /jail/php7.4.10/sbin/php-fpm
- 動的ライブラリをコピー
nginxやphp-fpmがリンクしている動的ライブラリをコピーする
$ cd /lib64 $ sudo cp -a ld-2.17.so ld-linux-x86-64.so.2 /jail/lib64 $ sudo cp -a libdl-2.17.so libdl.so.2 /jail/lib64 $ sudo cp -a libpthread-2.17.so libpthread.so.0 /jail/lib64 $ sudo cp -a libcrypt-2.17.so libcrypt.so.1 /jail/lib64 $ sudo cp -a libpcre.so.1.2.0 libpcre.so.1 /jail/lib64 $ sudo cp -a libz.so.1.2.7 libz.so.1 /jail/lib64 $ sudo cp -a libc-2.17.so libc.so.6 /jail/lib64 $ sudo cp -a libfreebl3.so /jail/lib64 $ sudo cp -a libresolv-2.17.so libresolv.so.2 /jail/lib64 $ sudo cp -a librt-2.17.so librt.so.1 /jail/lib64 $ sudo cp -a libm-2.17.so libm.so.6 /jail/lib64 $ sudo cp -a libmysqlclient.so.18.0.0 libmysqlclient.so.18 /jail/lib64 $ sudo cp -a libssl.so.1.0.2k libssl.so.10 /jail/lib64 $ sudo cp -a libcrypto.so.1.0.2k libcrypto.so.10 /jail/lib64 $ sudo cp -a libstdc++.so.6.0.19 libstdc++.so.6 /jail/lib64 $ sudo cp -a libgssapi_krb5.so.2.2 libgssapi_krb5.so.2 /jail/lib64 $ sudo cp -a libkrb5.so.3.3 libkrb5.so.3 /jail/lib64 $ sudo cp -a libcom_err.so.2.1 libcom_err.so.2 /jail/lib64 $ sudo cp -a libk5crypto.so.3.1 libk5crypto.so.3 /jail/lib64 $ sudo cp -a libgcc_s-4.8.5-20150702.so.1 libgcc_s.so.1 /jail/lib64 $ sudo cp -a libkrb5support.so.0.1 libkrb5support.so.0 /jail/lib64 $ sudo cp -a libkeyutils.so.1.5 libkeyutils.so.1 /jail/lib64 $ sudo cp -a libselinux.so.1 /jail/lib64 $ sudo cp -a gconv /jail/lib64コピーした動的ライブラリにも再起的にlddして、他に依存している動的ライブラリがあれば、同様にコピーする
$ sudo ldd /jail/lib64/*
- 名前解決関係
$ sudo cp -a /lib64/libnss_{files,dns}* /jail/lib64 $ sudo cp -a /etc/{hosts,resolv.conf,nsswitch.conf,host.conf} /jail/etc
- タイムゾーン
$ sudo cp -a /usr/share/zoneinfo/Asia/Tokyo /jail/etc/localtime
- ネットワーク関係
$ sudo cp -a /etc/{protocols,services} /jail/etc
- ユーザー/グループ
$ sudo ed /jail/etc/passwd a nobody:x:99:99:nobody:/:/sbin/nologin nginx:x:995:992:nginx:/:/sbin/nologin . w q $ sudo ed /jail/etc/group a nobody:x:99: nginx:x:992: . w q $ sudo ed /jail/etc/shadow a nobody:*:14871:::::: nginx:*:14871:::::: . w q $ sudo ed /jail/etc/gshadow nobody::: nginx::: . w q $ sudo touch /jail/etc/shells $ sudo chown root:root /jail/etc/{passwd,group,shadow,gshadow,shells} $ sudo chmod 644 /jail/etc/{passwd,group,shells} $ sudo chmod 000 /jail/etc/{shadow,gshadow}busybox
nginxとphp-fpmを起動させるためだけに使うので
allnoconfig
で最小限にする$ wget https://git.busybox.net/busybox/snapshot/busybox-1_32_0.tar.gz $ tar zxvf busybox-1_32_0.tar.gz $ cd busybox-1_32_0 $ make allnoconfig $ ed .config 37095 /CONFIG_PREFIX/p CONFIG_PREFIX="./_install" /CONFIG_PREFIX/s|".*"$|"/jail"| /CONFIG_PREFIX/ CONFIG_PREFIX="/jail" w 37090 q $ make $ sudo make install $ ls -lh /jail/bin/{busybox,sh} -rwxr-xr-x. 1 root root 59K 9月 18 02:21 /jail/bin/busybox lrwxrwxrwx. 1 root root 7 9月 18 02:21 /jail/bin/sh -> busyboxdaemontools
$ sudo cp -a /command/* /jail/command $ sudo cp -a /service /jail/service動作確認2
- 起動
chroot内でnginxとphp-fpmを起動して動作確認する
$ sudo /usr/sbin/chroot /jail /command/svscan /service $ curl -i http://localhost:8080/index.html $ curl -i http://localhost:8080/test.php
- ログ
chroot内のログに出力されていることを確認
$ cat /jail/var/log/nginx.access.log $ cat /jail/var/log/nginx.error.log $ sudo cat /jail/var/log/php-fpm.logコンテナ作成
- chroot jailの容量
$ sudo du -sh /jail 29M /jail $ sudo du -sh /jail/* 344K /jail/bin 0 /jail/command 0 /jail/dev 704K /jail/etc 21M /jail/lib64 800K /jail/nginx 6.2M /jail/php7.4.10 20K /jail/service 0 /jail/tmp 0 /jail/usr 12K /jail/var
- tar ball作成
$ cd /jail $ sudo tar zcf /path/to/nginx-php-fpm.tar.gz . $ ls -lh /path/to/phpfpm-nginx.tar.gz -rw-r--r--. 1 root root 10M 9月 18 03:21 nginx-php-fpm.tar.gz
- Dockerfile
$ ed Dockerfile a FROM scratch ADD nginx-php-fpm.tar.gz / ENTRYPOINT ["/command/svscan", "/service"] . w q
- image作成
$ sudo docker image build -t local/nginx-php-fpm:0.1 . $ sudo docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE local/nginx-php-fpm 0.1 67efeeb7b9be About a minute ago 28.9MBということで、28.9MBのイメージが完成した。
動作確認3
コンテナ起動して正常動作を確認
$ sudo docker run -d --name nginx -p 8000:8080 local/nginx-php-fpm:0.1 $ sudo docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96e8dfaba37a local/nginx-php-fpm:0.4 "/command/svscan /se…" 5 seconds ago Up 4 seconds 0.0.0.0:8000->8080/tcp nginx $ curl -i http://localhost:8000/test.phpコンテナの容量
以下のとおり、28.9MB
$ sudo docker ps -s CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE 96e8dfaba37a local/nginx-php-fpm:0.4 "/command/svscan /se…" 11 minutes ago Up 39 seconds 0.0.0.0:8000->8080/tcp nginx 445B (virtual 28.9MB)
- 投稿日:2020-09-18T16:40:17+09:00
Django(Python)をDockerで立ち上げたメモ
はじめに
- DjangoとDockerの学習
- Python,Djangoのwebフレームワークを学びたかったが、環境構築が複雑だったため、仮想環境で立ちあげることにした。
- 基本はDockerの公式通りだが、公式通り書くとエラーがおきるため、一部修正した
- 公式はDjango × Postgresの構成
環境
- Docker on Mac
手順(準備と立ち上げ)
- プロジェクト用のディレクトリを作成し、移動。 ここではlinebotというアプリ名で進める。
MacBook-Air ~ % mkdir jinolinebot MacBook-Air ~ % cd jinolinebot MacBook-Air jinolinebot %
- Dockerfileを作成し、エディターで開く。
MacBook-Air jinolinebot % touch Dockerfile
- Dockerfileを編集し、保存。
DockerfileFROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/
- requirements.txt を作成し、以下のように編集する
MacBook-Air jinolinebot % touch requirements.txtrequirements.txtDjango>=1.8,<2.0 psycopg2
- docker-compose.ymlを作成し、以下のように編集する
MacBook-Air jinolinebot % touch docker-compose.ymldocker-compose.ymlversion: '3' services: db: image: postgres environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres web: build: . command: python3 manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db
- これで3つのファイルが準備が完了したのでアプリを立ち上げる。
MacBook-Air jinolinebot % docker-compose run web django-admin.py startproject アプリ名 Creating network "jinolinebot_default" with the default driver Building web Step 1/7 : FROM python:3 ---> 28a4c88cdbbf ~ Creating jinolinebot_db_1 ... done Creating jinolinebot_web_run ... done
- 立ち上がったら、次はデータベースへの接続設定をおこなう さきほどのコマンドで生成された設定ファイルの中を以下のように編集し、保存。
アプリ名/settings.py~ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD': 'postgres', 'HOST': 'db', 'PORT': 5432, } } ~
- コンテナを立ち上げ、以下の表示が一番したに表示されたら、http://0.0.0.0:8000/にアクセス
MacBook-Air jinolinebot % docker-compose up ~ Starting development server at http://0.0.0.0:8000/ web_1 | Quit the server with CONTROL-C.
- It worked! Congratulations on your first Django-powered page.と表示されたら成功.
参考文献
- 投稿日:2020-09-18T16:40:17+09:00
Django(Python)アプリをDockerで環境構築したメモ
はじめに
- Python,Djangoのwebフレームワークを学びたかったが、環境構築が複雑だったため、仮想環境で立ちあげることにした。
- 基本はDockerの公式ページ通りだが、公式通り書くとエラーがおきるため、一部修正した
- 公式はDjango × Postgresの構成
環境
- Docker on Mac
手順(準備と立ち上げ)
- プロジェクト用のディレクトリを作成し、移動。 ここではlinebotというアプリ名で進める。
MacBook-Air ~ % mkdir jinolinebot MacBook-Air ~ % cd jinolinebot MacBook-Air jinolinebot %
- Dockerfileを作成し、エディターで開く。
MacBook-Air jinolinebot % touch Dockerfile
- Dockerfileを編集し、保存。
DockerfileFROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/
- requirements.txt を作成し、以下のように編集する
MacBook-Air jinolinebot % touch requirements.txtrequirements.txtDjango>=1.8,<2.0 psycopg2
- docker-compose.ymlを作成し、以下のように編集する
MacBook-Air jinolinebot % touch docker-compose.ymldocker-compose.ymlversion: '3' services: db: image: postgres environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres web: build: . command: python3 manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - db
- これで3つのファイルが準備が完了したのでアプリを立ち上げる。
MacBook-Air jinolinebot % docker-compose run web django-admin.py startproject アプリ名 Creating network "jinolinebot_default" with the default driver Building web Step 1/7 : FROM python:3 ---> 28a4c88cdbbf ~ Creating jinolinebot_db_1 ... done Creating jinolinebot_web_run ... done
- 立ち上がったら、次はデータベースへの接続設定をおこなう さきほどのコマンドで生成された設定ファイルの中を以下のように編集し、保存。
アプリ名/settings.py~ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD': 'postgres', 'HOST': 'db', 'PORT': 5432, } } ~
- コンテナを立ち上げ、以下の表示が一番したに表示されたら、http://0.0.0.0:8000/にアクセス
MacBook-Air jinolinebot % docker-compose up ~ Starting development server at http://0.0.0.0:8000/ web_1 | Quit the server with CONTROL-C.
- It worked! Congratulations on your first Django-powered page.と表示されたら成功.
参考文献
- 投稿日:2020-09-18T16:25:06+09:00
ubuntu 20.04.1 上でプロキシ環境でdockerを使うための設定スクリプト
ubuntu 20.04.1 上でプロキシ環境でdockerを使うための設定スクリプト
ubuntu 20.04.1 上でプロキシ環境でdocker を利用する の設定を一括でやるスクリプトを作成しました。
使い方
docker-proxy.py
とかいう名前で保存します。chmod +x docker-proxy.py
で実行権限を付けます。sudo docker-proxy.py proxy-url
のようにして実行します。ここで proxy-url には
http://192.168.11.61:3128
などの文字列を指定します。スクリプト本体
#!/usr/bin/python3 import string import subprocess import os import sys ########################################################################### # template for /etc/apt/apt.conf ########################################################################### template_apt_conf = """\ Acquire::http::Proxy "$proxy_url"; Acquire::https::Proxy "$proxy_url"; """ ########################################################################### # template for /etc/systemd/system/docker.service.d/override.conf ########################################################################### template_docker_service_override = """\ [Service] Environment="HTTP_PROXY=$proxy_url" Environment="HTTPS_PROXY=$proxy_url" Environment="NO_PROXY=localhost,127.0.0.1" """ ########################################################################### # template for ~/.docker/config.json ########################################################################### template_config_json = """\ { "proxies": { "default": { "httpProxy": "$proxy_url", "httpsProxy": "$proxy_url", "noProxy": "localhost,127.0.0.1" } } } """ ########################################################################### # write proxy data to a file ########################################################################### def write_proxy(file_name, input_template, proxy_url): context = { 'proxy_url' : proxy_url } template = string.Template(input_template) data = template.substitute(context) with open(file_name, "w") as fout: fout.write(data) print("wrote: " + file_name) ########################################################################### # get the home directory of the original user ########################################################################### def get_original_home(): user = os.environ['SUDO_USER'] if user: home_dir = os.path.expanduser('~' + user) else: home_dir = os.path.expanduser('~') return home_dir ########################################################################### # write etc/apt/apt.conf ########################################################################### def write_apt_conf(proxy_url): write_proxy('/etc/apt/apt.conf', template_apt_conf, proxy_url) ########################################################################### # write /etc/systemd/system/docker.service.d/override.conf ########################################################################### def write_docker_service_override(proxy_url): docker_service_d = '/etc/systemd/system/docker.service.d' if not os.path.isdir(docker_service_d): os.mkdir(docker_service_d) override_conf = os.path.join(docker_service_d, "override.conf") write_proxy(override_conf, template_docker_service_override, proxy_url) ########################################################################### # write ~/.docker/config.json ########################################################################### def write_docker_config(proxy_url): # get the path of ~/.docker home_dir = get_original_home() docker_dir = os.path.join(home_dir, ".docker") # create ~/.docker if not os.path.isdir(docker_dir): os.mkdir(docker_dir) # get ~/.docker/config.json config_json = os.path.join(docker_dir, "config.json") write_proxy(config_json, template_config_json, proxy_url) ########################################################################### # usage ########################################################################### def usage(): print("usage: sudo docker-proxy.py proxy-url") print("example: sudo docker-proxy.py http://192.168.11.61:3128") def exec(command): subprocess.call(command.split(), shell=False) print("ran: " + command) if __name__ == '__main__': if len(sys.argv) != 2 or os.getuid() != 0: usage() sys.exit(1) proxy_url = sys.argv[1] write_apt_conf(proxy_url) write_docker_service_override(proxy_url) write_docker_config(proxy_url) exec('systemctl daemon-reload') exec('systemctl restart docker')処理内容
以下ファイルにプロキシ設定を書き込みます。(必要に応じてフォルダも作成します。)
/etc/apt/apt.conf
/etc/systemd/system/docker.service.d/override.conf
~/.docker/config.json
以下コマンドを実行して docker デーモンの設定ファイルを反映します。
systemctl daemon-reload
systemctl restart docker
- 投稿日:2020-09-18T11:50:41+09:00
FlaskのDockerイメージをHerokuにデプロイする
FlaskのDockerイメージをHerokuにデプロイする
はじめに
macOS環境の記事ですが、Windows環境も同じ手順になります。環境依存の部分は読み替えてお試しください。
目的
この記事を最後まで読むと、次のことができるようになります。
No. 概要 キーワード 1 Dockerイメージのビルド/プッシュ heroku container:push web 2 Dockerイメージのリリース heroku container:release web 実行環境
環境 Ver. macOS Catalina 10.15.6 Python 3.7.3 Heroku 7.42.13 Docker 19.03.12 Flask 1.1.2 gunicorn 20.0.4 Jinja2 2.11.2 Werkzeug 1.0.1 ソースコード
実際に実装内容やソースコードを追いながら読むとより理解が深まるかと思います。是非ご活用ください。
関連する記事
手順
1. Container Registry ログイン
command.sh~% heroku container:login2. サンプルコード取得
command.sh~% git clone https://github.com/nsuhara/heroku-docker.git -b master
tree.shheroku-docker ├── Dockerfile ├── docker-compose.yml ├── docker_compose_up.sh └── webapp ├── app.py ├── requirements.txt ├── tests │ ├── __init__.py │ └── tests.py └── wsgi.py3. ディレクトリ移動
command.sh~% cd heroku-docker
4. Herokuアプリ作成
※今回のアプリ名は自動生成とします
command.sh~% heroku create Creating app... done, ⬢ {app-name}5. リモートリポジトリ設定
command.sh~% heroku git:remote -a {app-name}6. イメージビルド & Container Registry プッシュ
command.sh~% heroku container:push web7. Container Registry リリース
command.sh~% heroku container:release web8. アプリ表示
command.sh~% heroku openおまけ
ローカル環境アプリ表示
command.sh~% sh docker_compose_up.shcommand.sh~% open http://0.0.0.0:5000/コードチェック (pylint)
command.sh~% python -B -m pylint --rcfile=.pylintrc -f parseable `find webapp -name "*.py" -not -path "webapp/tests"`コードテスト (unittest)
command.sh~% python -B -m unittest discover tests