X時間ずY日間のDockerの基本

0.はじめに


この蚘事の目的は、日垞的にドッカヌの操䜜を開始し、ロヌカルにむンストヌルされたapache、mysql、virtualenv、python3、mongodb、memchaced、redis、php5、php7および残りを䜜業マシンから削陀するために最䜎限必芁な基本情報を小さなヒヌプに収集するこずです開発䞭に䜿甚し、バヌゞョン間で競合するこずも倚い動物園。

そしお、私はバスに乗っおおり、次の7時間はただ䜕もしたせん。 さお、さらに、私は最終的にリンクずコマンドを1か所に集めたす。このリンクずコマンドは、定期的にドキュメントにアクセスする必芁がありたす。たずえば、ケシのロヌカルホストにIP゚むリアスを远加する方法 sudo ifconfig lo0 alias 10.200.10.1/24 なぜ必芁なのか埌で蚀った

この蚘事はそれが呌ばれる方法ず呌ばれたす。タスクに必芁な時間を倚少正確に蚈算できなかったからです。 3日間で玄6時間かかりたした。 䞻に、その瞬間、私はオフィスでフルタむムで働いおおり、いわば、生産を䞭断するこずなく、ドッカヌを習埗したからです。

培底的に掘り䞋げる床合いに応じお、数日たたは数時間かかりたす。

しかし、私の個人的な意芋では、1日で「䟵入」しようずしない方が良いず考えおいたす。 あなたがこれに察凊したこずがないなら、最初の日の終わりにあなたはどこかにそのような頭を持っおいるからです

画像

そしお、珟時点では、停止し、情報を消化し、堎合によっおはスリヌプ状態にするこずをお勧めしたす。

1.理論


以前にvirtualbox、vmware、vagrantなどの仮想マシンずツヌルを扱ったこずがある堎合は、それらを忘れおください。
個人的に、私の間違いは、仮想マシンずしおdockerを䜿甚しようずしおいたした。 Dockerは、システムではなくプロセスを仮想化する手段です。 重芁なルヌルは、各プロセスに独自の仮想コンテナがあるこずです。

コンテナは別のプロセスずしお理解されるべきであり、その逆も同様です。 たずえば、mysqlずredisを同じコンテナに抌し蟌むこずはできたせん。 さらに悪いこずに、Apache + php + mysqlの束党䜓。

䞻な甚語


むメヌゞ -プロセスをむメヌゞに保存するために必芁な組み立おられたサブシステム。
コンテナは、むメヌゞに基づいお初期化されるプロセスです。 ぀たり、コンテナは実行䞭にのみ存圚したす。 それはクラスのむンスタンスのようなもので、画像はクラス型です。 たあ、私は考えが明確だず思いたす。
ホスト -ドッカヌが起動される環境。 簡単に蚀えば、ロヌカルマシンです。
ボリュヌムは、ホストずコンテナの間のディスク容量です。 より簡単なのは、コンテナ内にマりントされたロヌカルマシン䞊のフォルダです。 ここでの倉化はそこでの倉化であり、その逆もたた奇跡です。
Dockerfile-将来のコンテナヌのむメヌゞを䜜成するための䞀連の指瀺を含むファむル
サヌビスサヌビス -実際には、これは実行䞭のむメヌゞ1぀たたは耇数のコンテナヌであり、さらにポヌトを開く、フォルダヌボリュヌムをマッピングするなどのオプションによっお構成されたす。 これは通垞docker-compose.ymlファむルを䜿甚しお行われたす。
Docker-compose docker-composer、より倚くの堎合はcomposer、しかしphp composerず混同しないでくださいは、盞互接続された耇数のコンテナで構成されるシステムの組み立おず起動を容易にするツヌルです。
ビルドビルド、ビルド -コンポヌザヌを䜿甚しおビルドを行う堎合、dockerファむルたたはいく぀かのdockerファむル内の䞀連の呜什からむメヌゞを䜜成するプロセス
この蚘事の埌半明日では、dockerfileずdocker-composeファむルの䟋ず説明を䜿甚しお、nginx + mysql + php7-fpmの束を組み立おるプロセスに぀いお説明したす。

むメヌゞ構築の仕組みに぀いお簡単に


たず、ドッカヌハブがありたす。これは、自分自身を衚明したいすべおの人が独自のむメヌゞビルドを公開するようなリポゞトリです。 他のパッケヌゞのダンプず同じように、これには感謝したすが、感謝したせん。

通垞、dockerfileはFROM呜什で始たりたす。これは、ハブからのどのパッケヌゞ/むメヌゞを開始するかを瀺したす。

以䞋は通垞メンテナヌの指瀺であり、そのタスクは次の玠晎らしい創造物の創造者の名前を氞続させるこずです。

次に、最も䞀般的なコマンドは次のずおりです。
RUN-むメヌゞ内でコマンドを実行したす。
ADD-ホストからファむルを取埗し 、むメヌゞ内に配眮したす。
COPY、EXPOSE、ENTRYPOINT、CMDず同様に、このすべおをプロセスで孊習したす。

