前回の続きでChromeOSにDockerをインストールしてみたので公式のドキュメントを見ながら学んで見たいと思います。
【関連エントリ】
今回はPart3の部分になります。(本当はPart4まで進めたかったが)
ただ、読みすすめるとわかると思いますが、うまくいきません。
原因は未だにわからないのですが、同じPCで別のOS(Ubuntu、Debian、CentOSのそれぞれUSB起動のLive版で確認)では起動できているのでChromeOS
ならではの問題かと思います。
Get Started, Part 3: Services
ここではService
に関して学ぶことになります。
事前準備
事前準備としてはDockerのインストールは当然のことながらPart1とPart2を行ってきた環境(コンテナ)があることが必要です。
加えてDocker Compose
のインストールが必要になります。Mac用のDockerデスクトップとWindows用のDockerデスクトップにはプレインストールされていますが、Linux系は別途インストールする必要があります。以下のサイトを参考にインストールを行います。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
【インストールログ】
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 0 617 0 0 859 0 --:--:-- --:--:-- --:--:-- 858 100 11.2M 100 11.2M 0 0 2250k 0 0:00:05 0:00:05 --:--:-- 2910k $ sudo chmod +x /usr/local/bin/docker-compose $ docker-compose --version docker-compose version 1.23.2, build 1110ad01
また、Part2で作成したfriendlyhelloイメージをレジストリにpushして公開することが必須になります。(ここではその共有イメージを使います。)
以下のようにDockerのイメージを実行し、http://localhost:8080/
という感じでアクセスできることは確認しておいてください
※原文は4000ポートを使用していますがChromeOSではアクセスがNGなので8080に変更してありますので注意です。
【一般形】
$ docker run -p 8080:80 username/repo:tag
【前回の例で以下のように動作していました(ここでいうhoge
は各自のユーザ名に変更してください)】
$ docker run -p 8080:80 hoge/get-started:part2
サービスとは?
このPartではアプリケーションを拡張し負荷分散を行います。そのために分散アプリケーションの階層を1レベル上に上げ、サービスという概念が必要になります。
階層的にはこんな感じ
- Stack
- Services (←いまここ)
- Container (part2(前回)でやった部分)
分散アプリケーションはサービスという概念で構成されていて、例えばビデオ共有サイトでは、データベースサービス、ビデオをトランスコーディングするサービス、フロントエンド用のサービスから構成されているようなイメージになります。
サービスはコンテナから構成されます。その設定でイメージの実行方法、使用するポート、コンテナのレプリカをいくつ実行する必要があるかなどの体系化を行う必要があります。これらの設定を行う場合にはdocker-compose.yml
を記述することでこれらの定義、実行、拡張することが可能になります。
docker-compose.yml
を書いてみる
docker-compose.yml
でコンテナの動作を設定してみます。
以下に記載してymlファイルdocker-compose.yml
として作成します。
このとき、Part2で作成したイメージをレジストリにpushしていることを確認して、自分の作成した
username/repo:tag
をイメージの詳細に置き換えてこの.yml
を更新します。
以下の例ではhoge/get-started:part2
として設定しています。またポートも4000から8080へ変更しています。
【変更前(原文のまま)】
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "4000:80" networks: - webnet networks: webnet:
【今回の変更後】
version: "3" services: web: # replace username/repo:tag with your name and image details image: hoge/get-started:part2 deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "8080:80" networks: - webnet networks: webnet:
このdocker-compose.yml
では次のような動きを記述しています。
- Part2で作成したイメージをリポジトリから取得。
- 取得したイメージから5つのインスタンスを生成して、webと呼ばれるサービスとして名づけます。それぞれに対してCPU資源は10%、50MBのRAMを割当て。
- コンテナでエラーがあった場合には再起動。
- webサービスの各インスタンスの80ポートはローカルホストからは8080ポート経由からアクセス可能。(オリジナルの記述は4000ポート)
- webnetと呼ばれる負荷分散ネットワークを生成し、ポート80を共有するようにwebのコンテナに指示します。 (内部的にはコンテナ自体が一時ポートでwebのポート80に発行)
- webnetネットワークをデフォルト設定(負荷分散オーバーレイネットワーク)で定義。
負荷分散ネットワークアプリの起動
まずは以下のコマンドを起動します。コマンドの意味はPart4で説明がありますが、これを実行しないとエラーが発生します。
$ docker swarm init
つづいて以下のように実行します。この実行ではアプリはgetstartedlab
と設定しています。
$ docker stack deploy -c docker-compose.yml getstartedlab
【ログ】
$ docker swarm init Swarm initialized: current node (lj9h2t6lfbifgh9xs3ade0d5g) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-15hfgnp2gthm9vvlu3sk7l628c8q8dthz639bpv3f1ziqogx6w-1djxiz46bjblng15l3qhno4cq 100.115.92.198:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. $ docker stack deploy -c docker-compose.yml getstartedlab Creating network getstartedlab_webnet Creating service getstartedlab_web
サービスでは5つのコンテナを起動しているのでそれを確認します。確認方法は以下のようになります。
$ docker service ls
【ログ】
$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS padrydlvz757 getstartedlab_web replicated 0/5 hoge/get-started:part2 *:4000->80/tcp
おや?0/5ってなってる…起動できていない…いつまでたってもこの状態…
サービス内で実行されているコンテナはタスクと呼ばれます。タスクには、docker-compose.ymlで定義したレプリカの数まで、数値が増加する固有のIDが与えられます。 ってことなんですが、起動と再起動を繰り返しているっぽい。
$ docker service ps getstartedlab_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS so2dl24jsz9g getstartedlab_web.1 hoge/get-started:part2 penguin Ready Assigned 3 seconds ago zl2amqebzsaq \_ getstartedlab_web.1 hoge/get-started:part2 penguin Shutdown Failed 5 seconds ago "starting container failed: fa…" 8ok1l8k9t5qc \_ getstartedlab_web.1 hoge/get-started:part2 penguin Shutdown Rejected 41 seconds ago "error creating external conne…" miejmm2yf3r6 \_ getstartedlab_web.1 hoge/get-started:part2 penguin Shutdown Rejected about a minute ago "error creating external conne…" tlhz1mzxkw4g \_ getstartedlab_web.1 hoge/get-started:part2 penguin Shutdown Failed about a minute ago "starting container failed: fa…" t0a3hi9trnev getstartedlab_web.2 hoge/get-started:part2 penguin Ready Assigned 3 seconds ago ajg4c4ws13f7 \_ getstartedlab_web.2 hoge/get-started:part2 penguin Shutdown Failed 5 seconds ago "starting container failed: fa…" klph7llfrxzd \_ getstartedlab_web.2 hoge/get-started:part2 penguin Shutdown Failed 33 seconds ago "starting container failed: fa…" lxb65skkypfp \_ getstartedlab_web.2 hoge/get-started:part2 penguin Shutd
コンテナ数を変更しても、Dockerfileを編集して構成を変えてもだめ。ChromeOS
ではこれ以降はうまくできないようです。(2019.03.18現在)
Swarm系の動作はダメなんでしょうか…
現状進めることはできないので、とりあえず以下のコマンドで終了させます。
$ docker stack rm getstartedlab $ docker swarm leave --force
挫折してみて…
原因はまだよくわかっていませんが、本来の目的はDocker
を学ぶことなので放置します。
ChromeOSに関してはやっぱり通常のLinuxとは違うのでしょうか。sshなターミナルマシンとしてはいい感じなんですけどなー
次はOSをUbuntu18.04 LTSのUSB Live版に変更して継続していこうと思います。 もう一回同じPartから進めていこうと思います。