Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。功能上和OpenStack中的Heat十分类似,前身是开源项目Fig。本文主要介绍Docker Compose的概念、安装、卸载及使用指南等。
一、Docker Compose概述
Compose定位是 “定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)”,其前身是开源项目Fig,代码目前在https://github.com/docker/compose上开源。使用一个Dockerfile模板文件可以让用户很方便的定义一个单独的应用容器。在日常工作中经常会碰到需要多个容器相互配合来完成某项任务的情况。
例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Compose恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose中有两个重要的概念:
1、服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
2、项目 (project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。
- Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理;
- Compose项目由Python编写,实现上调用了Docker服务提供的API来对容器进行管理。因此只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
二、Docker Compose V2概述
目前Docker官方用GO语言重写了Docker Compose,并将其作为了docker cli的子命令,称为 Compose V2。可以参照官方文档安装,然后将熟悉的docker-compose命令替换为docker compose,即可使用Docker Compose。
三、Docker Compose安装与卸载
Compose支持Linux、macOS、Windows 10三大平台。可以通过Python的包管理工具pip进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在Docker容器中运行。
Docker Desktop for Mac/Windows自带docker-compose二进制文件,安装Docker之后可以直接使用。
$ docker-compose --version docker-compose version 1.27.4, build 40524192
Linux系统请使用以下介绍的方法安装。
1、二进制包
在Linux上的也安装十分简单,从官方GitHub Release处直接下载编译好的二进制文件即可。例如在Linux 64位系统上直接下载对应的二进制包。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # 国内用户可以使用以下方式加快下载 $sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
2、PIP安装
注: x86_64架构的Linux建议按照上边的方法下载二进制包进行安装,如果计算机的架构是ARM (例如,树莓派),再使用pip安装。这种方式是将Compose当作一个Python应用来从pip源中安装。安装命令如下:
$ sudo pip install -U docker-compose
可以看到类似如下输出,说明安装成功:
Collecting docker-compose Downloading docker-compose-1.27.4.tar.gz (149kB): 149kB downloaded ... Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
3、bash补全命令
$ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
4、卸载
如果是二进制包方式安装的,删除二进制文件即可。
$ sudo rm /usr/local/bin/docker-compose
如果是通过pip安装的,则执行如下命令即可删除。
$ sudo pip uninstall docker-compose
四、使用Docker Compose
1、术语
- 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例;
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元;
可见一个项目可以由多个服务(容器)关联而成,Compose面向项目进行管理。
2、场景
最常见的项目是web网站,该项目应该包含web应用和缓存;
下面我们用Python来建立一个能够记录页面访问次数的web网站。
3、web应用
新建文件夹,在该目录中编写app.py文件:
from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) @app.route('/') def hello(): count = redis.incr('hits') return 'Hello World! 该页面已被访问 {} 次。\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
4、Dockerfile
编写Dockerfile文件,内容为:
FROM python:3.6-alpine ADD . /code WORKDIR /code RUN pip install redis flask CMD ["python", "app.py"]
5、docker-compose.yml
编写docker-compose.yml文件,这个是Compose使用的主模板文件。
version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
6、运行compose项目
$ docker-compose up
此时访问本地5000端口,每次刷新页面,计数就会加1。
五、实战Django
现在将使用Docker Compose配置并运行一个Django/PostgreSQL应用。在一切工作开始前,需要先编辑好三个必要的文件。
1、因为应用将要运行在一个满足所有环境依赖的Docker容器里面,那么我们可以通过编辑Dockerfile文件来指定Docker容器要安装内容。内容如下:
FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/
以上内容指定应用将使用安装了Python以及必要依赖包的镜像。
2、在 requirements.txt 文件里面写明需要安装的具体依赖包名。
Django>=2.0,<3.0 psycopg2>=2.7,<3.0
3、docker-compose.yml文件将把所有的东西关联起来。它描述了应用的构成(一个web服务和一个数据库)、使用的Docker镜像、镜像之间的连接、挂载到容器的卷,以及服务开放的端口。
version: "3" services: db: image: postgres environment: POSTGRES_PASSWORD: 'postgres' web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000"
现在我们就可以使用docker-compose run命令启动一个Django应用了。
$ docker-compose run web django-admin startproject django_example .
由于 web 服务所使用的镜像并不存在,所以Compose会首先使用Dockerfile为web服务构建一个镜像,接着使用这个镜像在容器里运行django-admin startproject django_example指令。
这将在当前目录生成一个Django应用:
$ ls Dockerfile docker-compose.yml django_example manage.py requirements.txt
如果你的系统是Linux,记得更改文件权限。
$ sudo chown -R $USER:$USER .
首先,我们要为应用设置好数据库的连接信息。用以下内容替换django_example/settings.py文件中DATABASES = …定义的节点内容。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'HOST': 'db', 'PORT': 5432, 'PASSWORD': 'postgres', } }
这些信息是在postgres镜像固定设置好的。然后,运行docker-compose up:
$ docker-compose up django_db_1 is up-to-date Creating django_web_1 ... Creating django_web_1 ... done Attaching to django_db_1, django_web_1 db_1 | The files belonging to this database system will be owned by user "postgres". db_1 | This user must also own the server process. db_1 | db_1 | The database cluster will be initialized with locale "en_US.utf8". db_1 | The default database encoding has accordingly been set to "UTF8". db_1 | The default text search configuration will be set to "english". web_1 | Performing system checks... web_1 | web_1 | System check identified no issues (0 silenced). web_1 | web_1 | November 23, 2017 - 06:21:19 web_1 | Django version 1.11.7, using settings 'django_example.settings' web_1 | Starting development server at http://0.0.0.0:8000/ web_1 | Quit the server with CONTROL-C.
这个Django应用已经开始在你的Docker守护进程里监听着8000端口了。打开127.0.0.1:8000即可看到Django欢迎页面。
还可以在Docker上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完docker-compose up后,在另外一个终端进入文件夹运行以下命令即可:
$ docker-compose run web python manage.py syncdb
六、实战Rails
我们现在将使用Compose配置并运行一个Rails/PostgreSQL应用。
在一切工作开始前,需要先设置好三个必要的文件。首先,因为应用将要运行在一个满足所有环境依赖的Docker容器里面,那么我们可以通过编辑Dockerfile文件来指定Docker容器要安装内容。内容如下:
FROM ruby RUN apt-get update -qq && apt-get install -y build-essential libpq-dev RUN mkdir /myapp WORKDIR /myapp ADD Gemfile /myapp/Gemfile RUN bundle install ADD . /myapp
以上内容指定应用将使用安装了Ruby、Bundler以及其依赖件的镜像。下一步需要一个引导加载Rails的文件Gemfile。 等一会儿它还会被rails new命令覆盖重写。
source 'https://rubygems.org' gem 'rails', '4.0.2'
最后,docker-compose.yml 文件才是最神奇的地方。 docker-compose.yml文件将把所有的东西关联起来。它描述了应用的构成(一个web服务和一个数据库)、每个镜像的来源(数据库运行在使用预定义的PostgreSQL镜像,web应用侧将从本地目录创建)、镜像之间的连接,以及服务开放的端口。
version: "3" services: db: image: postgres ports: - "5432" web: build: . command: bundle exec rackup -p 3000 volumes: - .:/myapp ports: - "3000:3000"
所有文件就绪后,我们就可以通过使用docker-compose run命令生成应用的骨架了。
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
Compose会先使用Dockerfile为web服务创建一个镜像,接着使用这个镜像在容器里运行rails new和它之后的命令。一旦这个命令运行完后,应该就可以看一个崭新的应用已经生成了。
$ ls Dockerfile app docker-compose.yml tmp Gemfile bin lib vendor Gemfile.lock condocker-compose log README.rdoc condocker-compose.ru public Rakefile db test
在新的Gemfile文件去掉加载therubyracer的行的注释,这样我们便可以使用Javascript运行环境:
gem 'therubyracer', platforms: :ruby
现在我们已经有一个新的Gemfile文件,需要再重新创建镜像。(这个会步骤会改变Dockerfile文件本身,所以需要重建一次)。
$ docker-compose build
应用现在就可以启动了,但配置还未完成。Rails默认读取的数据库目标是localhost,我们需要手动指定容器的db。同样的,还需要把用户名修改成和postgres镜像预定的一致。 打开最新生成的database.yml文件。用以下内容替换:
development: &default adapter: postgresql encoding: unicode database: postgres pool: 5 username: postgres password: host: db test: <<: *default database: myapp_test
现在就可以启动应用了。
$ docker-compose up
如果一切正常,你应该可以看到PostgreSQL的输出,几秒后可以看到这样的重复信息:
myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick 1.3.1 myapp_web_1 | [2014-01-17 17:16:29] INFO ruby 2.0.0 (2013-11-22) [x86_64-linux-gnu] myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000
最后需要做的是创建数据库,打开另一个终端,运行:
$ docker-compose run web rake db:create
这个web应用已经开始在你的docker守护进程里面监听着3000端口了。
七、实战WordPress
1、创建空文件夹
假设新建一个名为WordPress的文件夹,然后进入这个文件夹。
docker-compose.yml文件将开启一个WordPress服务和一个独立的MySQL实例:
version: "3" services: db: image: mysql:8.0 command: - --default_authentication_plugin=mysql_native_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data:
2、构建并运行项目
运行docker-compose up -d Compose就会拉取镜像再创建我们所需要的镜像,然后启动WordPress和数据库容器。 接着浏览器访问 127.0.0.1:8000 端口就能看到WordPress安装界面了。
八、Docker Compose常用命令
1、docker –version #查看版本
2、docker-compose -h # 查看帮助
3、docker-compose up # 启动所有docker-compose服务
4、docker-compose up -d # 启动所有docker-compose服务并后台运行
5、docker-compose down # 停止并删除容器、网络、卷、镜像。
6、docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec
7、docker-compose.yml文件中写的服务id /bin/bash
8、docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
9、docker-compose top # 展示当前docker-compose编排过的容器进程
10、docker-compose logs yml里面的服务id # 查看容器输出日志
11、docker-compose config # 检查配置
12、docker-compose config -q # 检查配置,有问题才有输出
13、docker-compose restart # 重启服务
14、docker-compose start # 启动服务
15、docker-compose stop # 停止服务
-
广告合作
-
QQ群号:707632017