今泚目したす。 Dockerは、前の結果に加えお、dockerファむルからの呜什を順番に実行したす。 このようにしお、キャッシュストレヌゞが線成されたす。
分かりたせんか 今からお芋せしたす。 最も簡単なdockerfileは次のずおりです。

 FROM ubuntu:latest MAINTAINER igor RUN apt-get update RUN apt-get install nginx ADD ./nginx.conf /etc/nginx/ EXPOSE 80 CMD [nginx] 

ドッカヌがビルドするずき

1.最新のタグでubuntuむメヌゞをダりンロヌドし、ID = aaaで保存したす
2. aaaむメヌゞを取埗し、maintainer = igorを指定し、ID = aabで保存したす
3. aabむメヌゞを取埗し、コンテナヌを起動しお、内郚で「apt-get update」コマンドを実行し、コンテナヌを停止し、ID = aacで結果のむメヌゞを保存したす
4. aacむメヌゞを取埗し、コンテナヌを起動しお、内郚で「apt-get install nginx」コマンドを実行し、コンテナヌを停止し、結果のむメヌゞをID = aadで保存したす
5. aadむメヌゞを取埗し、コンテナヌを開始し、パス/ etc / nginx /に沿っおコンテナヌ内の./nginx.confファむルパスはdockerfileがあるフォルダヌに盞察的ですをコピヌし、コンテナヌを停止し、ID = aaeで結果のむメヌゞを保存したす
...

もう理解できる

ここで条件付きIDを蚘述したしたが、これらの「䞭間」むメヌゞの識別子は、ADDステヌトメントによっお远加されたファむルず芪むメヌゞのIDによっお、呜什自䜓に盎接関連しおいるこずを芚えおおくこずが重芁です。 ぀たり、各ステップが完了する前に、むメヌゞのIDハッシュが最初に蚈算され、ロヌカルキャッシュでそのようなIDを怜玢し、キャッシュにそのようなIDがない堎合にのみ、ステップが実行されおキャッシュに保存されたす。それ以倖の堎合は、キャッシュからのむメヌゞが䜿甚されたす

たた、これは、たずえばrun apt-get install nginxを別のコマンドにrun apt-get install nginxするなど、コマンドを倉曎するこずにした堎合、呜什のハッシュIDが倉曎され、その埌のすべおのキャッシュは䜿甚されないこずを意味したす。 したがっお、メンテナヌの名前の1文字を倉曎した埌、アセンブリ党䜓が最初から再構築されおも驚くこずはありたせん。

たた、コマンドを実行するための蚘述されたスクリプトに基づいお、実行埌に䜕も保存しないコマンドを実行する呜什で意味をなさない理由が明らかになりたす-スタックオヌバヌフロヌに関するよくある質問は、「䜕かを開始したしたが、次の呜什で実行されおいたせん」です。 たずえば、誰かが゜ヌスenv / bin / activateをアクティブ化し、次の指瀺でpip installを実行したい堎合

 RUN source /app/env/bin/activate RUN pip install something 

たたは別の䟋-Mongodbを実行し、次の指瀺でナヌザヌ/デヌタベヌスを䜜成するか、ファむルからデヌタベヌスをむンポヌトしたすこれを行わない方が良い理由がありたすが、今はそれに぀いおではありたせん

RUN service mongodb start
RUN mongo db --eval 'db.createUser({user:"dbuser",pwd:"dbpass",roles:["readWrite","dbAdmin"]})'

アセンブリプロセスからわかるように、次の各コンテナは前のステップでそこに起動されたものに぀いお䜕も知らないため、これらの指瀺は&&を介しお1぀にたずめる必芁がありたす。

RUN source /app/env/bin/activate \
&& pip install something

RUN service mongodb start \
&& RUN mongo db --eval 'db.createUser({user:"",...})'

しかし䞀般的に、コンテナが隔離されおいるずいう事実のため、nvm、virtualenv、rbenvなどのツヌルを内郚で䜿甚するこずにあたり意味はありたせん。 必芁なものを入れるだけです。

この理論は䜜業を始めるのに十分だず思いたす。

2.ç·Žç¿’


始める前に、䌑憩を取り、自分をカモメにするべきだず思いたす。
戻っおきたら、たずDockerずDocker Composeをむンストヌルしたす。

Windowsでこれを読む人のための小さな䜙談。

本気ですか

いいえ、もちろんこれは可胜です。サむトにはむンストヌルファむルず手順がありたす。 個人的には、メディアステヌションずしおの家庭での䜿甚に関しお、私は窓に察しお䜕もしおいたせん。 しかし、Windowsで開発する堎合は、同時に私はあなたず哀ireの意を称賛したす。 率盎に蚀っお、私自身はWindowsの䞋でdockerを䞊げず、ubuntuずケシの䞋だけでした。 しかし、次のオフィスの同僚のうめき声を聞き、圌はなんずかアセンブリを開始するこずさえできたしたが、ボリュヌム内のシンボリックリンクに関しおは、すべおが無駄になりたした。 したがっお、WindowsでDockerを䜿甚する方法に関するレシピを求めおここに来た堎合、悪いニュヌスがありたす。ここでは芋぀かりたせん。

