Windows10(WSL) でDocker / Kubernetes コンテナ開発の自学自習 | Docker / Kubernetes 実践コンテナ開発入門(2.Dockerコンテナのデプロイ)

記事一覧(目次)

>>次の記事

<<前の記事

この記事は、「Docker/Kubernetes 実践コンテナ開発入門」の書籍を見ながら実践しています。実際の開発に即した内容となっており良書でした。

2.Dockerコンテナのデプロイ

本格的に画面上の操作が始まるので、あらかじめサンプルソースをダウンロードしてきます。

サンプルソースのURLは、書籍「Docker / Kubernetes 実践コンテナ開発入門」の目次 xi ページに記載があります。

 

Gitフォルダへコピーして、シンボリックリンクを貼っておく

 

2.1 コンテナでアプリケーションを実行する

ch02_1_2フォルダへ移動し、ファイルの中身を確認する。

 

main.go

package main

import (
        "fmt"
        "log"
        "net/http"
)

func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
                log.Println("received request")
                fmt.Fprintf(w, "Hello Docker!!")
        })

        log.Println("start server")
        server := &http.Server{Addr: ":8080"}
        if err := server.ListenAndServe(); err != nil {
                log.Println(err)
        }
}

 

Dockerfile

FROM golang:1.9

RUN mkdir /echo
COPY main.go /echo

CMD ["go", "run", "/echo/main.go"]

 

インストラクションの説明

Dockerfileを記述するためのDSL(ドメイン固有言語)

  • FROM:最初にダウンロードするDockerイメージを指定(例:Go言語のver 1.9)
  • RUN:Dockerイメージビルド時に実行されるコマンド(複数記載が可能)
  • COPY:ホストマシン上のファイルを、Dockerコンテナ内へコピー
    • ADD:コンテナ内にコピーしたアーカイブをファイルシステム上に展開する
  • CMD:コンテナ内で起動するプロセスを指定。コンテナ起動時に1度だけ実行

Dockerイメージのビルド

先ほどのDockerfileで指定したコマンドが、StepX/Xとして実行されて行っています。

  • docker image build -t <イメージ名> <dockerfile格納フォルダパス></dockerfile格納フォルダパス>
$ docker image build -t example/echo:latest .
Sending build context to Docker daemon 4.096 kB
Step 1/4 : FROM golang:1.9
1.9: Pulling from library/golang
55cbf04beb70: Pull complete
1607093a898c: Pull complete
9a8ea045c926: Pull complete
d4eee24d4dac: Pull complete
9c35c9787a2f: Pull complete
8b376bbb244f: Pull complete
0d4eafcc732a: Pull complete
186b06a99029: Pull complete
Digest: sha256:8b5968585131604a92af02f5690713efadf029cc8dad53f79280b87a80eb1354
Status: Downloaded newer image for golang:1.9
 ---> ef89ef5c42a9
Step 2/4 : RUN mkdir /echo
 ---> Running in 2e341972a6cf
 ---> c5ca63624486
Removing intermediate container 2e341972a6cf
Step 3/4 : COPY main.go /echo
 ---> 392841662d6a
Removing intermediate container 24b90a699eb5
Step 4/4 : CMD go run /echo/main.go
 ---> Running in af1af9d23369
 ---> d2b9c7fc6e57
Removing intermediate container af1af9d23369
Successfully built d2b9c7fc6e57

作成されたDockerイメージの確認

下記コマンドで確認

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
example/echo        latest              d2b9c7fc6e57        2 minutes ago       750 MB
golang              1.9                 ef89ef5c42a9        5 months ago        750 MB

Dockerコンテナの実行

Dockerを起動

$ docker container run example/echo:latest
2018/12/24 01:23:20 start server

アクセスしてみると接続に失敗。

どうやら、「ポートフォワーディング」が必要のよう。

  • ポートフォワーディング:Docker内で指定したポートと、ホストマシンのポートを紐づける
$ curl http://localhost:8080/
curl: (7) Failed to connect to localhost port 8080: Connection refused

Dockerコンテナの停止

$ docker container stop $(docker container ls --filter "ancestor=example/echo" -q)
7114af423fb0

Dockerコンテナの実行(ポートフォワーディング)

Dockerをポートフォワーディング「-p {ホスト側ポート番号}:{コンテナ側ポート番号}」を指定して起動

