[Docker] 安装和配置 Docker Compose
首先
Raspberry Pi3 安装 Docker 并进行游戏的第三篇文章。如果您对上两篇文章感兴趣,可以点击链接参考。
这次是关于使用Docker Compose进行环境构建的问题。
工作环境
-
- Rasppberry Pi3
Ubuntu MATE 16.04.5 LTS ( GNU/Linux 4.4.38-v7+ armv7l )
Docker CE ( 18.06.0~ce~3-0~ubuntu )
Docker Compose v1.23.0dev
Python v3.6.6
Flask v1.0.2
预备工作
和上次一样,事先删除Docker镜像作为准备工作。
使用Docker Compose进行环境管理
在介绍Docker Compose之前,先简要介绍一下Docker Compose所管理的环境。
Dockerfile的释义是只需要一个版本:
与上一次的那个条目相同。
# ベースイメージとして python v3.6 を使用する
FROM python:3.6
# 以降の RUN, CMD コマンドで使われる作業ディレクトリを指定する
WORKDIR /app
# カレントディレクトリにある資産をコンテナ上の 「/app」 ディレクトリにコピーする
ADD . /app
# 「 requirements.txt 」にリストされたパッケージをインストールする
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Docker に対して「 80 番ポート 」で待受けするよう指定する
EXPOSE 80
# Docker イメージ中の環境変数を指定する
ENV NAME World
# コンテナが起動したときに実行される命令を指定する
# ここでは後述の 「app.py 」を実行するよう指示している
CMD ["python", "app.py"]
需求文本
与上次不同的是,这次我想使用 Redis,所以我进行了追加。
Flask
Redis
app.py的意思是Python文件中的主要应用程序文件。
这次也不同于上次,加入了与Redis相关的代码。
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Redis に接続
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
Docker Compose: Docker组合
使用Dockerfile可以使环境配置的工作变得相当轻松,但使用Docker Compose会更加方便。
具体来说,通过在YAML文件中管理所需的Docker容器组的配置,可以通过Docker Compose自动化每个容器的安装、配置和启动。
安装
Docker Compose的安装步骤我是根据这里的Linux选项进行参考的,但是这里列出的命令。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
执行该命令,docker-compose不会被安装。
原因是由于uname -m命令,当单独执行时,结果为armv7l,但是在Docker Compose的GitHub上没有符合该架构的发布资产。
当然 Raspbery Pi3 安装 Docker Compose 需要采取另一种方法,但已经有人解决了这个问题。
- Raspberry Pi用docker-composeの構築
参考了这个指南进行了操作,顺利完成了安装。
确认版本时,发现
$ docker-compose version
docker-compose version 1.23.0dev, build 901ee4e
docker-py version: 3.5.0
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.0.1t 3 May 2016
然后,现在准备好使用 Docker Compose。
- 注意
根据上述参考文章进行安装后,执行官方的安装步骤会覆盖 docker-compose 命令的路径,导致无法使用。
因此,建议在按照参考文章的步骤安装 Docker Compose 后,不要执行官方的安装步骤,这样比较稳妥。
创建Compose文件
为了在Docker Compose中进行自动化,需要使用YAML文件(默认文件名为docker-compose.yml)来管理容器的各项设置。本文将创建以下Compose文件来进行Docker容器的管理。
version: '3'
services:
web:
build: .
ports:
- "4000:80"
volumes:
- .:/app
redis:
image: "redis:alpine"
解释
文件名和每个属性的说明如下。
-
- ファイル名
docker-compose.yml(デフォルトファイル名)
version プロパティ
version: ‘3’ とすることで swarm mode に対応という意味になる
swarm mode についてはクラスタとかの概念の話になってくるのでここでは触れない
service プロパティ
この Compose file で起動するコンテナとして web と redis の 2つを扱う
web サービス
build プロパティ
この docker-compose.yml と同階層にある Dockerfile をもとにビルドして作成する
ports プロパティ
ホストの 4000 番ポートとコンテナの 80 番ポートを紐づける( ホストの 4000 番ポートにアクセスされたらコンテナの 80 番ポートにフォワードする )
volumes プロパティ
カレントディレクトリをコンテナの /app ディレクトリとして定義する
redis サービス
image プロパティ
Docker Hub registry から redis のコンテナイメージを取得する
备考
-
- 本記事で扱っている Docker のバージョンは 18.06.0 なので、こちらのリファレンス から、対応する Compose file のバージョンは 3.7 となる
-
- Compose file で設定できる内容については本家のリファレンスを見るのが間違いがないので、より踏み込んだ内容を知りたい方は下記を参照されたい
-
- Compose file のリファレンス
Compose file version 3 reference
使用Docker Compose启动容器
通过执行下面的命令启动容器。
$ docker-compose up -d
.... # 以下、実行結果が出力
在这里指定“-d”的意思是在容器中以后台方式启动。
因此,在执行上述命令时,Docker Compose将根据本地环境的情况完成各个处理步骤。
换句话说,如果没有基础镜像,它会从获取基础镜像开始,直到启动容器;或者如果镜像已经构建完毕,则只会启动容器。
确认容器已启动。
执行 docker-compose up 后查看 Docker 镜像和容器的状态,
Docker イメージ
Dockerイメージの確認
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world-compose_web latest 8ef63657034d 50 seconds ago 747MB
redis alpine 722b119bf4f2 3 weeks ago 15.1MB
python 3.6 a91b1909dbdd 4 weeks ago 736MB
Python、redis そして今回の作成対象である hello-world-compose のイメージが作成されていること。
そして
Docker コンテナ
Dockerコンテナの確認
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7c2585c80c5 hello-world-compose_web “python app.py” About a minute ago Up About a minute 0.0.0.0:4000->80/tcp hello-world-compose_web_1
00dbb2060311 redis:alpine “docker-entrypoint.s…” About a minute ago Up About a minute 6379/tcp hello-world-compose_redis_1
redis と hello-world-compose_web のコンテナが起動していることがわかる。
对Web应用的访问
由于之前已经启动了容器,所以最后将访问Web应用程序的结果放在下面。
通过浏览器访问“主机的IP地址:4000”得到如下结果。
访问时会输出访问次数,但这是在前面的app.py文件中实现的。
# 省略
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
# 省略
的
visits = redis.incr("counter")
由于 Redis 容器已启动,因此 try 块正常评估。
使用Docker Compose停止服务。
只有使用这个命令是无法停止 Docker 容器的,已经启动的服务可以通过以下命令停止。
$ docker-compose stop
总结
-
- Dockerfile から更に簡単に環境構築するために Docker Compose を使うと便利
なんせ Dockerfile を使ってのイメージのビルドや Docker Hub からのイメージのダウンロードをやってくれる
更にコンテナの起動まで行ってくれる
Compose file の作成 で swarm mode という単語が出てきた
これに触れるとクラスタとかの話になって Swarm とか Kubernetes が出てくる
が、まだそちらは触ってもいないので、今はそこまでするつもりはない
更に言うと Swarm も Kubernetes もどちらも Docker がネイティブサポートしているということで、どっちを学習するのが良いのか…
両方知っているのが良いのだろうけれど、それは必要になったらでいいかな
请参考
-
- Overview of Docker Compose
-
- Get started with Docker Compose
-
- Compose file version 3 reference
- Raspberry Pi用docker-composeの構築