Docker Compose 到 CoreOS

40

我目前正在学习Docker,并创建了一个漂亮而简单的Docker Compose设置。有3个容器,每个容器都有自己的Dockerfile设置。我该如何将其转换为在CoreOS上运行,以便稍后设置集群?

web:
  build: ./app
  ports:
    - "3030:3000"
  links:
    - "redis"

newrelic:
  build: ./newrelic
  links:
    - "redis"

redis:
  build: ./redis
  ports:
    - "6379:6379"
  volumes:
    - /data/redis:/data
10个回答

51

取自https://docs.docker.com/compose/install/

唯一的问题是/usr是只读的,但/opt/bin可写且在路径中,所以:

sd-xx~ # mkdir /opt/
sd-xx~ # mkdir /opt/bin
sd-xx~ # curl -L https://github.com/docker/compose/releases/download/1.3.3/docker-compose-`uname -s`-`uname -m` > /opt/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   403    0   403    0     0   1076      0 --:--:-- --:--:-- --:--:--  1080
100 7990k  100 7990k    0     0  2137k      0  0:00:03  0:00:03 --:--:-- 3176k
sd-xx~ # chmod +x /opt/bin/docker-compose

sd-xx~ # docker-compose
Define and run multi-container applications with Docker.

Usage:
  docker-compose [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE           Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME   Specify an alternate project name (default: directory name)
  --verbose                 Show more output
  -v, --version             Print version and exit

Commands:
  build              Build or rebuild services
  help               Get help on a command
  kill               Kill containers
  logs               View output from containers
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pulls service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  up                 Create and start containers
  migrate-to-labels  Recreate containers to add labels

1
你太棒了!在CoreOS 884.0.0上完美运行。@Julian K,你必须以超级用户身份运行命令(sudo su),然后退出到“core”用户,它就会运行。 - Lanti
1
这里只是挑刺,但你可以使用 mkdir -p /opt/bin - BachirC
1
如果在运行curl命令下载compose时遇到权限错误,请尝试使用-o标志而不是重定向输出。只需将答案中给出的curl命令中的>标志替换为-o即可。参考链接 - https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-ubuntu-16-04 - Ravindu Nirmal Fernando

35

我已经创建了一个简单的脚本,用于在CoreOS上安装最新的Docker Compose: https://gist.github.com/marszall87/ee7c5ea6f6da9f8968dd

#!/bin/bash
mkdir -p /opt/bin
curl -L `curl -s https://api.github.com/repos/docker/compose/releases/latest | jq -r '.assets[].browser_download_url | select(contains("Linux") and contains("x86_64"))'` > /opt/bin/docker-compose
chmod +x /opt/bin/docker-compose

只需使用sudo运行它


不幸的是,我的机器上没有jq。也许我应该转向grep - Franklin Yu
5
看起来jq已经安装在CoreOS上了。 - Sven Koschnicke

23

在 CoreOS 上安装或运行任何东西的正确方式是:

  1. 将其安装为一个 unit
  2. 在单独的 Docker 容器中运行

对于 docker-compose,您可能希望像将 docker 作为一个 unit 一样安装它。请参阅 Digital Ocean 的关于 CoreOS 的优秀指南,以及systemd units章节以了解更多信息。

根据您的云提供商或自定义安装,定位您的云配置,请参见https://coreos.com/os/docs/latest/cloud-config-locations.html以获取位置。

通过将其添加为一个 unit 来安装 docker-compose。

#cloud-config

coreos:
  units:
    - name: install-docker-compose.service
      command: start
      content: |
        [Unit]
        Description=Install docker-compose
        ConditionPathExists=!/opt/bin/docker-compose

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/mkdir -p /opt/bin/
        ExecStart=/usr/bin/curl -o /opt/bin/docker-compose -sL "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-linux-x86_64"
        ExecStart=/usr/bin/chmod +x /opt/bin/docker-compose
注意,我无法在curl语句中使用uname -suname -m扩展,因此我将它们替换为它们的扩展值。
使用以下命令验证您的配置文件:
coreos-cloudinit -validate --from-file path-to-cloud-config

它应该输出类似以下内容

myhost core # coreos-cloudinit -validate --from-file path-to-cloudconfig
2016/12/12 12:45:03 Checking availability of "local-file"
2016/12/12 12:45:03 Fetching user-data from datasource of type "local-file"
myhost core #

注意,coreos-cloudinit 不会验证您的云配置中的内容块。当您完成操作并重启 CoreOS 后,您就可以开始使用了。

更新:如 @Wolfgang 的评论所述,您可以运行 coreos-cloudinit --from-file path-to-cloud-config 代替重启 CoreOS。


2
您无需重新启动整个服务器以应用更改到cloud-config;只需运行coreos-cloudinit --from-file path-to-cloud-config即可。 - Wolfgang
1
我使用了您的单元,但每次重新启动CoreOs服务器时都会出现错误。为了缓解这个问题,我现在使用带有“-nc”标志的“wget”。 - blablabla
使用curl时出现了错误,但是使用wget似乎可以正常工作(请注意我也直接使用运行脚本)ExecStart=/bin/wget -q -nc -O /opt/bin/docker-compose "https://github.com/docker/compose/releases/download/1.14.0-rc2/run.sh" > /opt/bin/docker-compose - FearlessHyena
这种方法对我来说有点奇怪 - Service 单元不是用于运行守护进程而不是安装软件吗? - Cocowalla

7
我建议您使用像dduportal这样的Docker容器中的docker-compose。
为了更好地使用,我将我的cloud-config.yml扩展如下:
write_files:
 - path: "/etc/profile.d/aliases.sh"
   content: |
     alias docker-compose="docker run -v \"\$(pwd)\":\"\$(pwd)\" -v /var/run/docker.sock:/var/run/docker.sock -e COMPOSE_PROJECT_NAME=\$(basename \"\$(pwd)\") -ti --rm --workdir=\"\$(pwd)\" dduportal/docker-compose:latest"

通过 sudo coreos-cloudinit -from-url http-path-to/cloud-config.yml 更新云配置并重新启动系统后,您可以像在其他机器上一样使用docker-compose命令。


如何“扩展”cloud-config.yml文件?这是否意味着使用文本编辑器“追加”内容?如果是的话,那么应该使用哪个文本编辑器? - Kind Contributor
2
现在有一个官方的Docker容器用于Compose,docker/compose。此外,来自Github releases页面的run.sh脚本使用该容器与docker run一起运行。 - Neil Mayhew

6

简单的3步

sudo mkdir -p /opt/bin

在官方网站https://docs.docker.com/compose/install/中获取命令,并将输出路径从/usr/local/bin/docker-compose更改为/opt/bin

sudo curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /opt/bin/docker-compose

生成可执行文件:

sudo chmod +x /opt/bin/docker-compose

现在您拥有 docker-compose :)

