Docker-compose チュートリアルのインストールとクイックスタート

Docker-compose チュートリアルのインストールとクイックスタート

このチュートリアルはUbuntuの最新のComposeバージョン3に基づいています。
参考: https://docs.docker.com/compose/overview/

1. Compose の紹介

Docker Compose は、複雑なアプリケーションを定義および実行するための Docker ツールです。 Docker コンテナを使用するアプリケーションは通常、複数のコンテナで構成されます。 Docker Compose を使用すると、コンテナを起動するためにシェル スクリプトを使用する必要がなくなります。

Compose は、構成ファイルを通じて複数の Docker コンテナを管理します。構成ファイルでは、すべてのコンテナがサービスを通じて定義され、その後、docker-compose スクリプトを使用して、アプリケーション、アプリケーション内のサービス、およびすべての依存サービスのコンテナを起動、停止、再起動します。これは、開発のために複数のコンテナを組み合わせるシナリオに非常に適しています。

2. ComposeとDockerの互換性

ファイル形式バージョンの作成Dockerバージョン
3.4 17.09.0以降
3.3 17.06.0以降
3.2 17.04.0以降
3.1 1.13.1以上
3.0 1.13.0以上
2.3 17.06.0以降
2.2 1.13.0以上
2.1 1.12.0以上
2.0 1.10.0以上
1.0 1.9.1.+

Docker バージョンの変更:

バージョン 1.13.x から、Docker は Enterprise Edition EE と Community Edition CE に分かれています。バージョン番号もタイムラインに従ってリリースされるように変更されています。たとえば、17.03 は 2017 年 3 月です。

Docker の Linux ディストリビューションのソフトウェア リポジトリが、従来の https://apt.dockerproject.org および https://yum.dockerproject.org から現在の https://download.docker.com に変更され、パッケージ名が docker-ce および docker-ee に変更されました。

3. Dockerをインストールする

Docker Community Edition は docker-ce と呼ばれます。 Docker パッケージの古いバージョンは、docker または docker-engine と呼ばれます。古いバージョンの docker がインストールされている場合は、まずそれをアンインストールしてから、新しいバージョンの docker をインストールする必要があります。 Docker は非常に急速に開発されており、apt リポジトリの更新が遅れることがよくあります。そのため、Docker公式サイトが推奨するインストール方法は、Dockerインストールスクリプトをダウンロードすることです。
古いバージョンをアンインストールします (インストールされていない場合は、この手順をスキップできます)。

$ sudo apt-get 削除 docker docker-engine docker.io

最新の Docker をインストールします。

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

シェルはsudoパスワードの入力を促し、最新のdockerプロセスの実行を開始します。

$ curl -sSL https://get.docker.com/ | sh 

Docker が成功し、最新の Docker であることを確認します。

$ sudo docker run hello-world

4. docker-composeをインストールする

最新のDockerインストール方法2つ

1. githubからdocker-composeバイナリファイルをダウンロードしてインストールします。

docker-composeファイルの最新バージョンをダウンロードします

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

githubへのアクセスが遅すぎる場合は、daocloudを使用してダウンロードできます

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

実行権限を追加する

sudo chmod +x /usr/local/bin/docker-compose

テストインストール結果

$ docker-compose --version
docker-compose バージョン 1.16.1、ビルド 1719ceb

2.pipのインストール

sudo pip で docker-compose をインストールします

5. Docker-compose ファイル構造と例

Docker-compose ファイル構造

docker-compose.yml:

バージョン: "3"
サービス:
 
 レディス:
  画像: redis:alpine
  ポート:
   - 「6379」
  ネットワーク:
   -フロントエンド
  展開する:
   レプリカ: 2
   アップデート構成:
    並列処理: 2
    遅延: 10秒
   再起動ポリシー:
    条件: 失敗時
 
 デシベル:
  画像: postgres:9.4
  ボリューム:
   -db-data:/var/lib/postgresql/data
  ネットワーク:
   - バックエンド
  展開する:
   配置:
    制約: [node.role == manager]
 
 投票する:
  イメージ: dockersamples/examplevotingapp_vote:before
  ポート:
   - 5000:80
  ネットワーク:
   -フロントエンド
  依存:
   - レディス
  展開する:
   レプリカ: 2
   アップデート構成:
    並列処理: 2
   再起動ポリシー:
    条件: 失敗時
 
 結果:
  イメージ: dockersamples/examplevotingapp_result:before
  ポート:
   - 5001:80
  ネットワーク:
   - バックエンド
  依存:
   -db
  展開する:
   レプリカ: 1
   アップデート構成:
    並列処理: 2
    遅延: 10秒
   再起動ポリシー:
    条件: 失敗時
 
 ワーカー:
  イメージ: dockersamples/examplevotingapp_worker
  ネットワーク:
   -フロントエンド
   - バックエンド
  展開する:
   モード: 複製
   レプリカ: 1
   ラベル: [APP=VOTING]
   再起動ポリシー:
    条件: 失敗時
    遅延: 10秒
    最大試行回数: 3
    ウィンドウ: 120秒
   配置:
    制約: [node.role == manager]
 
 ビジュアライザー:
  イメージ: dockersamples/visualizer:stable
  ポート:
   - 「8080:8080」
  停止猶予期間: 1分30秒
  ボリューム:
   - "/var/run/docker.sock:/var/run/docker.sock"
  展開する:
   配置:
    制約: [node.role == manager]
 
ネットワーク:
 フロントエンド:
 バックエンド:
 
ボリューム:
 dbデータ:

docker-compose の使用例

docker-compose を使用して、docker で実行される python flask フレームワークに基づく Web アプリケーションを構築します。

注: Docker Engine と Docker Compose がインストールされていることを確認してください。 Python と Redis は両方とも Docker イメージによって提供されるため、インストールする必要はありません。

ステップ1: Pythonアプリケーションを定義する

1. プロジェクトディレクトリを作成する

$ mkdir compose_test
$ cd compose_test
$ mkdir src # ソースコードフォルダ $ mkdir docker # docker設定フォルダ

ディレクトリ構造は次のとおりです。

└── compose_test
  ├── ドッカー
  │ └── docker-compose.yml
  ├── Dockerファイル
  └── 出典
    ├── app.py
    └── 要件.txt

2. compose_test/src/ ディレクトリに、python flask アプリケーション compose_test/src/app.py ファイルを作成します。

FlaskからFlaskをインポート
RedisからRedisをインポート
 
アプリ = Flask(__name__)
redis = Redis(ホスト='redis'、ポート=6379)
 
@app.route('/')
デフハロー():
  count = redis.incr('ヒット数')
  'Hello World! {} 回表示されました。\n' を返します。format(count)
 
__name__ == "__main__" の場合:
  app.run(ホスト="0.0.0.0", デバッグ=True)

3. Python要件ファイルcompose_test/src/requirements.txtを作成する

フラスコ
レディス

ステップ2: コンテナ用のDockerfileを作成する

1 つのコンテナ、1 つの Dockerfile ファイル。compose_test/ ディレクトリに Dockerfile ファイルを作成します。

Python:3.7 から
 
コピー src/ /opt/src
ワークディレクトリ /opt/src
 
pip install -r requirements.txt を実行します。
コマンド ["python", "app.py"]

Dockerfile は Docker に次の情報を伝えます。

Python 3.6 イメージからコンテナ イメージを構築します。

src ディレクトリ (compose_test/src) をコンテナの /opt/src ディレクトリにコピーします。

コンテナの作業ディレクトリを /opt/src ( docker exec -it your_docker_container_id_or_name bash 経由でコンテナに入った後のデフォルト ディレクトリ) に設定します。
Python の依存関係をインストールします。
コンテナのデフォルトコマンドを python app.py に設定します。

ステップ3: docker-composeスクリプトを定義する

compose_test/docker/ ディレクトリに docker-compose.yml ファイルを作成し、その中にサービスを定義します。内容は次のとおりです。

バージョン: '3'
サービス:
 ウェブ:
  建てる: ../
  ポート:
   - 「5000:5000」
 レディス:
  イメージ: "redis:3.0.7"

