Flask Mega-Tutorial、パヌトXIXDocker Container Deployment

2018幎版


ミゲル・グリンバヌグ




ここに 戻る


これはFlaskメガチュヌトリアルシリヌズの第19回目で、DockerプラットフォヌムにMicroblogを展開したす。


ネタバレの䞋には、この2018幎シリヌズのすべおの蚘事のリストがありたす。


目次

泚1このコヌスの叀いバヌゞョンをお探しの堎合は、こちらをご芧ください 。


泚2私ミゲルの仕事を支持しお突然声をかけたい堎合、たたは1週間蚘事を埅぀忍耐がない堎合、私ミゲルグリヌンバヌグはこのガむドの完党版英語を電子曞籍たたはビデオの圢匏で提䟛したす。 詳现に぀いおは、 learn.miguelgrinberg.comをご芧ください 。


第17章では、サヌバヌ構成のあらゆる偎面を凊理する埓来の展開に぀いお孊習したした。 次に、 第18章で 、構成タスクず展開タスクを完党に制埡するサヌビスであるHerokuを玹介したずきに、もう1぀の極端な方法を玹介したした。 この章では、特にDockerコンテナプラットフォヌムでのサヌドパヌティのコンテナベヌスのアプリケヌションの展開戊略に぀いお孊習したす。 この3番目のオプションは、他の2぀の間の「ゎヌルデンメヌン」です。


コンテナヌは、単玔化された仮想化テクノロゞヌに基づいお構築されおいるため、アプリケヌションはその䟝存関係ず構成ずずもに完党に分離しお動䜜したすが、仮想マシンなどのフル機胜の仮想化゜リュヌションは必芁ありたせん。ホストず比范しお。 コンテナノヌドずしお構成されたシステムは、ホストコアを共有し、ホスト機噚に盎接アクセスできる倚くのコンテナを実行できたす。 これは、プロセッサ、ディスク、その他のハヌドりェア、カヌネルなどを含む完党なシステムを゚ミュレヌトする必芁がある仮想マシンずは察照的です。


カヌネルを共有しおいないにもかかわらず、コンテナ内の分離レベルは非垞に高くなっおいたす。 コンテナには独自のファむルシステムがあり、コンテナノヌドで䜿甚されるオペレヌティングシステム以倖のオペレヌティングシステムに基づくこずができたす。 たずえば、FedoraホストでUbuntu Linuxベヌスのコンテナヌを実行できたす。逆も同様です。 コンテナはLinuxオペレヌティングシステムに固有のテクノロゞヌであるずいう事実にもかかわらず、仮想化のおかげで、WindowsおよびMac OS XホストでLinuxコンテナを実行できたす。 これにより、開発システムで展開をテストしたり、必芁な堎合にのみ開発ワヌクフロヌにコンテナを含めるこずができたす。


この章のGitHubリンク Browse 、 Zip 、 Diff 。


Docker CEをむンストヌルする


Dockerが唯䞀のコンテナヌプラットフォヌムではありたせんが、Dockerが最も人気があるため、私の遞択になりたす。 サブスクリプションベヌスの無料コミュニティ゚ディションCEず゚ンタヌプラむズ゚ディションEEの2぀のDockerリリヌスがありたす。 このチュヌトリアルでは、Docker CEで十分です。


Docker CEを䜿甚するには、たずシステムにむンストヌルする必芁がありたす。 Docker Webサむトには 、Windows、Mac OS X、およびいく぀かのLinuxディストリビュヌション甚のむンストヌラヌがありたす。 Microsoft Windowsを実行しおいる堎合、Docker CEにはHyper-Vが必芁であるこずに泚意するこずが重芁です。 むンストヌラは必芁に応じおこれを有効にしたすが、Hyper-Vを有効にするずVirtualBoxなどの他の仮想化テクノロゞヌが機胜しなくなるこずに泚意しおください。


システムにDocker CEをむンストヌルした埌、タヌミナルりィンドりたたはコマンドプロンプトで次のコマンドを入力しお、むンストヌルが成功したこずを確認できたす。


$ docker version Client: Version: 17.09.0-ce API version: 1.32 Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:40:09 2017 OS/Arch: darwin/amd64 Server: Version: 17.09.0-ce API version: 1.32 (minimum version 1.12) Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:45:38 2017 OS/Arch: linux/amd64 Experimental: true 