6

CentruyLabs创建了一个名为fig2coreos的rubygem。

它将fig.yml翻译成.service文件。

由于docker-compose的出现,fig已经被弃用,但语法似乎相同,因此它可能仍然可用。


谢谢您回答问题中的“转换”部分。 - David Braun

4

这是我找到的最好方法:

core@london-1 ~ $ docker pull dduportal/docker-compose
core@london-1 ~ $ cd /dir/where-it-is-your/docker-compose.yml
core@london-1 ~ $ docker run -v "$(pwd)":/app \
             -v /var/run/docker.sock:/var/run/docker.sock \
             -e COMPOSE_PROJECT_NAME=$(basename "$(pwd)")\
             -ti --rm \
             dduportal/docker-compose:latest up

完成!


3

嗯,CoreOS支持Docker,但它只是一个裸机Linux,带有集群支持,因此您需要为所有容器包括基本映像(使用FROM,在Dockerfile中还可能需要运行yum -y install bzip2 gnupg等命令),其中包含应用程序和Redis所需的二进制文件和库(最好采用一些Ubuntu基本映像)。

在这里,您可以将它们全部放入一个容器/Docker中,或者分开放置。如果分开放置,则需要链接容器并可选地卷挂载- Docker有一些很好的说明文档(https://docs.docker.com/userguide/dockervolumes/)。

最后,您需要编写云配置文件,指定systemd单元。在您的情况下,将由systemd启动3个单元(systemd替换了CoreOS中的传统init系统),并将其提供给coreos-cloudinit(提示:coreos-cloudinit-from-file=./cloud-config-validate=false)。您还需要在Linux bootcmd上提供此cloud-config以实现持久性。


1

3
在单机环境下,docker-compose 更为简单。对于集群环境,Kubernetes 功能强大且表现出色,但在简单情况下可能会过于繁琐。 - Franklin Yu

0

如果你想在Fedora CoreOS中使用docker-compose,可能会遇到Python相关的问题,不过从容器中运行docker-compose可以完美解决。

有一个实用的Bash包装脚本,并且在官方文档中有说明,链接在这里:https://docs.docker.com/compose/install/#alternative-install-options 的"Install as a container"部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接