$ docker container run -d -p 9000:8080 example/echo:latest
71a6ab8bf9a7c7053e3f1ddd3ff08a4ba66978094e521d33b289db696b2f7dc1

アクセス

$ curl http://localhost:9000/
Hello Docker!!

ポート番号が紐づけられています。

$ docker container ls
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
71a6ab8bf9a7        example/echo:latest   "go run /echo/main.go"   3 minutes ago       Up 2 minutes        0.0.0.0:9000->8080/tcp   xenodochial_booth

 

2.2 Dockerイメージの操作

Dockerコマンドは、大きく2つに大別される。

  • イメージに対するコマンド:docker image ~
  • コンテナに対するコマンド:docker container ~

オブジェクト指向プログラミングでいうと、以下の対比イメージ?間違ってたらごめんなさい。

  • イメージ:クラス
  • コンテナ:インスタンス

Dockerイメージへのコマンドまとめ

  • docker image build -t <イメージ名>[:タグ名] [オプション] <dockerfile格納パス></dockerfile格納パス>
    • Dockerfileをもとにイメージを作成する
    • -t:ほぼ必須。イメージ名を指定
    • -f:「Dockerfile」以外のファイル名を使う場合
    • –pull=true:FROMで指定するベースイメージの強制再取得
  • docker search [オプション] <検索キーワード>
    • Docker Hubから既存のイメージを検索し、STARの降順に表示
    • –limit 5:取得件数を指定(例では5件)
  • docker image pull [オプション] リポジトリ名[:タグ名]
    • DockerリポジトリからDockerイメージをダウンロードする
  • docker image ls [オプション] [リポジトリ[:タグ名]]
    • コマンドを実行したホスト環境のイメージを一覧で表示
    • docker image build / docker image pull の両方が対象
  • docker image tag 元イメージ名[:タグ名] 新イメージ名[:タグ名] 
    • Dockerイメージにイメージ:タグ名を付与する
    • Dockerのバージョンとは、イメージIDのこと
    • イメージIDはハッシュ値(バージョン管理システムでいうコミットIDみたいなの)
    • ハッシュ値に、わかりやすい名前を付けることが「タグ名」をつけること
    • タグ名を指定しなければ、最新のイメージ名に、latestがつく
  • docker image push [オプション] リポジトリ名[:タグ名]
    • 手元のDockerイメージを、Docker Hubへアップロードする
    • Docker Hubへの登録は、アカウントが必要
    • Pushする前に、事前にログイン処理が完了していること
    • 機密情報は含めないこと

2.3 Dockerコンテナの操作

  • Dockerコンテナは、Dockerイメージをもとに作成される
  • Dockerコンテナは仮想環境
  • Dockerコンテナはファイルシステムとアプリケーションが同梱される

Dockerコンテナのライフサイクル

Dockerイメージと違い、Dockerコンテナは1つ1つが実行状態をもつ

  • 実行中:CMD/ENTRYPOINTで定義されているアプリケーションが動いている状態
  • 停止:上記の実行が正常/異常で終了したか、ユーザが停止させた状態
  • 破棄:コンテナを破棄する。一度破棄したコンテナは元に戻せない。

Dockerコンテナへのコマンドまとめ

  • docker container run [オプション] <イメージ名> [コマンド] [コマンド引数]
    • Dockerイメージをもとにコンテナの実行を行う
    • -d:バックグラウンド実行
    • -p:ポートフォワーディングの指定。 {ホスト側ポート番号}:{コンテナ側ポート番号}
    • –name:開発中、いちいちdocker container lsを実行せずにコマンド再実行するために使用
  • docker container ls [オプション]
    • 実行/停止しているコンテナの一覧を表示する
    • -q:コンテナIDだけを抽出(コンテナIDは利用頻度高)
    • -a:停止しているコンテナの一覧を表示
    • –filter:特定条件で抽出したいときに指定
      • コンテナ名前:–filter “name=echo01”
      • イメージ:–filter “ancestor=example/echo”
  • docker container stop <コンテナ名/イメージID>
    • 実行しているコンテナを終了する
  • docker container restart <コンテナ名/イメージID>
    • 一時停止いしているコンテナを再実行する
  • docker container rm <コンテナ名/イメージID>
    • コンテナを破棄する
    • -f:実行中のコンテナを強制破棄
  • docker container logs
    • 実行中のコンテナが標準出力した情報を表示
    • -f:標準出力を表示し続ける(tails -f のようなの)
  • docker container exec [オプション] <コンテナ名/イメージID>
    • コンテナ内でコマンドを実行する(コンテナ内を修正可→本番環境利用はNG)
    • -i:標準入力を開いたままにする
    • -t:仮想ターミナルを割り当てる
      • -it:まとめて指定可能
  • docker container cp
    • 実行中のコンテナ内に、コンテナ間/コンテナ-ホスト間でファイルをコピーする