この Compose ファイルは、Web コンテナーと Redis コンテナーという 2 つのサービスを定義します。
Web コンテナ:
* 現在の docker-compose.yml ファイル (compose_test/Dockerfile) の親ディレクトリにある Dockerfile を使用してイメージをビルドします。
* コンテナ上の公開ポート 5000 をホスト上のポート 5000 にマップします。 Flask Web サーバーのデフォルト ポート 5000 を使用します。
redis コンテナ:
* redis サービスは、Docker Hub から取得した公式の redis イメージ バージョン 3.0.7 を使用します。

ステップ 4: Compose を使用してアプリケーションをビルドして実行する

compose_test/docker/ ディレクトリ内の docker-compose.yml ファイルを実行します。

$ docker-compose を起動します
# バックグラウンドで実行したい場合: $ docker-compose up -d
# デフォルトの docker-compose.yml ファイル名を使用しない場合:
$ docker-compose -f server.yml アップ -d 

次に、ブラウザに http://0.0.0.0:5000/ と入力して、実行中のアプリケーションを表示します。

ステップ5: 作成ファイルを編集してファイルバインドマウントを追加する

上記のコードはビルド時にコンテナに静的にコピーされます。つまり、物理ホストのソースコードは Dockerfile ファイルの COPY src /opt/src コマンドを通じてコン​​テナにコピーされるため、物理ホストの src ディレクトリ内のコードに対するその後の変更はコンテナに反映されません。
物理ホスト ディレクトリをコンテナーにマウントする機能は、volumes キーワードを通じて実現できます (同時に、Dockerfile 内の COPY 命令が削除され、イメージを作成するときにコードをイメージにパッケージ化する必要がなくなります。代わりに、ボリュームを通じて動的にマウントされ、コンテナーと物理ホストがデータ ボリュームを共有します)。

バージョン: '3'
サービス:
 ウェブ:
  建てる: ../
  ポート:
   - 「5000:5000」
  ボリューム:
   - ../src:/opt/src
 レディス:
  イメージ: "redis:3.0.7"

ホスト上のプロジェクト ディレクトリ (compose_test/src) をボリューム経由でコンテナー内の /opt/src ディレクトリにマウントすると、イメージを再構築せずにコードをその場で変更できます。

ステップ6: アプリケーションを再構築して実行する

更新された Compose ファイルを使用してアプリケーションをビルドし、実行します。

$ docker-compose アップ -d

6. 共通サービス構成リファレンスを作成する

Compose ファイルは、サービス、ネットワーク、ボリュームを定義する YAML ファイルです。 Compose ファイルのデフォルトのファイル名は docker-compose.yml です。

**ヒント: このファイルには、.yml または .yaml 拡張子のいずれかを使用できます。 それらはすべて機能します。

docker run と同様に、デフォルトでは、Dockerfile で指定されたオプション (例: CMD 、 EXPOSE 、 VOLUME 、 ENV ) が尊重されるため、 docker-compose.yml で再度指定する必要はありません。

Bash のような ${VARIABLE} 構文を使用して、設定値に環境変数を使用することもできます。詳細については、変数の置換を参照してください。

このセクションには、バージョン 3 のサービス定義でサポートされるすべての構成オプションが含まれています。

建てる

build はビルド コンテキストを含むパスを指定できます。

バージョン: '2'
サービス:
 ウェブアプリ:
  ビルド: ./dir

または、コンテキスト パスと指定された Dockerfile および args 値を持つオブジェクトとして:

バージョン: '2'
サービス:
 ウェブアプリ:
  建てる:
   コンテキスト: ./dir
   dockerfile: Dockerfile 代替
   引数:
    ビルド番号: 1

webapp サービスは、./dir ディレクトリ内の Dockerfile-alternate ファイルを使用してコンテナ イメージを構築します。
image と build の両方を指定した場合、compose は build で指定されたディレクトリを通じてコン​​テナ イメージをビルドし、ビルドされたイメージ名は image で指定されたイメージ名とタグになります。

ビルド: ./dir
イメージ: webapp:タグ

これにより、./dir から webapp という名前のイメージが構築され、 tag がタグ付けされます。

コンテクスト

