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以上が必要のようです。下記参照。
$ 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/
バージョンのアップデートを実行します。
本家サイトの手順通り、下記コマンドを実行
アップグレードした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の起動時エラー問題で停止中