【问题标题】:Docker Compose to CoreOSDocker Compose 到 CoreOS
【发布时间】:2015-03-16 21:04:38
【问题描述】:

我目前正在学习 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

【问题讨论】:

    标签: docker coreos docker-compose


    【解决方案1】:

    取自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
    

    【讨论】:

    • 你太棒了!与 CoreOS 884.0.0 完美配合。 @Julian K 你必须以超级用户(sudo su)的身份运行命令,而不是exit 回到core 用户,它才会运行。
    • 这里只是吹毛求疵,但你可以mkdir -p /opt/bin
    • 如果有人在运行 curl 命令下载 compose 时遇到权限错误,请尝试使用 -o 标志而不是重定向输出。只需将答案中给出的 curl 命令中的 > 标志替换为 -o 参考来自 - digitalocean.com/community/tutorials/…
    【解决方案2】:

    我创建了用于在 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
    • jq 似乎安装在 CoreOS 上。
    【解决方案3】:

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

    1. 整体安装
    2. 在单独的 docker 容器中运行

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

    根据您的云提供商或自定义安装找到您的云配置,请参阅https://coreos.com/os/docs/latest/cloud-config-locations.html 了解位置。

    通过将 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
    

    请注意,我无法让 uname -suname -m 扩展在 curl 语句中工作,所以我只是将它们替换为它们的扩展值。

    验证你的配置文件

    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 cmets,您可以运行coreos-cloudinit --from-file path-to-cloud-config 而不是重新启动CoreOS。

    【讨论】:

    • 您无需重新启动整个服务器即可将更改应用到 cloud-config;只需运行coreos-cloudinit --from-file path-to-cloud-config
    • 我使用了您的设备,但现在每次重新启动 CoreOs 服务器时都会出错。为了缓解这一点,我现在使用 wget-nc 标志。
    • 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
    • 这种方法对我来说似乎有点奇怪 - Service 不是用于运行守护进程而不是安装软件的单元吗?
    【解决方案4】:

    我还建议在 docker 容器中使用 docker-compose,例如来自 dduportal 的容器。

    为了方便起见,我将 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 更新 cloud-config 并重新启动系统后,您就可以使用 docker-compose就像你在其他机器上习惯的命令一样。

    【讨论】:

    • 如何“扩展”cloud-config.yml?这是否意味着使用文本文件编辑器“附加”?如果是这样,哪个文本文件编辑器?
    • 现在有一个官方的 docker 容器用于 compose,docker/compose。此外,来自 github releases 页面的 run.shscript 将此容器与 docker run 一起使用。
    【解决方案5】:

    CentruyLabs 创建了一个名为 fig2coreos 的 ruby​​gem

    它将 fig.yml 转换为 .service 文件

    fig 自 docker-compose 创建以来已被弃用,但语法似乎相同,因此它可能可以工作。

    【讨论】:

    • 感谢您回答问题的“转换”部分。
    【解决方案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 :)

    【讨论】:

      【解决方案7】:

      在这里, 我发现的最好方法:

      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
      

      完成!

      【讨论】:

        【解决方案8】:

        好吧,coreOS 支持 docker,但它是具有集群支持的裸 linux,因此您需要为所有容器包含一个基本映像(使用 FROM 和在 Dockerfile 中,您可能还需要执行 RUN yum -y install bzip2 gnupg 等。 , ) 具有您的应用程序和 redis 所需的 bin 和库(最好采用一些 ubuntu 基础映像)

        在这里,您可以将所有这些放在一个容器/docker 中,或者如果您单独执行,则需要将它们链接起来,并且可以选择进行卷挂载 - docker 对此有一些很好的说明 (https://docs.docker.com/userguide/dockervolumes/)

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

        【讨论】:

          【解决方案9】:

          目前,使用docker-composeCoreOS Vagrant VM 的最简单方法。您只需确保forward Docker port

          如果您不是特别喜欢使用docker-compose,可以尝试运行Kubernetes 的CoreOS。有多个options,我实现了one of those for Azure

          【讨论】:

          • docker-compose 在单机环境下更简单。 Kubernetes 功能强大,在集群环境中运行良好,但对于简单的情况可能有点过头了。
          【解决方案10】:

          对于在 Fedora CoreOS 中使用 docker-compose,您可能会遇到 python 问题,但是从容器中运行 docker-compose 效果很好。

          有一个方便的 bash 包装脚本,它记录在此处的官方文档中:https://docs.docker.com/compose/install/#alternative-install-options 在“作为容器安装”部分下。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-11-30
            • 2017-04-28
            • 1970-01-01
            • 2015-02-01
            • 2020-10-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多