Dockerfile を含むディレクトリへのパス、または git リポジトリの URL。
指定された値が相対パスの場合、現在の Compose ファイルの場所を基準とした相対パスとして解釈されます。 このディレクトリは、イメージをビルドするときに Docker デーモンに送信されるコンテキストでもあります。

Dockerファイル

代替 Docker ファイル。 Compose はフォールバック ファイルを使用してビルドします。 ビルド パスも指定する必要があります。

引数

イメージをビルドするためのパラメータを追加します。環境変数はビルド プロセス中にのみアクセスできます。
まず、Dockerfile で使用するパラメータを指定します。

ARGビルド番号
ARGパスワード
 
RUN echo "ビルド番号: $buildno"
script-requiring-password.sh "$password" を実行します。

次に、args キーの下に引数を指定します。 マッピングまたはリストを渡すことができます。

建てる:
 コンテクスト: 。
 引数:
  ビルド番号: 1
  パスワード: secret
 
建てる:
 コンテクスト: 。
 引数:
  -ビルド番号=1
  - パスワード=秘密

** 注意: YAML ブール値 (true、false、yes、no、on、off) は、パーサーが文字列として解釈できるように引用符で囲む必要があります。

画像

コンテナを起動するイメージを指定します。イメージリポジトリ/タグまたはイメージ ID (または ID の最初の部分) を指定できます。

画像: redis
イメージ: ubuntu:14.04
画像: tutum/influxdb
イメージ: example-registry.com:4000/postgresql
画像: a4bc65fd

イメージが存在しない場合は、ビルドも指定すると、Compose は公式イメージ レジストリからイメージを取得しようとします。その場合、指定されたビルド オプションを使用してイメージがビルドされ、イメージで指定された名前とタグが付けられます。

コンテナ名

生成されたデフォルト名の代わりにカスタム コンテナー名を指定します。

コンテナ名: my-web-container

Docker コンテナ名は一意である必要があるため、カスタム名を指定すると、サービスを複数のコンテナに拡張することはできません。

ボリューム

ボリュームマウントパスの設定。ホスト パス (HOST:CONTAINER) を設定したり、アクセス モード (HOST:CONTAINER:ro) を追加したりできます。データ ボリュームをマウントするためのデフォルトの権限は読み取り/書き込み (rw) ですが、ro によって読み取り専用として指定できます。
ホスト上に相対パスをマウントすることができます。これは、現在使用中の Compose 構成ファイルのディレクトリを基準にして展開されます。 相対パスは常に . または .. で始まる必要があります。

ボリューム:
 # パスを指定してエンジンにボリュームを作成させるだけです - /var/lib/mysql
 # 絶対パスマッピングを指定 - /opt/data:/var/lib/mysql
 
 # 現在の作成ファイルへの相対パス - ./cache:/tmp/cache
 
 #ユーザーのホームディレクトリの相対パス - ~/configs:/etc/configs/:ro
 
 # 名前付きボリューム - datavolume:/var/lib/mysql

ただし、マウントされたボリュームを複数のサービス間で再利用する場合は、最上位のボリューム キーワードでマウントされたボリュームに名前を付けますが、これは必須ではありません。次の例にもマウントされたボリュームを再利用する機能がありますが、推奨されません。

バージョン: "3"
 
サービス:
 ウェブ1:
  ビルド: ./web/
  ボリューム:
   - ../code:/opt/web/code
 ウェブ2:
  ビルド: ./web/
  ボリューム:
   - ../code:/opt/web/code

** 注意: 最上位レベルのボリュームを介してマウント ボリュームを定義し、各サービスのボリューム リストからそれを参照すると、Compose ファイル形式の以前のバージョンの volumes_from が置き換えられます。

バージョン: "3"
 
サービス:
 デシベル:
  画像: db
  ボリューム:
   - データボリューム:/var/lib/db
 バックアップ:
  画像: バックアップサービス
  ボリューム:
   - データボリューム:/var/lib/backup/data
 
ボリューム:
 データ量:

指示

コンテナの起動時に実行されるデフォルトのコマンドをオーバーライドします。

コマンド: bundle exec thin -p 3000

コマンドは Dockerfile に似たリストにすることもできます。

コマンド: ["bundle", "exec", "thin", "-p", "3000"]

