開発用のWindows Docker、落とし穴分析

画像 この出版物は、WindowsでのDockerコンテナー仮想化の機能について説明しています。

完全なものであるとは主張しておらず、必要に応じて更新および補足されます。

ゼロからの実用的なガイダンスについては、 この出版物を参照することをお勧めします。

内容



プリセット


コンテナの仮想化またはDockerオペレーティングシステムレベルでの仮想化は、LinuxおよびFreeBSDディストリビューション(実験的)でのみネイティブに機能します。
Windowsでは、LinuxゲストシステムまたはDocker開発者からのLinuxカーネルを備えた特別な最小限の仮想マシンが必要になります。これらはすぐに使用できます。
BIOS / UEFIで仮想化を有効にしたことは言うまでもありません
設定項目は異なる方法で呼び出すことができます:VT-x、VT-d、Intel VT、AMD-V、Virtualization Technology。

もう1つの最小システム要件は、x64システムの容量とWindows 7 Pro以上のバージョンです。

WindowsのDocker ToolboxまたはWindowsのDockerを選択します


WindowsでのDocker ToolboxとMacでのDocker Toolboxの出現は大きなイベントでした。

アセンブリには、docker自体、docker-composeユーティリティ、docker-machine仮想マシンユーティリティ、Kitematicクライアントが含まれます。

最小限のLinux環境で仮想マシン(VirtualBoxのデフォルト)を使用します。

その後、新しいオペレーティングシステム用にDocker for WindowsDocker for Macがリリースされました。これらは現在現在のバージョンであり、開発を続けています。

バージョン間の選択は難しくありません:
-Windows 10 x64 Pro、Enterprise、またはEducationを使用している場合は、Hyper-Vサービスをオンにして、Docker for Windowsをインストールします。

Hyper-Vサービスを有効にすると、VirtualBoxでx64仮想マシンを実行および作成できなくなることに注意してください。

-異なるバージョンのWindows(7 Pro、8、8.1、10 Home)を使用している場合、WindowsにVirtualBoxとDocker Toolboxをインストールします。

Docker Toolboxの開発者は非推奨であるという事実にもかかわらず、その操作はDocker for Windowsとは少し異なります。

Docker Toolboxのインストールとともに、仮想マシンが作成されます。
VirtualBox自体では、自由にRAMとプロセッサコアを追加できます。

WindowsコンテナーとLinuxコンテナー


Docker for Windowsは、LinuxとWindowsバージョン間でコンテナー化を切り替える機能を提供します。

Windowsコンテナ化モードでは、Windowsアプリケーションのみを実行できます。
2018年5月の公式Docker Hubには、Windows用の画像13個しかありません。

Windowsコンテナ化を有効にしたら、必ず外部ネットワークを追加してください。

docker-compose.yml構成ファイルでは、次のようになります。

networks: default: external: name: nat 

フォルダーマウント機能


ファイルシステムイベントはマウントされたボリュームではスローされないため、inotify-toolsは機能しません。
eeeに感謝

プロジェクトを開発していて、ホームフォルダーの外部でdocker-composeを使用している場合は、いくつかの操作を行う必要があります。

Docker for Windowsを使用して新しいディスクをマウントするには、ローカルユーザーに共有フォルダーへのアクセスに使用するパスワードが必要です。

特徴は、コンテナ内にマウントされたドライブが、SMBプロトコルを介してリモートマシン//10.0.75.1/DISK_DRIVEの両方からマウントされることです。

Docker Toolboxの場合、ディスクはVirtualBox自体の[共有フォルダー]タブにマウントされます
ディスク「D」の例:



マウントされたファイルとフォルダーへのアクセス権


必要に応じて、ホストマシンからマウントされたすべてのファイルとフォルダーのアクセス許可は755(rwx rx rx)になり、変更することはできません。

ファイル内にプライベートSSHキーをマウントするとき、所有者のみに属する権利(600など)をマウントするときに、深刻な問題があります。