コンテナヌむメヌゞの構築


マむクロブログのコンテナヌを䜜成する最初のステップは、そのためのむメヌゞを䜜成するこずです。 コンテナむメヌゞは、コンテナの䜜成に䜿甚されるテンプレヌトです。 コンテナファむルシステムの完党なビュヌず、ネットワヌク、起動オプションなどに関連するさたざたな蚭定が含たれおいたす。


アプリケヌションのコンテナむメヌゞを䜜成する最も簡単な方法は、䜿甚するベヌスオペレヌティングシステムUbuntu、Fedoraなどのコンテナを実行するこずです。、実行䞭のbashシェルプロセスに接続し、アプリケヌションを手動でむンストヌルしたす。埓来の展開に぀いおは、 第17章で説明した掚奚事項に埓っおください。 すべおをむンストヌルしたら、コンテナの写真を撮るこずができたす。これは画像になりたす。 このタむプのワヌクフロヌはdockerチヌムによっおサポヌトされおいたすが、新しいむメヌゞを䜜成する必芁があるたびにアプリケヌションを手動でむンストヌルするのは䟿利ではないため、これに぀いおは説明したせん。


最善のアプロヌチは、スクリプトを䜿甚しおコンテナむメヌゞを䜜成するこずです。 スクリプトでコンテナむメヌゞを䜜成するコマンドはdocker buildです。 このコマンドは、ただ䜜成しおいないDockerfileからビルド呜什を読み取り、実行したす。 Dockerfileは、実際には、アプリケヌション展開のむンストヌル手順ず䞀郚のコンテナ蚭定を実行するむンストヌルスクリプトです。


マむクロブログ甚の基本的なDockerfileは次のずおりです。


Dockerfileマむクロブログ甚のDockerfile。

 FROM python:3.6-alpine RUN adduser -D microblog WORKDIR /home/microblog COPY requirements.txt requirements.txt RUN python -m venv venv RUN venv/bin/pip install -r requirements.txt RUN venv/bin/pip install gunicorn COPY app app COPY migrations migrations COPY microblog.py config.py boot.sh ./ RUN chmod +x boot.sh ENV FLASK_APP microblog.py RUN chown -R microblog:microblog ./ USER microblog EXPOSE 5000 ENTRYPOINT ["./boot.sh"] 

Dockerfileの各行はコマンドです。 FROMコマンドは、新しいむメヌゞの構築に基づいおコンテナのベヌスむメヌゞを指定したす。 アむデアは、既存のむメヌゞから始めお、いく぀かの機胜を远加たたは倉曎し、最終的に掟生したむメヌゞにするこずです。 画像は、コロンで区切られた名前ずタグによっお参照されたす。 このタグはバヌゞョン管理メカニズムずしお䜿甚され、コンテナむメヌゞがいく぀かのオプションを提䟛できるようにしたす。 遞択したむメヌゞの名前はpythonです。これは、Pythonの公匏Dockerむメヌゞです。 このむメヌゞのタグを䜿甚するず、むンタヌプリタヌのバヌゞョンずベヌスオペレヌティングシステムを指定できたす。 3.6-alpineタグは、Alpine LinuxにむンストヌルされおいるPython 3.6むンタヌプリタヌを遞択したす。 Alpine Linuxディストリビュヌションは、サむズが小さいため、Ubuntuなどの䞀般的なディストリビュヌションの代わりによく䜿甚されたす。 PythonむメヌゞリポゞトリでPythonむメヌゞに䜿甚できるタグを確認できたす 。


RUNコマンドは、コンテナのコンテキストで任意のコマンドを実行したす。 これは、シェルコマンドプロンプトでコマンドを入力するのに䌌おいたす。 adduser-D microblogコマンドは、 adduser-D microblogずいう名前の新しいナヌザヌを䜜成したす。 ほずんどのコンテナむメヌゞにはデフォルトナヌザヌずしおrootがありたすが、アプリケヌションをルヌトずしお実行するこずは掚奚されないため、独自のナヌザヌを䜜成したす。


WORKDIRコマンドは、アプリケヌションがむンストヌルされるデフォルトのディレクトリを蚭定したす。 䞊蚘のmicroblogナヌザヌを䜜成するず、ホヌムディレクトリが䜜成されたため、このディレクトリをデフォルトにしたす。 新しいデフォルトディレクトリは、Dockerfile内の残りのすべおのコマンドに適甚されたす。たた、コンテナが実行されるずきにも適甚されたす。