リンク

別のサービス内のコンテナにリンクします。 サービス名とリンク エイリアス (SERVICE:ALIAS) の両方を指定するか、サービス名のみを指定してください。

ウェブ:
 リンク:
  -db
  -db:データベース
  - レディス

現在の Web サービス コンテナーでは、リンクされた db サービス エイリアス データベースを介して、db コンテナー内のデータベース アプリケーションにアクセスできます。エイリアスが指定されていない場合は、サービス名を直接使用してアクセスできます。

リンクでは、通信するためにサービスを有効にする必要はありません。デフォルトでは、どのサービスもそのサービスの名前で他のサービスにアクセスできます。 (実際には、コンテナ間の通信は/etc/hostsのドメイン名解決を設定することで実現されます。そのため、1つのネットワークで複数のサービスコンテナをルーティングして接続できれば、アプリケーションでlocalhostを使用するのと同じように、サービスエイリアスを使用して他のコンテナのサービスにリンクできます)

リンクは、depends_on と同様の役割を果たすこともできます。つまり、サービス間の依存関係を定義し、サービスが開始される順序を決定します。

外部リンク

docker-compose.yml の外部のコンテナ(Compose によって管理されていないコンテナも含む)にリンクします。パラメータの形式はリンクに似ています。

外部リンク:
 - レディス1
 - プロジェクトdb_1:mysql
 - プロジェクトdb_1:postgresql

さらす

ポートは公開されていますが、ホスト マシンにマップされておらず、接続されたサービスにのみアクセスできます。
パラメータとして指定できるのは内部ポートのみです

さらす:
 - 「3000」
 - 「8000」

ポート

ポート情報を公開します。
よく使用される単純な形式: ホスト: コンテナ (HOST:CONTAINER) 形式を使用するか、コンテナのポートを指定するだけ (ホストがランダムにポートを選択します) はすべて OK です。

** 注意: HOST:CONTAINER 形式を使用してポートをマッピングする場合、使用するコンテナ ポートが 60 未満の場合、YAML は xx:yy の数値形式を 60 進数として解析するため、誤った結果が返される可能性があります。したがって、文字列形式を使用することをお勧めします。

シンプルな短縮形:

ポート:
 - 「3000」
 - 「3000-3005」
 - 「8000:8000」
 - 「9090-9091:8080-8081」
 - 「49100:22」
 - 「127.0.0.1:8001:8001」
 - 「127.0.0.1:5000-5010:5000-5010」
 - 「6060:6060/udp」

v3.2 のポートの長い形式の構文では、短い形式では表現できない追加のフィールドを構成できます。
長い形式:

ポート:
 - 目標: 80
  公開: 8080
  プロトコル: tcp
  モード: ホスト

ターゲット: コンテナ内のポート
公開: 物理ホストのポート
プロトコル: ポート プロトコル (tcp または udp)
モード: ホストとイングレスの 2 つの一般的なモード。ホストは各ノードのホスト ポートを公開するために使用され、イングレスは負荷分散されたスウォーム モード ポートに使用されます。

再起動

「いいえ」はデフォルトの再起動ポリシーであり、いかなる状況でもコンテナは再起動されません。 always が指定されている場合、コンテナは常に再起動されます。 on-failure は、終了コードが失敗エラーを示している場合にコンテナを再起動します。

再起動: 「いいえ」
再起動: 常に
再起動: 失敗時
再起動: 停止しない限り

環境

環境変数を追加します。 配列または辞書のいずれかを使用できます。 ブール値(true、false、yes、no)は、YML パーサーによって True または False に変換されないように引用符で囲む必要があります。
名前が付けられた変数は Compose ホスト上で自動的に値を取得するため、不要なデータの漏洩を防ぐことができます。

環境:
 RACK_ENV: 開発
 表示: 'true'
 セッションシークレット:
 
環境:
 - RACK_ENV=開発
 - 表示=true
 -セッションシークレット

** 注意: サービスでビルド オプションが指定されている場合、ビルド プロセス中に環境を通じて定義された環境変数は機能しません。 ビルド引数サブオプションは、ビルド時の環境変数を定義するために使用されます。

