Docker 编写到 CoreOS

Docker Compose to CoreOS

我目前正在学习 Docker,并且已经完成了一个漂亮而简单的 Docker Compose 设置。 3 个容器,都有自己的 Docker 文件设置。我怎样才能将其转换为在 CoreOS 上运行,以便稍后设置集群?

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

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

redis:
  build: ./redis
  ports:
    - "6379:6379"
  volumes:
    - /data/redis:/data

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

在这里你可以把它们全部放在一个 container/docker 或者分开,如果你分开做那么你需要 link 容器和可选的卷安装 - 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 上提供此云配置以实现持久性。

目前,使用 docker-compose 对付 CoreOS Vagrant VM. You just need to make sure to forward Docker port 的最简单方法。

如果你不是特别执着于使用docker-compose,你可以试试CoreOS 运行 Kubernetes. There are multiple options and I have implemented one of those for Azure.

CentruyLabs 创建了一个名为 fig2coreos

的 ruby​​gem

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

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

在这里, 我找到的最佳方法:

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

完成!

取自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 上安装最新 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

我还建议 docker-compose 在 docker 容器中,就像 dduportal 中的容器一样。

为了可用性,我扩展了我的云-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 命令,就像您在其他所有机器上习惯的那样。

简单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 :)

在 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

请注意,我无法在 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。

对于在 Fedora CoreOS 中使用 docker-compose,您可能 运行 遇到 python 的问题,但是 运行ning docker-compose 从容器中运行完美。

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