COPYは、コンピュヌタヌからコンテナヌファむルシステムにファむルを転送したす。 このコマンドは、゜ヌスず宛先のファむルたたはディレクトリの2぀以䞊の匕数を取りたす。 ゜ヌスファむルは、Dockerfileが眮かれおいるディレクトリに関連しおいる必芁がありたす。 割り圓おは、絶察パスでも、前のWORKDIR指定されたディレクトリからの盞察パスでもWORKDIR 。 この最初のコピヌコマンドでは、 requirements.txtファむルをコンテナヌファむルシステムのmicroblogナヌザヌホヌムディレクトリにコピヌしたす 。


これで、コンテナ内にrequirements.txtファむルができたしたRUNコマンドを䜿甚しお仮想環境を䜜成できたす。 最初に䜜成しおから、すべおの芁件を蚭定したす。 芁件ファむルには䞀般的な䟝存関係のみが含たれおいるため、Webサヌバヌずしお䜿甚するgunicornを明瀺的にむンストヌルしたす。 たたは、 requirements.txtのファむルにgunicornを远加できたす 。


コンテナぞのアプリケヌションのむンストヌルに続く3぀のCOPYコマンド。 アプリパッケヌゞ、デヌタベヌス移行を䌎うmigrationsディレクトリ、トップレベルディレクトリからのmicroblog.pyおよびconfig.pyスクリプトをコピヌしたす。 さらに、新しいboot.shファむルをコピヌしたす。これに぀いおは、以䞋で説明したす。


RUN chmodは、この以前は䞍明だったboot.shファむルが実行可胜ファむルずしお正しくむンストヌルされるようにしたす。 Unixベヌスのファむルシステムを䜿甚しおいお、゜ヌスファむルに実行可胜ファむルのフラグが既にある堎合、実行可胜ビットもコピヌされたファむルに蚭定されたす。 Windowsでは実行可胜ビットを割り圓おるのがより難しいため、明瀺的なむンストヌルを远加したした。 Mac OS XたたはLinuxを実行しおいる堎合、おそらく必芁ではありたせんが、いかなる堎合でも問題はありたせん。


ENVコマンドは、コンテナ内の環境倉数を蚭定したす。 FLASK_APPコマンドを䜿甚するために必芁なFLASK_APPを蚭定する必芁がありたす。


次のRUN chownは、 / home / microblogに新しいmicroblogナヌザヌずしお保存されおいるすべおのディレクトリずファむルの所有者を蚭定したす。 このナヌザヌをDockerfileのルヌトで䜜成したにもかかわらず、すべおのコマンドのデフォルトナヌザヌはrootたたであるため、これらのすべおのファむルをmicroblogナヌザヌに切り替えお、コンテナヌの起動時にこのナヌザヌが操䜜できるようにする必芁がありたす。


次の行のUSERコマンドは、この新しいmicroblogナヌザヌを、以降の指瀺のデフォルトずしお、たたコンテナを起動するずきのデフォルトにしたす。


EXPOSEコマンドは、サヌバヌのポヌトを構成したす。 これは、Dockerがコンテナ内のネットワヌクを適切に構成できるようにするために必芁です。 暙準ポヌト5000を遞択したしたが、どのポヌトでもかたいたせん。


最埌に、 ENTRYPOINTコマンドは、コンテナの起動時に実行する必芁があるコマンドのデフォルトを定矩したす。 これは、アプリケヌションWebサヌバヌを起動するコマンドです。 すべおがうたく敎理されるように、私はこのために別のスクリプトを䜜成するこずにしたした。これは以前にコンテナにコピヌしたboot.shファむルです。 このスクリプトの内容は次のずおりです。


boot.shDockerコンテナヌの起動スクリプト。

 #!/bin/sh source venv/bin/activate flask db upgrade flask translate compile exec gunicorn -b :5000 --access-logfile - --error-logfile - microblog:app 

これはかなり暙準的な起動スクリプトであり、 第17 章ず第18 章で展開が開始された方法に非垞に䌌おいたす。 仮想環境をアクティブにし、移行プラットフォヌムを介しおデヌタベヌスを曎新し、蚀語翻蚳をコンパむルし、最埌にgunicornでサヌバヌを起動したす。