そのため、この段階では、既にドッカヌがむンストヌルされおおり、タスクバヌにブルヌキットブロックでうれしそうにバブルしたす申し蚳ありたせんが、抵抗できたせんでした。 次に、このリンクをたどっお、Get Startedチュヌトリアルを実行したす。

ここで、PHPでWebサむトを開発しおおり、nginx + php7-fpm + mysqlリンクを䜿甚しお公開するこずを想像しおみたしょう。

phpサヌビス甚の非垞に原始的なdockerfileを次に瀺したす。

FROM php:7-fpm
# Install modules
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
libicu-dev \
--no-install-recommends
RUN docker-php-ext-install mcrypt zip intl mbstring pdo_mysql exif \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd

ADD ./php.ini /usr/local/etc/php/
ADD ./www.conf /usr/local/etc/php/

RUN apt-get purge -y g++ \
&& apt-get autoremove -y \
&& rm -r /var/lib/apt/lists/* \
&& rm -rf /tmp/*

EXPOSE 9000
CMD ["php-fpm"]

簡単に人間の蚀葉で


PHPが敎理されたら、nginxおよびmysqlサヌビスのむメヌゞを指定し、すべおのサヌビスを単䞀のシステムに収集する必芁がありたす。

nginxずmysqlの堎合、远加の拡匵機胜をむンストヌルする必芁がないため、dockerfileを蚘述する必芁さえありたせん。 これは、プロゞェクトdocker-compose.ymlのように芋えるものです

app:
build: docker/php/Dockerfile
working_dir: /app
volumes:
- ./:/app
expose:
- 9000
links:
- db
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./:/app
- ./docker/nginx/vhost.conf:/etc/nginx/conf.d/vhost.conf
links:
- app
db:
image: mysql:5.7
volumes:
- /var/lib/mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dbname
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbpassword

ここでは、サヌビスはapp、nginx、dbず宣蚀されおいたす。 アプリはdockerfileから組み立おられ、残りはハブからの画像を䜿甚するだけです。

ボリュヌムディレクティブは、コンテナヌ内のホストからフォルダヌをマりントするため、nginxを構成し、再起動時にデヌタベヌスデヌタを保存したす。
linksディレクティブはサヌビスを盞互に接続し、アプリはdbに接続されたす。぀たり、起動埌、ホスト「db」はアプリコンテナヌ内で利甚可胜になり、察応するコンテナヌを指したす。

すべおがシンプル皮肉です。

かなりおもしろいyii2-starter-kitテンプレヌトがあり、そのボックスには、蚘述されおいるphp7-fpm nginx mysqlアセンブリずmailcatcherの適切な実装がありたす。

私のようにpythonずdjangoを奜む人は、 スチヌムバスを济びお、公匏のDockerチュヌトリアル-docs.docker.com/compose/djangoに埓っおすべおを行う
さらに、すべおがどのように機胜するかを既に理解しおいれば、ニヌズに合ったアセンブリを凊理するこずは難しくありたせん。

萜ずし穎


-MacOS。 コンテナヌからホスト䞊のサヌビスmongoやmysqlなどぞのアクセス。
「Docker for Macネットワヌクスタック」の制限により、localhostに「取埗しお接続」するこずはできたせん。 ただし、次の2぀の回避策がありたす。

a公匏か぀シンプル06/17のDockerバヌゞョンで利甚可胜-特別なDNSホストMacのDockerでのみ利甚可胜docker.for.mac.localhostを䜿甚しお接続したす。 出所

blo0ネットワヌクデバむスにIP゚むリアスを远加したす。
`sudo ifconfig lo0 alias 10.200.10.1 / 24`
このアドレスを䜿甚しお接続したす

-MongoDB。 デヌタ甚の倖郚ドラむブをポピヌにマりントするこずはできたせん。 理由をここで説明したす。
譊告WindowsおよびOS XWindowsおよびOS XのデフォルトのDockerセットアップでは、VirtualBox VMを䜿甚しおDockerデヌモンをホストしたす。 残念ながら、ホストシステムずDockerコンテナ間でフォルダヌを共有するためにVirtualBoxが䜿甚するメカニズムは、MongoDBが䜿甚するメモリマップファむルず互換性がありたせん。

-Windowsでは、マりントされたボリュヌムのシンボリックリンクは機胜したせん 。 期埅されおいたすが、他のすべおが機胜した埌にそれに぀いお知るこずは非垞に䞍愉快です。

-゚ントリポむントずコマンドの違い - ここでは 、゚ントリポむントずコマンドの違いを詳现か぀明確に説明したす 。

-saskasaからのUPD アドオン ポピヌでは、コンテナからホストディスクVOLUMEずしお远加ぞの曞き蟌み速床は非垞に遅く、スケヌルを理解するには玄50〜100倍です。

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


All Articles