Dockerをゼロから学ぶ

Dockerをゼロから学ぶ

[編集者注] Dockerはオープンソース化されて以来、大手企業から幅広い注目を集めています。おそらく今では、インターネット企業は、自社の運用・保守システムが Docker (または Pouch など) に基づいていない場合、自らをインターネット企業と呼ぶことを恥ずかしく思うでしょう。

この記事では、Docker の基本的な概念、初歩的な使用方法、Docker を使用すると効率が大幅に向上するシナリオについて簡単に紹介します。

原理

Docker に関する最も単純で、やや誤った理解は、「Docker は非常に優れたパフォーマンスを備えた仮想マシンである」というものです。

上で述べたように、これは多少誤った発言です。 Docker は従来の仮想マシン技術よりもはるかに高度です。具体的には、Docker はホスト マシン上のハードウェア セットを仮想化してからオペレーティング システムを仮想化することはありません。代わりに、Docker コンテナ内のプロセスをホスト マシン上で直接実行できるようになります (Docker はファイル、ネットワークなどを分離します)。このようにして、Docker は「より軽量になり、より高速に実行され、同じホスト マシン上でより多くのインスタンスを作成できるようになります。」

Docker には、イメージ、コンテナ、リポジトリという 3 つの主要な概念があります。

  • イメージ: 「善人カード」を取得する傾向があるプログラマーは、イメージの概念に精通している必要があります。しかし、Windows の ISO イメージと比較すると、Docker のイメージは、単純に積み重ねられた一連のファイルではなく、階層化され、再利用可能です (圧縮されたソース コード パッケージと Git リポジトリの違いに似ています)。
  • コンテナ:コンテナの存在は、イメージのサポートと切り離せません。実行時にイメージを運ぶものです (インスタンスとクラスの関係に似ています)。 Docker の仮想化技術を利用して、コンテナ用にポート、プロセス、ファイルなどの独立した「スペース」が作成されます。コンテナは、ホストマシンから分離された「コンテナ」です。コンテナは、ポート、ボリューム、ネットワークなどを介してホストと通信できます。
  • リポジトリ: Docker のリポジトリは Git のリポジトリに似ており、リポジトリ名とタグがあります。ローカルでイメージをビルドした後、ウェアハウスを通じてイメージを配布できます。よく使用される Docker ハブには、https://hub.docker.com/、https://cr.console.aliyun.com/ などがあります。

関連コマンド

1. インストール

Dockerのインストールは非常に便利です。 macOS、Ubuntu などにはワンクリックインストールツールまたはスクリプトがあります。詳細については、公式の Docker チュートリアルを参照してください。

インストール後、ターミナルに docker と入力します。使用方法の説明が表示されれば、ほとんどの場合インストールは成功していることになります。

2. ベースイメージを見つける

DockerHub などの Web サイトでは多くの画像が提供されています。通常は、そこからベースイメージとして画像を見つけて、その後の操作を続行します。

ここでは、Ubuntu ベースイメージを例にしてノード環境を構成します。

「リンクが長すぎる」ため、Docker Hubへの国内アクセスが遅くなる可能性があります。多くの国内メーカーが提供する画像アクセラレータが使用可能です。

3. ベースイメージを取得する

docker pull コマンドを使用して、関連するハブ Web サイトからローカル コンピューターにイメージをプルします。同時に、プル処理中に、画像が複数の「レイヤー」に従ってプルされていることがわかります。

  1. >docker pull ubuntu:18.04
  2.  
  3. 18.04: library/ubuntuから取得
  4. c448d9b1e62f: プル完了
  5. 0277fe36251d: プル完了
  6. 6591defe1cd9: プル完了
  7. 2c321da2a3ae: プル完了
  8. 08d8a7c0ac3c: プル完了
  9. ダイジェスト: sha256:2152a8e6c0d13634c14aef08b6cc74cbc0ad10e4293e53d2118550a52f3064d1
  10. ステータス: ubuntu:18.04新しいイメージをダウンロードしました

すべてのローカルイメージを表示するには、docker images を実行します。

  1. > Docker イメージ
  2. リポジトリ タグ イメージ ID 作成サイズ 
  3. ubuntu 18.04 58c12a55082a 44 時間前

4. Dockerコンテナを作成する

docker create コマンドは、イメージからコンテナを作成し、コンテナ ID を出力します。

  1. > docker作成  --name ubuntuContainer ubuntu:18.04  
  2. 0da83bc6515ea1df100c32cccaddc070199b72263663437b8fe424aadccf4778

コンテナを実行するには、docker start を使用します。

  1. > docker ubuntuコンテナを起動します

実行中のコンテナを表示するには、docker ps を使用します。

  1. >ドッカーps
  2. コンテナID イメージ コマンド 作成ステータス ポート名
  3. 9298a27262da ubuntu:18.04 "/bin/bash" 4分前 上へ

docker exec を使用してコンテナに入ります。

  1. >docker exec -it 9298
  2. ルート@9298a27262da:/# ls
  3. bin boot dev etc home lib lib64 media mnt opt ​​proc root run sbin srv sys tmp usr var
  4. root@9298a27262da:/# 終了

docker run を使用して、コンテナを 1 つのステップで作成して実行し、コンテナに入ります。

  1. > docker run -it --name runUbuntuContainer ubuntu:18.04 /bin/bash  
  2. ルート@57cdd61d4383:/# ls
  3. bin boot dev etc home lib lib64 media mnt opt ​​proc root run sbin srv sys tmp usr var
  4. ルート@57cdd61d4383:/#
  5. docker psはrunUbuntuContainerが正常に実行されたことを確認できます
  6. >ドッカーps
  7. コンテナID イメージ コマンド 作成ステータス ポート名
  8. 57cdd61d4383 ubuntu:18.04 "/bin/bash" 9秒前 8秒前 runUbuntuContainer
  9. 9298a27262da ubuntu:18.04 "/bin/bash" 9 分前 6 件目

5. コンテナにNode環境をインストールする

コンテナに入った後の操作は通常の環境と同じです。シンプルなノード環境をインストールします。

  1. >apt-getアップデート 
  2. >apt-get をインストール wget
  3. > wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh |バッシュ
  4. インストール後、現在のセッションでは nvm コマンドを読み取れない可能性があります。終了してからターミナル環境に入ることができます
  5. > nvm 8.0.0 をインストール
  6. > ノード -v

6. コンテナをコミットして新しいイメージを作成する

Ghost を使用して Windows をインストールするのと同じように、多くの場合、独自のイメージをカスタマイズし、その中にいくつかの基本環境 (上記のノードなど) をインストールして、必要な基本イメージを作成したいと考えています。ここで docker commit が役に立ちます。

  1. >dockerコミット  --author "rccoder" --message "curl+node" 9298 rccoder/myworkspace:v1  
  2. sha256:68e83119eefa0bfdc8e523ab4d16c8cf76770dbb08bad1e32af1c872735e6f71
  3. dockerイメージを通して、新しく作成されたrccoder/myworkspaceがここにあるのがわかります。
  4. >Dockerイメージ
  5. リポジトリ タグ イメージ ID 作成サイズ 
  6. rccoder/myworkspace v1 e0d73563fae8 20秒前 196MB

次に、新しく作成した画像を試してみましょう。

  1. > docker run -it --name newWorkSpace rccoder/myworkspace:v1 /bin/bash  
  2. ルート@9109f6985735:/# ノード -v
  3. 8.0.0

大丈夫そうですね。

7. イメージをDocker Hubにプッシュする

画像が作成されたので、それを他の人とどのように共有しますか?ここでは、Docker Hub にプッシュする例を取り上げます。

最初のステップは、docker hub にアカウントを登録し、ターミナルでそのアカウントにログインしてプッシュすることです。

  1. >dockerログイン
  2. > docker push rccoder/myworkspace:v1
  3. プッシュはリポジトリ [docker.io/rccoder/myworkspace]参照します。
  4. c0913fec0e19: プッシュ中 [=> ] 2.783MB/116.7MB
  5. bb1eed35aacf: library/ubuntuからマウント
  6. 5fc1dce434ba: library/ubuntuからマウント
  7. c4f90a44515b: library/ubuntuからマウントされました
  8. a792400561d8: library/ubuntuからマウント
  9. 6a4e481d02df: 待機中

8. Dockerfileを使う時が来た

継続的インテグレーションに Docker を使用していますか? Docker について知る前にこれを聞いたことがあるはずですが、これはどこかからコードをコピーして実行する必要があることを意味します (はい、少し travis-ci に似ています)。

Dockerfile の時間です!

Dockerfile は、一連のコマンドとパラメータで構成されるスクリプトです。 docker build を使用してスクリプトを実行し、イメージをビルドして自動的に何かを実行します (travis-ci の .travis.yml に似ています)。

Dockerfile の形式は次のとおりです。

  1. # コメント
  2. 命令引数

ベースイメージは、FROM BASE_IMAGE から指定する必要があります。

より詳細な仕様と手順については、Dockerfile リファレンスを参照してください。ここでは、上記の rccoder/myworkspace:v1 をベースイメージとして、例としてルートディレクトリにディレクトリを作成します。

Dockerfile は次のとおりです。

  1. rccoder/myworkspace:v1から
  2. mkdir aを実行する

次に以下を実行します:

  1. > docker build -t newfiledocker:v1 。
  2. ビルドコンテキストを Docker デーモン送信3.584kB
  3. ステップ 1/2: rccoder/myworkspace:v1から
  4. ---> 68e83119eefa  
  5. ステップ2/2: mkdir aを実行する
  6. ---> 1127aff5fbd3 で実行中 
  7. 中間コンテナ 1127aff5fbd3 を削除
  8. ---> 25a8a5418af0  
  9. 25a8a5418af0 の構築に成功しました
  10. newfiledocker:v1 のタグ付けに成功しました
  11. newfiledocker に基づいて新しいコンテナを作成し、ターミナルで開きます。そこにはすでにフォルダ a が存在していることがわかります。
  12. > docker docker run -it newfiledocker:v1 /bin/bash
  13. ルート@e3bd8ca19ffc:/# ls
  14. a bin boot dev etc home lib lib64 media mnt opt ​​proc root run sbin srv

Dockerfile の力により、Docker には無限の可能性が残されています。

何ができるか

ここまで述べてきましたが、実際の運用環境で Docker は何ができるのでしょうか?よく使われるものは以下のとおりです(コメントに追加してください)

1. 複数環境の展開切り替え

ビジネス開発においては、開発環境とオンライン環境を区別する必要があることがよくあります。 Docker を使用すると、開発環境のコードと環境をそのまま汚染なくオンライン環境に移行できます。特定の自動化プロセスと組み合わせることで、自動リリースを実現できます。

2. フロントエンドクラウド構築

node_modules の厄介な問題により、同じリポジトリで開発している複数の人が、異なるパッケージ バージョンを使用している複数の人に遭遇することが多く、他の人と異なるバージョンを使用していることに気付かないこともあり、最終的にはリリース後にオンラインの問題が発生します。 Docker を使用すると、クラウド内に新しいコンテナを作成し、汚染なく低コストでリモートでコードをビルドし、さまざまな人が同じバージョンを使用することを保証できます。

3. 複雑な環境でもワンクリックで設定

シナリオによっては、非常に複雑な環境を構成する必要がある場合があります (たとえば、新入生は Java 環境を構成する必要があります)。この場合、Docker を使用して環境構成をカプセル化し、低コストで誰でも使用できるイメージを直接生成できます。

4. 継続的インテグレーションユニットテスト

travis-ciに似ている

5. 同じアプリケーションの複数のバージョンとファイルの分離

たとえば、このプロジェクトはノード 6 に依存し、そのプロジェクトはノード 8 に依存します (これは単なる例であり、ハード ディスクが十分に大きい場合は、nodeinstall を使用して解決することをお勧めします)。 100 個の WordPress プログラムが同じサーバー上で実行されています (相互汚染を防ぐために Docker を使用して分離を確立できます)。

6. お金を節約する

まあ、低コストの安全性が売られ過ぎです(霧)。

<<:  Office 365の中国でのビジネスは商用利用開始4年目で400%以上成長

>>:  米財務省はアリババに対し、米国内でのクラウドコンピューティングサービスの提供を禁止する可能性がある。

推薦する

ウェブサイトのプロモーションをより効果的にするために、さまざまなものを活用する

皆さんは、このことわざを聞いたことがあると思います。「車と馬を借りた者は、足は速くないが、千里を行く...

Amazon クラウド サービス AWS Marketplace がエンタープライズ ソフトウェア SaaS の道を「再形成」

最近、著名な分析機関 Forrester が新たに発表した「Forrester New Wave™:...

キーワードSEOフォーラムで2位にランクインした私の経験を共有します

私は実に感動しています。SEO インタラクティブ フォーラムの成功体験を皆さんと共有したいと長い間思...

ジャイアントネットワークがshenghuo.comというドメイン名を58万元で購入したと報じられている。

eName.cnは4月15日、昨年ドメイン名投資家のAbu氏が海外から買い戻した「life」ドメイン...

年次概要: 生鮮食品電子商取引の現在の主流のゲームプレイと潜在的な爆発ポイント

2013年の12月が静かに到来し、あっという間に今年も残り1ヶ月となりました。今年は、生鮮食品の電子...

結局UCは売却され、于永福は約束を破った

記者の張暁斌が北京からレポートします于永福は抜け目のない男だ。アリババは長い間基盤となってきたが、于...

微信トラフィックビジネスのジレンマと張小龍の「岐路」

テクノロジーとインターネット界の最高の「トークプレイヤー」である羅永浩が語った最高のジョークは、これ...

piayun: 618 中間 VPS 大割引、米国 (3 つのネットワーク) cn2 gia、香港 pure cn、深セン BGP、20% オフ + 再チャージ 20% 以上

ピアユンは普段はプロモーションを行っていないと言われているが、顧客層の招待により、618年半ばのプロ...

急成長を遂げているクラウドコンピューティング業界において、上流産業が最も繁栄しているのはなぜでしょうか?

流行の影響により、リモートワーク、オンライン教育、オンラインゲームなどのインターネットアプリケーショ...

当局は、いかなる組織や個人も福祉宝くじをオンラインで販売する権限はないと述べた。

民政部のウェブサイトによると、中国福祉宝くじ発行管理センターは本日、いかなる団体や個人にも福祉宝くじ...

カンボジア VPS クラウド サーバー: estnoc、中国に直接接続されたカンボジア、月額 12 ユーロ、512M メモリ/1 コア/10gSSD/250G トラフィック

カンボジアのインターネット管理は比較的緩やかで、対外貿易ウェブサイトやその他のビジネスを運営するため...

seovipトレーニングの第3フェーズを通じて、ウェブサイトの運用とメンテナンスの最適化に関する3つの新しい洞察

この記事を書いているのは、メーデー前の最後の勤務日になるはずです。まずは、一生懸命働いているウェブマ...

JVM の詳細な分析: JVM はリフレクションをどのように実装しますか?

[[422686]]リフレクションは Java 言語の非常に重要な機能であり、実行中の Java プ...

ブロググループ構築のいくつかの方法

数年前、ブログ グループを構築する SEO 手法が導入され、多くの支持者がいます。いわゆるブロググル...