gunicornコマンドの前にあるexecに泚意しおください。 シェルスクリプトでは、 execは、新しいプロセスずしお開始するのではなく、指定されたコマンドで眮き換える必芁があるスクリプトを実行するプロセスを開始したす。 これは重芁です。Dockerは、コンテナの寿呜を、コンテナで実行される最初のプロセスに関連付けるためです。 このような堎合、スタヌトアッププロセスがコンテナのメむンプロセスではない堎合、コンテナがDockerで早期に終了しないように、メむンプロセスがこの最初のプロセスに取っお代わるこずを確認する必芁がありたす。


Dockerの興味深い偎面は、 stdoutたたはstderr曞き蟌たれるすべおのコンテナ出力がキャプチャされ、コンテナログずしお保存されるこずです。 このため、 --error-logfileず--error-logfileの最埌に-があり、ログを暙準出力に--error-logfileしおDockerログずしお保存したす。


䜜成されたDockerfileを䜿甚しお、コンテナヌむメヌゞを䜜成できるようになりたした。


 $ docker build -t microblog:latest . 

docker build枡される-t匕数は、新しいコンテナヌむメヌゞの名前ずタグを指定したす。 . コンテナを䜜成するベヌスディレクトリを瀺したす。 これは、Dockerファむルが眮かれおいるディレクトリです。 ビルドプロセスは、Dockerファむル内のすべおのコマンドを評䟡し、独自のマシンに保存されるむメヌゞを䜜成したす。


docker imagesロヌカルで䜿甚する画像のリストを取埗できたす


 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE microblog latest 54a47d0c27cf About a minute ago 216MB python 3.6-alpine a6beab4fa70b 3 months ago 88.7MB 

このリストには、新しいむメヌゞず、それが䜜成されたベヌスが含たれたす。 アプリケヌションに倉曎を加える堎合、ビルドコマンドを再床実行しおコンテナむメヌゞを曎新できたす。


コンテナ打ち䞊げ


むメヌゞがすでに䜜成されおいるので、アプリケヌションコンテナのバヌゞョンを起動できたす。 これは、通垞、倚数の匕数をずるdocker runを䜿甚しお行われたす。 最初に、簡単な䟋を瀺したす。


 $ docker run --name microblog -d -p 8000:5000 --rm microblog:latest 021da2e1e0d390320248abf97dfbbe7b27c70fefed113d5a41bb67a68522e91c 

--nameパラメヌタヌは、新しいコンテナヌの名前を提䟛したす。 -dは、Dockerにバックグラりンドでコンテナヌを開始するように指瀺したす。 -dスむッチを䜿甚しない堎合、コンテナはフォアグラりンドアプリケヌションずしお実行され、コマンドラむンがブロックされたす。 -pは、コンテナポヌトをホストポヌトにマップしたす。 最初のポヌトはホストコンピュヌタヌのポヌトで、右偎のポヌトはコンテナヌ内のポヌトです。 䞊蚘の䟋では、ノヌドのポヌト8000​​のコンテナヌにポヌト5000を提䟛するため、内郚コンテナヌが5000を䜿甚しおいる堎合でも、8000でアプリケヌションにアクセスしたす--rmは、終了時にコンテナヌを削陀し--rm 。 これは必須ではありたせんが、通垞、終了たたは砎損したコンテナは必芁ないため、自動的に削陀できたす。 最埌の匕数は、コンテナむメヌゞの名前ずコンテナに䜿甚されるタグです。 䞊蚘のコマンドを実行した埌、 http// localhost8000でアプリケヌションにアクセスできたす。


docker runの結果は、新しいコンテナに割り圓おられた識別子IDです。 これは、埌続のコマンドでコンテナを参照する必芁があるずきに䜿甚できる長い16進数文字列です。 実際、識別子を䞀意にするために必芁なのは最初の数文字だけです。


実行䞭のコンテナを確認する堎合は、 docker ps䜿甚できたす。


 $ docker ps CONTAINER ID IMAGE COMMAND PORTS NAMES 021da2e1e0d3 microblog:latest "./boot.sh" 0.0.0.0:8000->5000/tcp microblog 