2.4 運用管理向けコマンド

  • docker container prune [オプション] 
    • コンテナの一括削除
  • docker image prune [オプション] 
    • イメージの一括削除
  • docker system prune
    • コンテナ、イメージ、ネットワーク、ボリュームなどを一括削除
  • docker container stats [オプション] <コンテナ名/イメージID>
    • コンテナ単位でのシステム利用状況を表示

2.5 Docker Composeでマルチコンテナを実行する

  • Dockerコンテナは、単一のアプリケーション/ミドルウェア
  • システムは複数のアプリケーション/ミドルウェアから構成される
  • コンテナとコンテナを連動させる際には注意が必要
    • コンテナの挙動を設定する設定ファイル/環境変数
    • ポートフォワーディング

docker-composeがない場合はインストール

sudo apt install docker-compose

[sudo]

password for : Reading package lists… Done Building dependency tree Reading state information… Done The following package was automatically installed and is no longer required: libfreetype6 Use ‘sudo apt autoremove’ to remove it. The following additional packages will be installed: libpython-stdlib libpython2.7-minimal libpython2.7-stdlib python python-backports.ssl-match-hostname python-cached-property python-cffi-backend python-chardet python-cryptography python-docker python-dockerpty python-docopt python-enum34 python-funcsigs python-functools32 python-idna python-ipaddress python-jsonschema python-minimal python-mock python-ndg-httpsclient python-openssl python-pbr python-pkg-resources python-pyasn1 python-requests python-six python-texttable python-urllib3 python-websocket python-yaml python2.7 python2.7-minimal Suggested packages: python-doc python-tk python-cryptography-doc python-cryptography-vectors python-enum34-doc python-funcsigs-doc python-mock-doc python-openssl-doc python-openssl-dbg python-setuptools doc-base python-ntlm python2.7-doc binutils binfmt-support The following NEW packages will be installed: docker-compose libpython-stdlib libpython2.7-minimal libpython2.7-stdlib python python-backports.ssl-match-hostname python-cached-property python-cffi-backend python-chardet python-cryptography python-docker python-dockerpty python-docopt python-enum34 python-funcsigs python-functools32 python-idna python-ipaddress python-jsonschema python-minimal python-mock python-ndg-httpsclient python-openssl python-pbr python-pkg-resources python-pyasn1 python-requests python-six python-texttable python-urllib3 python-websocket python-yaml python2.7 python2.7-minimal 0 upgraded, 34 newly installed, 0 to remove and 0 not upgraded. Need to get 5,318 kB of archives. After this operation, 24.0 MB of additional disk space will be used. Do you want to continue? [Y/n] Y Get:1 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libpython2.7-minimal amd64 2.7.12-1ubuntu0~16.04.4 [339 kB] Get:2 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python2.7-minimal amd64 2.7.12-1ubuntu0~16.04.4 [1,261 kB] Get:3 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python-minimal amd64 2.7.12-1~16.04 [28.1 kB] Get:4 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libpython2.7-stdlib amd64 2.7.12-1ubuntu0~16.04.4 [1,880 kB] Get:5 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python2.7 amd64 2.7.12-1ubuntu0~16.04.4 [224 kB] Get:6 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libpython-stdlib amd64 2.7.12-1~16.04 [7,768 B] Get:7 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python amd64 2.7.12-1~16.04 [137 kB] Get:8 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-pkg-resources all 20.7.0-1 [108 kB] Get:9 http://archive.ubuntu.com/ubuntu xenial/universe amd64 python-cached-property all 1.3.0-1 [6,976 B] Setting up python-six (1.10.0-3) … Setting up python-urllib3 (1.13.1-2ubuntu0.16.04.2) … Setting up python-chardet (2.3.0-2) … Setting up python-requests (2.9.1-3ubuntu0.1) … Setting up python-backports.ssl-match-hostname (3.4.0.2-1) … Setting up python-websocket (0.18.0-2) … Setting up python-ipaddress (1.0.16-1) … Setting up python-docker (1.9.0-1~16.04.1) … Setting up python-dockerpty (0.4.1-1~16.04.1) … Setting up python-docopt (0.6.2-1build1) … Setting up python-enum34 (1.1.2-1) … Setting up python-functools32 (3.2.3.2-2) … Setting up python-funcsigs (0.4-2) … Setting up python-pbr (1.8.0-4ubuntu1) … update-alternatives: using /usr/bin/python2-pbr to provide /usr/bin/pbr (pbr) in auto mode Setting up python-mock (1.3.0-2.1ubuntu1) … Setting up python-jsonschema (2.5.1-4) … update-alternatives: using /usr/bin/python2-jsonschema to provide /usr/bin/jsonschema (jsonschema) in auto mode Setting up python-texttable (0.8.1-1) … Setting up python-yaml (3.11-3build1) … Setting up docker-compose (1.8.0-2~16.04.1) … Setting up python-cffi-backend (1.5.2-1ubuntu1) … Setting up python-idna (2.0-3) … Setting up python-pyasn1 (0.1.9-1) … Setting up python-cryptography (1.2.3-1ubuntu0.2) … Setting up python-openssl (0.15.1-2ubuntu0.2) … Setting up python-ndg-httpsclient (0.4.0-3) …