ピッド
PID モードをホスト PID モードに設定します。 これにより、コンテナとホスト オペレーティング システム間で共有 PID アドレス空間が開かれます。 このフラグで起動されたコンテナは、ベアメタルの名前空間内の他のコンテナにアクセスして操作できるようになります。また、その逆も同様です。つまり、このオプションがオンになっているコンテナは、プロセス ID を介して相互にアクセスし、操作することができます。

pid: 「ホスト」

ドメイン名
DNS サーバーを構成します。単一の値またはリストを指定できます。

ドメイン名: 8.8.8.8
ドメイン名:
 - 8.8.8.8
 - 9.9.9.9

docker-compose チュートリアルのインストールとクイックスタートに関するこの記事はこれで終わりです。docker-compose のインストールと使用方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker および Docker-compose のワンクリック インストール チュートリアル (オンラインとオフラインをサポート)
  • さまざまな環境での Docker Compose のインストール方法
  • docker-composeをインストールする最も簡単な方法2つ
  • docker と docker-compose のインストールの詳細な例
  • Docker-composeのインストールと設定の詳細な手順
  • docker-compose で Jenkins をインストールする際の実践的なメモ

<<:  three.js を使用してクールなアシッドスタイルの 3D ページ効果を実現します

>>:  CSS3 で背景の透明化と不透明テキストを実装するサンプルコード

推薦する

InnoDB ロック (レコード、ギャップ、Next-Key ロック) の詳細な説明

レコード ロックは、単一のインデックス レコードをロックします。レコード ロックは常にインデックスを...

フロントエンド開発に必要な共通ツール機能のまとめ

1. 時刻の書式設定とその他の方法moment.jsライブラリファイルの使用をお勧めします2. テン...

JavaScriptのプリミティブ値とラッパーオブジェクトの詳細な紹介

目次序文文章プリミティブ型プリミティブ値ラッパーオブジェクト物体コンストラクタ通常機能(関数)プリミ...

VueRouterルーティングの詳細な説明

目次vueルーター1. ルーティングの概念を理解する1.1 ルーティングとは何ですか? 1.2. バ...

js の getBoundingClientRect() メソッドの詳細な説明

1. getBoundingClientRect() 分析getBoundingClientRect...

Vueは宮殿のグリッド回転抽選を実現します

Vueは宮殿グリッド回転抽選(CrossFireのxx転生に似ている)を実装しています。参考までに、...

CSS 要素で計算されたスタイルを取得します (カスケード/最終スタイル後)

CSS 要素内の計算されたスタイル (つまり、カスケード後の最終的なスタイル) を取得するには、W3...

ファイアウォールルールの設定とコマンド(ホワイトリスト設定)の詳しい説明

1. ファイアウォールルールを設定する例1: ポート8080を外部に公開する ファイアウォールコマン...

Ubuntu で G++ を使用して CPP ファイルをコンパイルする

g++ を使用して初めて cpp ファイルをコンパイルしたとき、未定義の参照エラーが報告されました。...

CSSスコープ(スタイル分割)の使用の概要

1. CSSスコープの使用(スタイル分割) Vue では、CSS スタイルを現在のコンポーネントでの...

CSS 使用のヒントのまとめ

最近、ブログのアップグレードを始めました。テンプレートを変更する過程で、CSS スタイルシートを書き...

ドメイン名を介してプロジェクトにアクセスするnginx + tomcatの例

ドメイン名を使ってプロジェクトにアクセスする方法が気になったのですが、自分でドメイン名を取得するのは...

Nofollowはコメントやメッセージ内のリンクを本当に機能させる

コメントとメッセージはもともと、ウェブマスターがコミュニティと読者層を構築するための優れた手段でした...

MySql 8.0.16 バージョンのインストールでは、「UTF8B3」ではなく「UTF8B4」が使用されるように求められます。

MySQL 8.0.16 にインストールする場合、「UTF8B3」ではなく「UTF8B4」が使用さ...

Centos Docker ブリッジ モードでホスト Redis サービスにアクセスできないというトラブルシューティングの経験

背景:以前、コンテナ内のホストが提供する Redis サービスにアクセスする必要があるプロジェクトを...