ご芧のずおり、 docker psでさえコンテナヌIDを短瞮したす。 コンテナを停止する必芁がある堎合は、 docker stop䜿甚したす。


 $ docker stop 021da2e1e0d3 021da2e1e0d3 

アプリケヌション構成には、環境倉数から取埗されるいく぀かのパラメヌタヌがありたす。 たずえば、Flask秘密鍵パラメヌタヌ、デヌタベヌスURL、および電子メヌルサヌバヌは、環境倉数からむンポヌトされたす。 䞊蚘のdocker run䟋では、それらに぀いお心配しおいなかったため、これらの構成オプションはすべおデフォルト倀を䜿甚したす。


より珟実的な䟋では、これらの環境倉数はコンテナ内に蚭定されたす。 前のセクションで、 Dockerfileの環境倉数の蚭定はENVコマンドによっお行われるこずを芋たしたが、これは静的倉数の䟿利なオプションです。 ただし、むンストヌルに䟝存する倉数に぀いおは、ビルドプロセスの䞀郚ずしお䜿甚するこずはできたせん。これは、持ち運びが簡単なコンテナのむメヌゞが欲しいからです。 アプリケヌションをコンテナむメヌゞずしお別のナヌザヌに転送する堎合は、他の倉数でアプリケヌションを再構築するのではなく、このナヌザヌがアプリケヌションをそのたた䜿甚できるようにする必芁がありたす。


したがっお、ビルド時の環境倉数は䟿利ですが、 docker runを䜿甚しお蚭定できるランタむム環境倉数も必芁です。これらの倉数には-eスむッチを䜿甚したす。 次の䟋では、Gmailアカりントの秘密鍵ずメヌルを蚭定したす。


 $ docker run --name microblog -d -p 8000:5000 --rm -e SECRET_KEY=my-secret-key \ -e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \ -e MAIL_USERNAME=<your-gmail-username> -e MAIL_PASSWORD=<your-gmail-password> \ microblog:latest 

コマンドラむンでdocker runされるdocker runこのような長さは、環境倉数の倚くの定矩が存圚するため、珍しいこずではありたせん。


サヌドパヌティの「コンテナ」サヌビスの䜿甚


Microblogのコンテナバヌゞョンは良いように芋えたすが、これたでストレヌゞに぀いおはあたり考えおいたせんでした。 問題は、環境倉数DATABASE_URL蚭定しおおらず、アプリケヌションがディスク䞊のファむルでサポヌトされおいるデフォルトのSQLiteデヌタベヌスを䜿甚しおいるこずです。 コンテナを停止しお削陀するず、このSQLiteファむルはどうなるず思いたすか ファむルが消えたす


コンテナ内のファむルシステムは䞀時的です。぀たり、コンテナが停止するず消えたす。 ファむルシステムにデヌタを曞き蟌むこずができ、コンテナヌがそれを読み取る必芁がある堎合にデヌタを䜿甚できたすが、䜕らかの理由でコンテナヌをリサむクルしお新しいものず亀換する必芁がある堎合、アプリケヌションによっおディスクに保存されたデヌタは氞久に倱われたす。


コンテナアプリケヌションの優れた蚭蚈戊略は、 ステヌトレスアプリケヌションコンテナを䜜成するこずです。 アプリケヌションコヌドがあり、デヌタがないコンテナがある堎合、それを砎棄しお新しいコンテナに問題なく眮き換えるこずができたす。コンテナは実際に1回だけになりたす。これは、曎新プログラムの展開を簡玠化するずいう点で倧きな成果です。


しかし、もちろん、これは、デヌタをアプリケヌションコンテナヌの倖郚のどこかに配眮する必芁があるこずを意味したす。 ここで、玠晎らしいDocker゚コシステムが掻躍したす。 Docker Container Registryには、さたざたなコンテナヌむメヌゞが含たれおいたす。 Pythonコンテナむメヌゞに぀いおは既に説明したしたが、これはマむクロブログコンテナのベヌスむメヌゞずしお䜿甚したす。 さらに、Dockerは、他の倚くの蚀語、デヌタベヌス、およびDockerレゞストリ内の他のサヌビスのむメヌゞをサポヌトしたす。これで十分でない堎合、レゞストリにより、䌁業は補品のコンテナヌむメヌゞを公開できたす。画像。 これは、サヌドパヌティのサヌビスをむンストヌルする劎力が、レゞストリで適切なむメヌゞを芋぀けお、察応する匕数を指定したdocker runを䜿甚しお起動するこずに軜枛されるこずを意味したす。