docker-composeがインストールできたか確認

$docker-compose version
docker-compose version 1.8.0, build unknown
docker-py version: 1.9.0
CPython version: 2.7.12
OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016

バージョンが表示されており、インストールOK

実際に、docker-composeでコンテナの起動をやってみる。サンプルソースのch02_5_1へ移動する。

$ ls
ch02_1_2  ch02_1_2_column_entrypoint  ch02_1_2_column_others  ch02_2_1  ch02_5_1  ch02_6_1

$cd ch02_5_1/

docker-compose.ymlの内容を確認

$ cat docker-compose.yml
version: "3"
services:
  echo:
    image: example/echo:latest
    ports:
    - 9000:8080

実行すると以下のエラーが発生。どうやらdocker-composeに記載したversion:3は、

docker-composeのバージョン1.13.0以上が必要のようです。下記参照。

https://github.com/10up/wp-local-docker/issues/58
$ docker-compose up -d
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a version of "2" (or "2.0") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

バージョンのアップデートを実行します。

https://docs.docker.com/compose/install/#install-compose

本家サイトの手順通り、下記コマンドを実行

アップグレードしたdocker-composeのバージョンを確認するも、バージョンが変わっていない。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

[sudo]

password for : % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 0 617 0 0 97 0 –:–:– 0:00:06 –:–:– 97 100 11.1M 100 11.1M 0 0 309k 0 0:00:37 0:00:37 –:–:– 544k ch02_5_1$ docker-compose version docker-compose version 1.8.0, build unknown docker-py version: 1.9.0 CPython version: 2.7.12 OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016

自分が使っているdocker-composeのパスを確認。

先ほどのコマンドでは/usr/local/binにインストールしていたが、

私の環境では、/usr/binの下のdocker-composeが実行されている。

そのため、インストール先を変更して、再実行。

ch02_5_1$ which docker-compose
/usr/bin/docker-compose
ch02_5_1$ /usr/local/bin/docker-compose -version
-bash: /usr/local/bin/docker-compose: Permission denied
ch02_5_1$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617    0   617    0     0    484      0 --:--:--  0:00:01 --:--:--   484

再度、バージョンを確認し、バージョンアップできていることを確認

/ch02_5_1$ docker-compose version
docker-compose version 1.23.1, build b02f1306
docker-py version: 3.5.0
CPython version: 3.6.7
OpenSSL version: OpenSSL 1.1.0f  25 May 2017

あらためて、docker-composeを実行

$ docker-compose up -d
Creating network "ch02_5_1_default" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable NAT rule:  (iptables failed: iptables --wait -t nat -I POSTROUTING -s 172.18.0.0/16 ! -o br-9f0f8de3eef4 -j MASQUERADE: iptables: Invalid argument. Run `dmesg' for more information.
 (exit status 1))

※上記エラーについては、WSLの問題のため、今時点では解決は難しいみたいです。

2.6 Composeによる複数コンテナの実行

※docker-composeの起動時エラー問題で停止中

記事一覧(目次)

>>次の記事

<<前の記事

About: ken


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください