20200918のdockerに関する記事は10件です。

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.yml
version: '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/sec

Dockerfile

初期データと投入用シェルスクリプトをコピーし、entrypoint.shを呼び出します。
(ちなみにEXPOSEはただのドキュメントらしいです。)

Dockerfile
FROM 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/sqlservr

import-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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Docker] Hugo でサイトを構築し、GitHub で公開

概要

Docker 上で Hugo のサイトをを構築し、GitHub で公開する手順についてまとめる。

前提

  • Git の基本知識
  • GitHub のアカウントがある
  • Docker の基本知識
  • ターミナルが利用できる

環境

作業フォルダ名は、「DockerHugo」とする。
Hugo の仮想環境起動の docker-compose.yml は[Docker] Hugo を利用するための環境構築を参照。

DockerHugo
├── docker-compose.yml

全体像

コンテナとローカルで行う流れを下図に示す
スクリーンショット 2020-09-17 23.33.56.png

新しい 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] をクリックするとテーマを利用したサイトが確認できる
スクリーンショット 2020-09-16 22.29.24.png

[Code] に記載されているリンクをコピーする
image.png

ローカル PC のターミナルを起動し、「DockerHugo」 フォルダーで、以下を実行

ローカルPC
git init
git submodule add https://github.com/matcornic/hugo-theme-learn.git hugo/themes/learn

themes/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 files

html や css などサイトの構成に必要なファイルが DL されたことを確認できる

config.toml に追記

ローカル PC のターミナルの hoge フォルダで以下を実行

ローカルPC
echo 'theme = "learn"' >> config.toml

config.toml ファイルに追記される

config.toml
baseURL = "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/ を開く
スクリーンショット 2020-09-16 23.06.41.png

ページのカスタマイズについては別記事に記載する

config.tomlファイルの修正

サイトの全体的な設定は、config.tomlファイルで行う。
以下のように変更

config.toml
baseURL = "" # 相対パスを 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」 フォルダーが指定されている。

以下の画像は GitHub Pages の設定画面
スクリーンショット_2020-09-17_22_53_47.png

relativeURLs = "true"にした理由について補足

絶対パスから相対パスにしたことで、フォルダーを移動時にも対応できるようにした

静的サイトをビルド

コンテナの「DockerHugo」 フォルダー(ルートフォルダ)で以下を実行

コンテナ
hugo

config.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 files

GitHub Pages で公開

git コマンド、または SourceTree を利用して GitHub Pages に公開する
詳細は下記の記事を参照
[ターミナル] git/github を管理する方法
[SourceTree] ローカル/リモートリポジトリの管理

参考

Hugo quick start ページ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.0

2. ./configure; make

./configure --helpでオプションを確認し、必要なオプションを指定して実行する。

$ ./configure --help
$ ./configure --prefix=/nginx
$ make

3. 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_64

2. パッケージの内容物の確認

$ rpm -ql MariaDB-shared
$ rpm -ql MariaDB-devel

PHP/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.10

2. ./configure; make

./configure --helpでオプションを確認し、必要なオプションを指定して実行する。

$ ./configure --help
$ ./configure --prefix=/php7.4.10 \
> --disable-all \
> --enable-fpm  \
> --with-mysqli=/usr/bin/mysql_config
$ make
$ make test

3. 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/var

4. 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 = 700

daemontoolのインストール

ダウンロード・展開

$ 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.php

chroot の作成

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 -> busybox

daemontools

$ 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)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.0

2. ./configure; make

./configure --helpでオプションを確認し、必要なオプションを指定して実行する。

$ ./configure --help
$ ./configure --prefix=/nginx
$ make

3. 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_64

2. パッケージの内容物の確認

$ rpm -ql MariaDB-shared
$ rpm -ql MariaDB-devel

PHP/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.10

2. ./configure; make

./configure --helpでオプションを確認し、必要なオプションを指定して実行する。

$ ./configure --help
$ ./configure --prefix=/php7.4.10 \
> --disable-all \
> --enable-fpm  \
> --with-mysqli=/usr/bin/mysql_config
$ make
$ make test

3. 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/var

4. 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 = 700

daemontoolのインストール

ダウンロード・展開

$ 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.php

chroot の作成

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 -> busybox

daemontools

$ 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)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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を編集し、保存。
Dockerfile
FROM 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.txt
requirements.txt
Django>=1.8,<2.0
psycopg2
  • docker-compose.ymlを作成し、以下のように編集する
MacBook-Air jinolinebot % touch docker-compose.yml
docker-compose.yml
version: '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,
    }
}
~
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.と表示されたら成功.

参考文献

https://docs.docker.jp/compose/django.html#id2

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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を編集し、保存。
Dockerfile
FROM 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.txt
requirements.txt
Django>=1.8,<2.0
psycopg2
  • docker-compose.ymlを作成し、以下のように編集する
MacBook-Air jinolinebot % touch docker-compose.yml
docker-compose.yml
version: '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,
    }
}
~
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.と表示されたら成功.

参考文献

https://docs.docker.jp/compose/django.html#id2

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ubuntu 20.04.1 上でプロキシ環境でdockerを使うための設定スクリプト

ubuntu 20.04.1 上でプロキシ環境でdockerを使うための設定スクリプト

ubuntu 20.04.1 上でプロキシ環境でdocker を利用する の設定を一括でやるスクリプトを作成しました。

使い方

  1. docker-proxy.py とかいう名前で保存します。
  2. chmod +x docker-proxy.py で実行権限を付けます。
  3. 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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsチュートリ

7.4.2から

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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:login

2. サンプルコード取得

command.sh
~% git clone https://github.com/nsuhara/heroku-docker.git -b master
tree.sh
heroku-docker
    ├── Dockerfile
    ├── docker-compose.yml
    ├── docker_compose_up.sh
    └── webapp
            ├── app.py
            ├── requirements.txt
            ├── tests
            │       ├── __init__.py
            │       └── tests.py
            └── wsgi.py

3. ディレクトリ移動

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 web

7. Container Registry リリース

command.sh
~% heroku container:release web

8. アプリ表示

command.sh
~% heroku open

おまけ

ローカル環境アプリ表示

command.sh
~% sh docker_compose_up.sh
command.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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsチュートリ

7.1.4から

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む