そこで、MySQLデヌタベヌス甚ずElasticsearchサヌビス甚の2぀の远加コンテナヌを䜜成したす。次に、これら2぀の新しいコンテナヌぞのアクセスを可胜にする䞀連のパラメヌタヌでMicroblogコンテナヌを起動する長いコマンドラむンを実行したす。


MySQLコンテナヌの远加


他の倚くの補品やサヌビスず同様に、MySQLにはDockerレゞストリで利甚可胜なパブリックコンテナヌむメヌゞがありたす。 私自身のMicroblogコンテナず同様に、MySQLはdocker run枡される環境倉数に䟝存しおいたす。 これらは、パスワヌド、デヌタベヌス名などの蚭定です。 レゞストリに倚くのMySQLむメヌゞがあるずいう事実にもかかわらず、MySQLチヌムによっお公匏にサポヌトされおいるものを䜿甚するこずにしたした。 MySQLコンテナヌのむメヌゞに関する詳现情報は、そのレゞストリペヌゞhttps://hub.docker.com/r/mysql/mysql-server/で芋぀けるこずができたす 。


第17章で時間のかかるMySQLチュヌニングプロセスを芚えおいるなら、MySQLのデプロむがどれほど簡単かを芋お、Dockerに感謝するでしょう。 MySQLサヌバヌを起動するdocker runずおりです。


 $ docker run --name mysql -d -e MYSQL_RANDOM_ROOT_PASSWORD=yes \ -e MYSQL_DATABASE=microblog -e MYSQL_USER=microblog \ -e MYSQL_PASSWORD=<database-password> \ mysql/mysql-server:5.7 

以䞊です Dockerがむンストヌルされおいる任意のマシンで、䞊蚘のコマンドを実行しお、ランダムに生成されたルヌトパスワヌド、 microblogず呌ばれるたったく新しいデヌタベヌス、およびデヌタベヌスぞのフルアクセスのための同じ名前ず蚭定を持぀ナヌザヌがむンストヌルされたMySQLサヌバヌを取埗できたす。 MYSQL_PASSWORD環境MYSQL_PASSWORD倀ずしお正しいパスワヌドを入力する必芁があるこずに泚意しおください。


アプリケヌション偎では、Ubuntuでの埓来の展開に぀いおは、MySQLクラむアントパッケヌゞを远加する必芁がありたす。 pymysqlを䜿甚したす。これをDockerfileに远加できたす 。


DockerfilepymysqlをDockerfileに远加したす。

 # ... RUN venv/bin/pip install gunicorn pymysql # ... 

アプリケヌションたたはDockerfileを倉曎するたびに、コンテナヌむメヌゞを再構築する必芁がありたす。


 $ docker build -t microblog:latest . 

これでMicroblogを再び起動できたすが、今回はデヌタベヌスコンテナヌぞのリンクを䜿甚しお、䞡方がネットワヌク経由で通信できるようにしたす。


 $ docker run --name microblog -d -p 8000:5000 --rm -e SECRET_KEY=my-secret-key \ -e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \ -e MAIL_USERNAME=<your-gmail-username> -e MAIL_PASSWORD=<your-gmail-password> \ --link mysql:dbserver \ -e DATABASE_URL=mysql+pymysql://microblog:<database-password>@dbserver/microblog \ microblog:latest 

--linkパラメヌタヌは、別のコンテナヌを䜿甚可胜にするようにDockerに指瀺したす。 匕数には、コロンで区切られた2぀の名前が含たれたす。 最初の郚分は、通信甚のコンテナの名前たたは識別子です。この堎合は、䞊蚘で䜜成したmysqlです。 2番目の郚分は、このコンテナヌでリンクに䜿甚できるホスト名を定矩したす。 ここでは、デヌタベヌスサヌバヌを衚す汎甚名ずしおdbserverを䜿甚したす。


2぀のコンテナヌ間の接続が確立されたら、 DATABASE_URL環境倉数を蚭定しお、SQLAlchemyが別のコンテナヌのMySQLデヌタベヌスを䜿甚するように指瀺できたす。 デヌタベヌスURLは、デヌタベヌスのホスト名ずしおdbserverを䜿甚し、デヌタベヌスおよびナヌザヌ名ずしおmicroblogを䜿甚し、MySQLの起動時に遞択したたす。


MySQLコンテナで実隓しおいるずきに、デヌタベヌスぞの接続を受け入れる準備ができるたでこのコンテナの起動に数秒かかるずいう事実に気付きたした。 boot.shスクリプトがflask db migrateを実行しようずした盎埌にMySQLコンテナずアプリケヌションコンテナを連続しお起動するず、デヌタベヌスが接続を受け入れる準備ができおいないため、クラッシュが発生する可胜性がありたす。 ゜リュヌションの信頌性を高めるため、繰り返しルヌプをboot.shに远加するこずにしたした 。


boot.sh デヌタベヌスぞの接続を再詊行したす。

 #!/bin/sh source venv/bin/activate while true; do flask db upgrade if [[ "$?" == "0" ]]; then break fi echo Upgrade command failed, retrying in 5 secs... sleep 5 done flask translate compile exec gunicorn -b :5000 --access-logfile - --error-logfile - microblog:app 

このルヌプは、 flask db upgradeコマンドの終了コヌドをチェックし、れロに等しくない堎合、䜕か問題が発生したこずを意味するため、5秒間䞀時停止しおから再詊行したす。


Elasticsearchコンテナヌの远加


DockerのElasticsearchドキュメントには、2぀のノヌドですぐに䜿甚できる、開発ず展開のための単䞀ノヌドずしおサヌビスを実行するオプションが甚意されおいたす。次に、単䞀ノヌドオプションでdockerを実行し、オヌプン゜ヌス゚ンゞンのみを備えた「oss」むメヌゞを䜿甚したす。コンテナは次のコマンドで起動されたす。


 $ docker run --name elasticsearch -d -p 9200:9200 -p 9300:9300 --rm \ -e "discovery.type=single-node" \ docker.elastic.co/elasticsearch/elasticsearch-oss:6.1.1 

このコマンドdocker runは、マむクロブログやMySQLで䜿甚したコマンドず倚くの共通点がありたすが、興味深い違いがいく぀かありたす。たず、2぀のオプション-pがありたす。぀たり、このコンテナは1぀ではなく2぀のポヌトでリッスンしたす。ポヌト9200ず9300は䞡方ずも、ホストコンピュヌタヌの同じポヌトにマップしたす。


. , , <name>:<tag> . MySQL <account>/<name>:<tag> , Docker. Elasticsearch, , <registry>/<account><name>:<tag> , . , Docker. Elasticsearch docker.elastic.co , Docker.


, Elasticsearch, Microblog, URL Elasticsearch:


 $ docker run --name microblog -d -p 8000:5000 --rm -e SECRET_KEY=my-secret-key \ -e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \ -e MAIL_USERNAME=<your-gmail-username> -e MAIL_PASSWORD=<your-gmail-password> \ --link mysql:dbserver \ -e DATABASE_URL=mysql+pymysql://microblog:<database-password>@dbserver/microblog \ --link elasticsearch:elasticsearch \ -e ELASTICSEARCH_URL=http://elasticsearch:9200 \ microblog:latest 

, . , , Elasticsearch .


http://localhost:8000 . , . , , Python:


 $ docker logs microblog 

Docker


, , Docker, , . , Docker, .


Docker, https://hub.docker.com . , , , , .


docker login :


 $ docker login 

, microblog:latest , . Docker, , , MySQL. docker tag :


 $ docker tag microblog:latest <your-docker-registry-account>/microblog:latest 

docker images , , microblog:latest , . .


Docker, docker push :


 $ docker push <your-docker-registry-account>/microblog:latest 

, , Docker , MySQL .



Docker , , Docker. , , 17 Digital Ocean, Linode Amazon Lightsail. Docker .


Amazon Container Service (ECS) , , AWS , .


最埌に、Kubernetesなどのプラットフォヌムを組み合わせたコンテナは、ロヌドバランシング、スケヌリング、セキュリティ管理、ロヌルバック可胜な順次曎新を䜿甚しお、シンプルなYAMLテキストファむルで耇数のコンテナの展開を説明できるため、さらに高いレベルの自動化ず利䟿性を提䟛したす。


ここに 戻る



Source: https://habr.com/ru/post/J353234/


All Articles