docker-compose开始使用docker-compose


备注

Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用Compose文件来配置应用程序的服务。然后,使用单个命令,您可以从配置中创建并启动所有服务。要了解有关Compose所有功能的更多信息,请参阅功能列表。

使用Compose基本上是一个三步过程。

  1. 使用Dockerfile定义应用程序的环境,以便可以在任何地方进行复制。
  2. docker-compose.yml定义构成应用程序的服务,以便它们可以在隔离环境中一起运行。
  3. 最后,运行docker-compose up ,Compose将启动并运行整个应用程序。

创建一个简单的应用程

这个例子来自官方文件。假设你有一个使用redis作为后端的python应用程序。编写Dockerfile ,创建一个docker-compose.yml 文件,如下所示:

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    depends_on:
     - redis
  redis:
    image: redis
 

然后运行docker-compose up 将设置整个应用程序包括:python app和redis。


  • version: '2'版本的搬运工-撰写文件语法的
  • services: 是描述要运行的服务的部分
  • web:redis: 是要启动的服务的名称, 它们的内容描述了docker应该如何为这些服务启动容器
  • depends_on 意味着web与redis的依赖关系,因此docker-compose首先启动redis 容器,然后启动web容器。然而,在启动web 容器之前, redis docker-compose 不会等到redis 容器准备就绪。要实现这一点,您必须使用一个脚本来延迟应用程序服务器的启动,或者直到redis 容器可以执行请求。

还可以添加卷和网络部分。使用卷部分允许断开连接的卷,它可以独立于docker compose服务部分生存。网络部分有类似的结果。

服务的redis部分必须调整如下:

redis:
  image: redis
  volumes:
    - redis-data:/code
  networks:
    -back-tier 
 

接下来,将以下部分添加到docker compose版本2文件的底部。

volumes:
  # Named volume
  redis-data: 
    driver: local
networks:
  back-tier:
    driver: bridge
 

redis-data 从服务部分提供可访问的标签。 driver:local 将卷设置为本地文件系统。

back-tier 将网络部分标签设置为可在服务部分中作为桥接访问。

Docker撰写你好世界

一个非常基本docker-compose.yml 看起来像这样:

version: '2'
services:
  hello_world:
    image: ubuntu
    command: [/bin/echo, 'Hello world']
 

这个文件是为了有一个hello_world 服务,它是从ubuntu:latest image初始化的,当它运行时,它只运行echo 'Hello world'

如果你在folder 目录中(它包含这个docker-compose.yml 文件),你可以做docker-compose.yml docker-compose up 你应该看到

Creating folder_hello_world_1
Attaching to folder_hello_world_1
hello_world_1 | Hello world
folder_hello_world_1 exited with code 0
 

这从ubuntu映像创建了容器,并运行了docker-compose.yml 上指定的命令

Docker-Compose 使用文件夹名称作为项目名称来为容器和网络添加前缀。要设置另一个项目名称,您可以调用docker-compose --project-name NAME {up|down|...} 或者在.env docker-compose.yml 旁边提供名为.env 的文件,并在其中写入COMPOSE_PROJECT_NAME=name 它。最好避免使用带连字符( - )的长项目名称,因为docker使用这种名称组成bahaves怪。

注意:docker-compose允许您在单个主机上运行多个docker容器。如果要在多个节点上运行多个容器,请参阅swarm / kubernetes等解决方案。

安装Docker Compose

  1. 安装Docker Engine

如果您收到Permission denied 错误,请在下面的两个命令之前运行sudo -i ,然后退出。

  1. Pull Docker Compose到/usr/local/bin/docker-compose
curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
 

您可以更改1.7.1 版以匹配您想要的版本。尝试从https://github.com/docker/compose/releases获取版本

  1. 对二进制文件应用可执行权限。
chmod +x /usr/local/bin/docker-compose
 
  1. 测试安装。
docker-compose --version
 

预期的docker-compose版本1.7.1,build 0a9ab35

安装

如果您在OS X或Windows上运行Docker,Docker-compose应包含在Docker for Windows或Docker Toolbox安装中。

在Linux上,您可以直接从GitHub发布页面获取最新的二进制文件: https//github.com/docker/compose/releases

您可以使用以下命令安装特定版本:

curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
 

有关详细信息,请参阅文档页面

带有docker-compose的Ruby on Rails

如果你想使用docker for rails app并使用数据库,你需要知道docker容器中的所有数据都将被销毁(除非你专门为了保存数据而配置容器)有时你需要创建一个docker容器应用程序并将其附加到具有数据库的旧容器。

作为rails应用程序的示例,我使用了一个简单的应用程序。您可以从命令创建它:

rails new compose-app --database=postgresql
 

当然,您需要事先安装导轨,红宝石等。

然后,在项目中创建Dockerfile,并将此数据设置为它:

FROM ruby:2.3.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /compose-app
WORKDIR /compose-app
ADD Gemfile /compose-app/Gemfile
ADD Gemfile.lock /compose-app/Gemfile.lock
RUN bundle install
ADD . /compose-app
 

下一步 - 使用数据创建docker-compose.yml:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -e development -p 80 -b '0.0.0.0'
    volumes:
      - .:/compose-app
    ports:
      - "80:80"
    depends_on:
      - db
 

您可以将80端口(-p 80)替换为另一端口。

必须将database.yml config的开发部分更改为:

development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db
 

现在您可以从命令构建图像:

docker-compose build
 

(在项目目录中运行)

从以下开始:

docker-compose up
 

如果一切都正确完成,您将能够在控制台中查看rails中的日志。

关闭控制台。它会起作用。

如果只想删除没有数据库的rails应用程序的容器,则需要在项目目录中运行:

docker-compose stop web
docker-compose build web
docker-compose up -d --no-deps web
 

将创建并启动带有rails app的新容器。

在docker-compose服务中运行命令

docker-compose run service-name command

例如,如果您想在web 服务中运行rake db:create ,则可以使用以下命令:

docker-compose run web rake db:create