docker-compose.yml
模板文件 (YAML 格式)来定义一组相关联的应用容器为一个项目(project)。有了Compose,我们就不需要再一个个组件去写一份Dockerfile,只需要将整体环境同一起来,写在一份docker-compose.yml文件即可使用Compose基本上是一个三步过程:
docker-compose.yml
以便它们可以在隔离的环境中一起运行。docker-compose up
Compose启动并运行您的整个应用程序。一个docker-compose.yml
看起来像这样:
version: '2.0'services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redisvolumes: logvolume01: {}
有关Compose
文件的更多信息,请参见 Compose
文件参考。
https://docs.docker.com/compose/compose-file
Compose
具有用于管理应用程序整个生命周期的命令:
docker-compose up
docker-compose up -d
docker-compose ps
docker-compose start
docker-compose stop # 关闭容器
docker-compose down # 关闭并移除容器
docker-compose logs
docker-compose down --volumes
两种最新的docker安装方式
运行以下命令以下载Docker Compose的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
file
使用官方github下载很慢,采用换源
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
file
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
查看版本:
docker-compose --version
file
udo pip install docker-compose
二进制包方式安装的,删除二进制文件即可
sudo rm /usr/local/bin/docker-compose
pip 安装的,则执行如下命令即可删除
sudo pip uninstall docker-compose
上面说到使用的三个步骤
这里构建一个运行在Docker Compose
上的简单Python Web
应用程序。该应用程序使用Flask
框架,并在Redis中维护一个计数器。尽管该示例使用Python
,但即使您不熟悉此处演示的概念,也应可以理解。
mkdir composetestcd composetest
file
app.py
的文件将以下内容粘贴
touch app.py
import timeimport redisfrom flask import Flaskapp = Flask(__name__)cache = redis.Redis(host='redis', port=6379)def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5)@app.route('/')def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count)
在此示例中,redis是应用程序网络上的redis容器的主机名。我们为Redis使用默认端口6379
requirements.txt
的文件内容如下:
touch requirements.txt
内容如下:
flaskredis
file
在此步骤中,编写一个构建Docker映像的Dockerfile。该图像包含Python应用程序所需的所有依赖关系,包括Python本身。
粘贴以下内容:
FROM python:3.7-alpineWORKDIR /codeENV FLASK_APP app.pyENV FLASK_RUN_HOST 0.0.0.0RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && apk add -U tzdata && ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo "${TIMEZONE}" > /etc/timezoneRUN apk add -U tzdata && ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo "${TIMEZONE}" > /etc/timezoneRUN apk add --no-cache gcc musl-dev linux-headersCOPY requirements.txt requirements.txtRUN pip install -r requirements.txtCOPY . .CMD ["flask", "run"]
在项目目录中创建一个名为docker-compose.yml
的文件,然后粘贴以下内容:
version: '3'services: web: build: . ports: - "5000:5000" redis: image: "redis:latest"
该Compose文件定义了两个服务:web
和redis
该web服务使用从Dockerfile当前目录中构建的映像。然后,它将容器和主机绑定到暴露的端口5000。此示例服务使用Flask Web服务器的默认端口5000。
该redis服务使用从Docker Hub注册表中提取的公共Redis映像,如果存在最新版则不拉取
注: compose 版本对应关系
https://docs.docker.com/compose/compose-file/compose-file-v2/
在项目目录中,运行来启动应用程序
docker-compose up
完成以后可以通过浏览器确认结果
打开浏览器输入: http://ip:5000/
应该在浏览器中看到一条消息,内容为:
Hello World! I have been seen 1 times.
file
通过docker-compose down
从第二个终端的项目目录中运行,或在启动该应用的原始终端中按CTRL + C来停止该应用
docker-compose.yml
文件将宿主机包含代码的目录挂载到服务,本质就是容器实例与宿主机共享文件。
内容如下:
version: '3'services: web: build: . ports: - "5000:5000" volumes: - .:/code environment: FLASK_ENV: development redis: image: "redis:latest"
volumes
将主机上的项目目录(当前目录)/code安装到容器内部,可以即时修改代码,而不必重建映像。该environment键设置了 FLASK_ENV环境变量,该变量指示flask run要在开发模式下运行并在更改时重新加载代码。此模式仅应在开发中使用。
在项目目录中,键入docker-compose up以使用更新的Compose文件构建应用程序,然后运行它
docker-compose up -d
file
查看进程
docker-compose ps
file
查看日志
docker-compose logs
file
查看单个服务日志
docker-compose logs web
file
再次打开浏览器输入: http://ip:5000/
Hello World再次出现,然后刷新以查看计数增量
file因为现在应用程序代码是使用卷安装到容器中的,所以您可以对其代码进行更改并立即查看更改,而无需重建映像。
更改问候语app.py
并保存。例如,将Hello World!
消息更改为Hello from Dong!
:
再次打开浏览器输入: http://ip:5000/
在浏览器中刷新应用。问候语应更新,并且计数器应仍在增加。
file参考链接:
http://suo.im/6xZyQshttp://suo.im/6qxxYv
往期推荐
?
Docker 入门到实战教程(一)介绍Docker Docker入门到实战教程(二)安装Docker Docker入门到实战教程(三)镜像和容器 Docker 入门到实战教程(四)容器链接 Docker 入门到实战教程(五)构建Docker镜像 Docker 入门到实战教程(六)Docker数据卷 Docker 入门到实战教程(七)安装Redis Docker 入门到实战教程(八)安装Mysql Docker 入门到实战教程(九)安装Nginx Docker入门到实战教程(十)部署Spring Boot项目 Docker入门到实战教程(十一)部署Vue+SpringBoot 前后端分离项目 Docker入门到实战教程(十二)ELK+Filebeat搭建日志分析系统