この場合、イメージの作成時にキーを生成するか、ホストマシンからssh-agentソケットをスローします。

ホストまたはボリュームからマウント


コンテナ内へのマウントはネットワークとSMBプロトコルを使用して行われるため、コンテナ内では、「D:\」ドライブがソース//10.0.75.1/Dからマウントされます
コンテナ内でボリュームを使用すると、ローカルドライブ/ dev / sda1をマウントするように表示され、作業速度に影響します。

簡単なテストを使用して、ファイルを通常のHDDにコピーすると、次の速度になることがわかりました。
種類読書記録
取り付け〜85 MB /秒〜50 MB /秒
ボリューム〜340 MB /秒〜220 MB /秒

この速度の違いは、RAM内のキャッシュを使用して、ボリューム内のデータがディスクに徐々にフラッシュされるためです。

GPTおよびMBRパーティショニング機能


この項目は、反論または確認情報のインターネットで見つけることができなかったため、真実ではありません。

ホストテーブルにMBRパーティションテーブルがある場合、MySQL / MariaDBのコンテナは次のエラーで失敗する可能性があります。
InnoDB:ファイル./ib_logfile101: 'aio write'はOSエラー122を返しました。操作を続行できません
デフォルトでは、 メロンデータベースでinnodb_use_native_aioパラメーターが有効になっています 。これは、非同期の入出力を担当し、オフにする必要があります。

この問題は、MacOSの一部のバージョンでも発生します。

Docker TooboxからWindows


主なルール:デスクトップの「Dockerクイックスタートターミナル」でショートカットを起動することから始めると、問題の80%が解決されます。

-環境変数の不足に問題があり、それはコマンドによって解決されます:

 eval $(docker-machine env default) 

-「docker:接続中のエラー」カテゴリの問題が引き続き発生する場合は、次を実行する必要があります。

 docker-machine env --shell cmd default @FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO @%i 

Dockerマシンの名前はデフォルトです。

Docker swarm


Docker for MacでもDocker for Windowsでもない-実行中のデーモンをクラスターのクライアント(swarmメンバー)として使用する方法はありません。
stychosに感謝

エンコードの問題


Docker Toolboxを使用して(Windows Dockerでは再現できませんでした)、docker-compose.ymlファイル内のロシア語のコメントがエラーにつながるという問題がありました。
 Traceback (most recent call last): File "docker-compose", line 6, in <module> File "compose\cli\main.py", line 71, in main File "compose\cli\main.py", line 124, in perform_command File "compose\cli\command.py", line 41, in project_from_options File "compose\cli\command.py", line 109, in get_project File "compose\config\config.py", line 283, in find File "compose\config\config.py", line 283, in <listcomp> File "compose\config\config.py", line 183, in from_filename File "compose\config\config.py", line 1434, in load_yaml File "site-packages\yaml\__init__.py", line 94, in safe_load File "site-packages\yaml\__init__.py", line 70, in load File "site-packages\yaml\loader.py", line 24, in __init__ File "site-packages\yaml\reader.py", line 85, in __init__ File "site-packages\yaml\reader.py", line 124, in determine_encoding File "site-packages\yaml\reader.py", line 178, in update_raw File "c:\projects\compose\venv\lib\encodings\cp1251.py", line 23, in decode UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 1702: character maps to <undefined> [4176] Failed to execute script docker-compose 


便利なリンク


Windows上のDocker Toolbox
Windows用のDocker
Docker実践ガイド

おわりに


WindowsシステムでDockerコンテナー化を使用する機能は、上記で説明した機能を除き、Linuxでの機能と変わりません。

記事では、Windowsを当然のように使用することで、コンテナーの速度が著しく遅いこととオーバーヘッドを意図的に言及しませんでした。

ご意見をお聞かせください。 改善を提案するか、私の間違いを指摘してください。

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


All Articles