makeとコマンドを打つと、webサイトのデプロイが自動的に行われる。
結果、https://sotanaka.42.fr/ にアクセスすと、WordPressなどで作成したサイトにアクセスできる。

またBonusでは、(私の設計だと)https://adminer.42.fr/ にアクセスするとadminerからデータベースにアクセスできる。

- 大規模な開発での機能(サーバーとアプリなど)の分離
- 分離した機能同士のコミュニケーションの方法
- コミュニケーションのためのツール
軽量な仮想化マシン、といったん考えるといいと思う。
課題の中核になる技術で、機能を分離するツールになる。
- ホスト型仮想化(VM/VertualBox/etc.)
- ハイパーバイザー型仮想化
- コンテナ型仮想化(Docker)
Born2BeRootでは、ホスト型仮想化(ホストOS > 仮想化ソフトウエア > ゲストOS > ゲスト用ソフト)を利用していた。
Dockerはコンテナ型仮想化(ホストOS > 仮想化ソフトウエア > ゲスト用ソフト)という感じ。
- コンテナ型仮想化(Docker)では、ゲストOSが不要
え、じゃあなんのOSで動いてるの?というと、ホストOSが持っているLinuxカーネルを間借りして動いている。
MacやWindowsのDockerEngineにはLinuxOSが搭載されいる、という感じ - Dockerでは、Linuxをベースとしたシステム設計になる
- 動作が軽い
- 同じ環境を他のハードでも再現しやすい
つまり、「私はMac」「うちはWin」「ワイはDebian」みたいな時に、OSの違いを乗り越えて、Docker上(同じ環境の上)で開発や確認ができる。
仮想化とは:「Docker よくわからない」を終わりにする本
仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん
6つあり、
①container
②image
③Dockerfile
④DockerVolume
⑤Docker Network
⑥docker-compose
を簡単に説明する。
特定のコマンドを実行するために作られる、ホストマシン上の隔離された領域のこと。
仮想マシン的な機能、という理解で大きな問題はない。
例えば、コンテナの中で、ホストOSとは異なるディストリビューション(Debian/Aplineなど)を入れて、その上でホストOSとは異なるverのpythonをインストールして、プログラムを実行することもできる。
"仮想マシン的"というのは、実際には、LinuxのNamespaceという機能で分離された1プロセスでしかないから。
コンテナを立ち上げるためのパッケージ。
OS、インストールされているソフトなどが全て含まれていると思えばよい(なので容量が大きい)。
imageがあれば、インターネット通信を切ってもコンテナを立ち上げることができる。
次のような情報が含まれている。
- ベース(ディストリビューションのようなもの)
- ソフト(Pythonやwordpressなど)
- 環境変数(wordpressを立ち上げるためのユーザー情報など)
- どういう設定ファイルを配置しているか
- デフォルト命令(wordpress startなど)はなにか
よく利用されるイメージは、DockerHubに公開されているので、そこからダウンロードすればOk。
imageを、カスタマイズして生成できる機能(ファイル)。
既存の公開されたイメージは便利ではあるものの、自分の用途のためにはカスタマイズする必要があるかもしれない。
例えば、nginxとMariaDBがセットになって、かつBraveも入ったコンテナを利用したいけど、そんなのは既存ではないなあ。とか。
この時に、ワガママなイメージを生成できるのがDockerfileで、記述はムズイと思うけど便利かもしれない。
inceptionの文脈では、nginxなどは既存のイメージがあるが、既存のイメージは利用できない(debian/alpineのみ可)。
From debian:xx
RUN apt-get install nginx brave(適当)
のように記述して、ワガママイメージを生成することになる。
以下は各ソフトの公式Dockerfile。これらを見ると、どんなコマンドでどんな他のソフトもダウンロードしているか少しわかる(ほとんどわからない)
nginx
MariaDB
WordPress
adminer
Dockerfileからイメージを生成するときに、.dockerignoreを2つの目的で利用する。
まず理解したいのは、イメージを生成する時には、ビルドのルート(~.ymlのあるディレクトリと思えばOK)以下の、全てのデータが一旦転送される、ということ。
この時に、イメージの生成に必要のないファイルが含まれていても、問答無用で転送される。
これがデータの大きいファイルだったら、イメージ生成のプロセスがムダに遅延することになる。
そこで、.dockerignoreが有効になる。以下2つの大きな目的がある。
- イメージ生成効率の向上
イメージ生成には不要なデータを.dockerignoreに記述することで、データ転送が減り、イメージ生成効率が向上する。 - セキュリティの向上(副次的な効果)
イメージ生成の時に、本当はイメージに含めたくない、パスワードなどのセンシティブなファイルがあったとする。
これを誤って、Dockerfileでコピーや参照しないように、.dockerignoreに記述する。
もしも、ignoreされたファイルをイメージに含めようとすると、転送されていないファイルなので、イメージ生成プロセスでエラーになる。
.dockerignoreが効かない?.gitignoreとは書き方が違うよ!
.dockerignoreに記載すべきファイルとは
データ永続化の仕組み。
コンテナは頻繁に破棄する前提みたい。ソフトのセキュリティアップデートとかしやすいのかな。
なので、データを保管するMariaDBが入ったコンテナも捨てることがある。
このとき、コンテナ内にデータがあると、必要なデータも全部消えちゃう。
なので、コンテナ上ではなく、ホストPC上にデータ保存領域をもっとこうぜ、みたいなもの。
そしてコンテナ外のデータ保管領域は大きく2種類ある。
Volumeは、Dockerが管理する領域。
管理とは、ディレクトリの作成、参照、編集などのライフサイクルをDockerが握るということ。
docker volume rm xxコマンドで、データをすっぱり消すことができる。
もちろん、ホストPCのどこかにあるので、ホストPCからも存在は確認できる。しかし編集や削除をホストPCからすると、Dockerの知らぬところで発生した変更なので、予期せぬ動作を起こすこともあるみたい。
そして、Dockerをアンインストールしたら消える(と思う)。
Bindは、ホストPCが管理する領域。
コンテナを立ち上げるときに、ホストPCの保管先(からコンテナ内のディレクトリの共有先)を自分で指定する。
これによって、コンテナ内の/home/mydirexx/が、ホストの/tmp/dockerxx/をハードリンクとして持っているような状態になる。
Volumeと管理の観点で異なっており、コンテナからも参照や編集が可能である。
ただ、docker volume rmしてもデータは消えない。
[余談]
inceptionではまったポイントは、複数のコンテナのバインド先をホストの1つのディレクトリにしていたこと。
これによって、先にイメージのビルドプロセスで作成したファイルが、コンテナの立ち上げ時には消えてしまっていました。。(別のコンテナの内容で上書きされる)
コンテナによってバインド先は分けましょう。
初心者向けチュートリアルでは、コマンドでdocker run xxから始まり、docker image build xxやそれらに付随する、オプション(ポートやパスワード)設定を行っていると思います。
docker-composeはそれらのコマンドを、何回も打つのめんどくさいし、1つのファイルにまとめて記述しちゃおう。みたいな機能(ファイル)です。
3部: Docker Compose
Docker を理解するためのポイント:「Docker よくわからない」を終わりにする本
- 暗号化
データを暗号化し、第三者が読み取れないようにする - 認証
通信相手が正当な相手であることを確認する(自己署名証明証はブラウザが警告することが多い) - データの完全性
データが送受信される途中で改ざんされていないことを保証する
SSLの次世代規格がTLSです。
SSLに根本的に脆弱性があったので、SSLのバージョンアップではなく、TLSという形になったようです。
これ以上に深く踏み込むことは一旦避けた。
SSL/TLSでは、公開鍵暗号方式と共通鍵暗号方式の両方が使われます。
公開鍵は、誰にでも渡して良い鍵です。
秘密鍵は、誰にも渡してはいけない鍵です。
データの送信者は、受信者の公開鍵を使って、通信を暗号化します。
しかし、暗号化したデータは公開鍵を利用しても、復号はできません。
暗号化したデータを復号できるのは、秘密鍵だけです。なので、受信者だけが、暗号化したデータを復号できます。
TLSでは、通信の最初に”これからデータのやり取りをしたいからよろしく!”といって、データ要求者とデータ保持者で握手するプロセスがあります。
この時に、公開鍵暗号を利用します。ここでやり取りされるデータは、”共通鍵はXXXXね”、という内容です。
この内容も公開鍵暗号方式を利用しているので、共通鍵が漏れることはありません。
で、握手した後のデータの送受信では、公開鍵ではなく、共通鍵を使って暗号化・復号を行います。
全部のデータ送受信で公開鍵暗号方式を使えばいいやん、とも思いますが、共通鍵を用いる方が、データの暗号化や復号がスピーディーなのだそう。
ここは、そういうアルゴリズムのプログラムなんだな、くらいの理解にとどめた。
では、通信方法をざっと確認
- 公開鍵暗号方式
- 通信の開始時に使用される
- サーバーとクライアントが共通鍵を安全に交換するために使用される
- 共通鍵暗号方式:
- 通信経路が確立された後に使用される
- データの暗号化と復号を効率的に行える
TLSプロトコルを支える、デジタル文書です。
- 特定の組織やドメインの身元を証明するためのデジタル文書
- SSL/TLS証明書とも呼ばれ、通信の暗号化と認証に使用される
- 公開鍵: 先述
- 秘密鍵: 先述
- 署名: 証明書の正当性を保証する証明書発行機関 (CA: Certificate Authority) の署名
- その他: 組織名、ドメイン名、有効期限など
Let's Encrypt, DigiCert, GlobalSignなど
- 自分自身で署名した証明書で、開発やテスト用途に使用
- 信頼性は低いため、公開環境では推奨されない
- ブラウザが警告を出すので、利用者が不審がって、サイトの信頼性が落ちる
自己署名証明書(オレオレ証明書)によるHTTPSローカル環境の構築
OpenSSL で SSL 自己証明書を発行する手順
Nginxに自己署名証明書を設定してHTTPS接続してみる
.phpで動作するサイトについては、wordpressに処理を依頼するリバースプロキシとして機能するんだと思う。
それ以外のスタティックなデータに対しては、データをwordpressを介さずに提供する、でいいのかな。
inceptionの文脈では、サーバー機能、リバースプロキシ機能を知る、か。
リバースプロキシとは?
remote_addrとかx-forwarded-forとかx-real-ipとか
サイト作成、管理のツールとして広く利用される。
.phpの集合体で、呼び出されるたびに一時的に実行されるプロセス。つまり、デーモンとして常駐するようなアプリではない。
inceptionの文脈では、サイト構築が簡単にできるツールの利用方法を知る、か。
PHPとは─WordPressでの使われ方を解説
.php形式の
データベースソフトウエア。
リレーショナル型データベースで、一般的にはテキスト、数値などの、表対応するような構造化されたデータの保存に利用される。
inceptionの文脈では、データベースとは何か、どのような利用用途かを知る、か。
データベースに直接画像を保存することの メリット・デメリット
画像データを MySQL に格納するとどうなるか
コンテナにはOSしかダウンロードできていない状態から、サイトの表示までを自動化する必要がある。
なので、ソフトのダウンロードや初期設定はDockerfileや.ymlに必ず実行するコマンドとして、全て記述しなければならない。
例:nginxの設定ファイル、MariaDBのユーザー設定、Wordpressのユーザーやサイト設定
ソフトリストを最新にする→nginx/opensslをインストール→自己署名証明書を作成→confファイルを要件に合わせる→nginxを起動
nginxのインストール
自己署名証明書の識別名の入力を自動化1
自己署名証明書の識別名の入力を自動化2
リストを最新にする→MariaDBをインストール→port/bind-addressを設定→MaridDBに新しいデータベースとユーザーを作成→mariadbをスタート
MySQLの使い方
リストを最新にする→wgetやphp-fpmのインストール→wpのDLと解凍→wp-cliのDLと解凍
wordpressのDLと解凍
wp-cliのインストール
wpのインストール(初期設定)
docker-composeへの記述
WP-CLIでユーザーを作成する
How to download Adminer1
How to download Adminer2
わたしはDebianを利用した。(ユーザー名もパスワードもdebian。ルートユーザーは作成してない)
ufwをインストールしてssh接続を許可(ホストから操作しないなら不要)
VirtualBoxのポストフォーワーディングも設定
sshdとufwを起動
makeをインストール
.envファイルを作成(scpを利用してホストからコピーした)
Docker Engine インストール(Debian 向け)
現在のユーザーをdockerのグループに追加して適用 sudo usermod -aG docker debian
scp -r -P 8042 /path/of/host/* debian@127.0.0.1:/path/to/guest/
- Each service has to run in a dedicated container.
.ymlの記述、コンテナを稼働させてdocker container ls -aで確認 - the containers must be built either from the penultimate stable version of Alpine or Debian
https://hub.docker.com/_/debian
で'-slim'で検索して、最新のより1つ古いバージョンであることを確認
バージョンをハードコードしているので、最新版の1つ古いversionよりも古い可能性があるが、これに対するディフェンスは「常に最新版より一つ古いものを利用していると、コマンドなどが変化するリスクがある。そのため、実装時点の最新版よりも1つ古いものをハードコードしてリスクを低減している」 - A Docker container that contains NGINX with TLSv1.2 or TLSv1.3 only
Dockerfileのinstall記述とopenssl s_client -connect sotanaka.42.fr:443 -tls1_2" - A Docker container that contains WordPress + php-fpm (it must be installed and configured) only without nginx.
Dockerfileのinstall記述とnginx - A Docker container that contains MariaDB only without nginx.
同上 - A volume that contains your WordPress database.
WEBデータとデータベース
管理者画面からイメージファイルをアップロードして、ホストのバインドしたディレクトリからファイルを見にいく感じかな。 - A second volume that contains your WordPress website files.
新規の記事を作成して、mariadbのデータベースに追加されているかを見に行けばいいと思う。
mariadb
USE wordpress;
SELECT ID, post_title, post_content, post_date FROM wp_posts WHERE post_type = 'post' ORDER BY post_date DESC; - A docker-network that establishes the connection between your containers.
docker network lsで.ymlから作成されたネットワークを確認してdocker network inspect srcs_net_inceptionで、接続されてるコンテナを確認する - Your containers have to restart in case of a crash.
wordpressのコンテナで、kill -9 1 x(php-fpm -d)を行ってコンテナをクラッシュさせる。
Dockerのrestart policyごとの違いを表でまとめてみる - recommended to use any hacky patch based on ’tail -f’
Dockerfileなどで、コンテナ起動時のスクリプトを確認する。
コンテナは、ある目的を持って動作する1つの機能であると考える。
そう考えると、tail -fのような、コンテナの目的にない動作で、コンテナを存命させることはコンテナの目的を達成してないし、リソースの無駄になる。
今回作ったコンテナを目的通りに存命させ続けるデフォルトの方法は、nginx、php-fpm、mariadbなどのプロセスを監視(他のコンテナなどからの接続待機)状態でスタートしておくことである。
個人的に覚えておきたい集 tailコマンド - Of course, using network: host or --link or links: is forbidden.
セキュリティ懸念や古い方法だから使うなってことか?
いい加減docker-composeでlinksを使うのをやめてnetworkでコンテナ間名前解決をする
ホスト・ネットワークの使用
【Docker Network 第3章】-net = hostオプションを理解する - Read about PID 1 PID 1問題
- WordPress database, there must be two users
ユーザー設定のスクリプトと、実際のwp-adminでのログイン。 - Your volumes will be available in the /home/login/data.
- Set up Adminer.