在部署docker作曲者的形象时感到困惑

我一直在做一个ruby-on-rails示例应用程序,并在Linux服务器(ubuntu 14.04)中部署Docker镜像。

这是我的Dockerfile:

FROM ruby:2.1.5 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /rails_docker_demo WORKDIR /rails_docker_demo ADD Gemfile /rails_docker_demo/Gemfile ADD Gemfile.lock /rails_docker_demo/Gemfile.lock RUN bundle install ADD . /rails_docker_demo # CMD bundle exec rails s -p 3000 -b 0.0.0.0 # EXPOSE 3000 

泊坞窗,compose.yml:

 version: '2' services: db: image: postgres web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' image: atulkhanduri/rails_docker_demos volumes: - .:/rails_docker_demo ports: - "3000:3000" depends_on: - db 

deploy.sh:

 #!/bin/bash docker build -t atulkhanduri/rails_docker_demo . docker push atulkhanduri/rails_docker_demo ssh username@ip-address << EOF docker pull atulkhanduri/rails_docker_demo:latest docker stop web || true docker rm web || true docker rmi atulkhanduri/rails_docker_demo:current || true docker tag atulkhanduri/rails_docker_demo:latest atulkhanduri/rails_docker_demo:current docker run -d --restart always --name web -p 3000:3000 atulkhanduri/rails_docker_demo:current EOF 

现在我的问题是,我不能像docker-compose up一样使用docker-compose命令来运行应用程序服务器。

当我从Dockerfile取消注释最后两Dockerfile

 CMD bundle exec rails s -p 3000 -b 0.0.0.0 EXPOSE 3000 

那么我可以在端口3000上运行服务器,但是出现错误could not translate host name "db" to address: Name or service not known 。 (我的database.yml有“db”作为主机。)这是因为postgres映像不被使用,因为我没有使用docker-compose文件。

编辑:

docker network ls输出docker network ls

 NETWORK ID NAME DRIVER SCOPE b466c9f566a4 bridge bridge local 7cce2e53ee5b host host local bfa28a6fe173 none null local 

PS:我在互联网上search了很多,但还没有能够使用docker-compose文件。

假设

如果我正在阅读你在这里所做的正确的话,我的答案假定了以下两件事情。

  1. 您正在使用docker-compose来运行数据库容器。

  2. 您正在使用普通的docker命令(而不是docker-compose)启动应用程序服务器(“web”)。

首先,我build议不要这样做,使用docker-compose来执行这两个操作要简单得多。 不过,我会根据上面的答案,假设有一些有效的原因,你不能使用docker-compose来运行“networking”容器。

关于容器和networking名称

当你运行docker-compose命令来启动数据库容器时,除了别的以外,还会发生两件事情。

  1. 该容器被赋予一个新的名称,由您运行compose设置的目录,compose( db )中的静态名称和一个数字组成。 假设您将这一切全部放在目录名称myapp ,您将拥有一个名为myapp_db_1的新容器。 您可以使用docker ps查看它的名字。

  2. 如果网桥不存在,则会创build一个网桥,并将其命名为myapp_default ,并以组合设置所在的目录命名。

连接到正确的networking

问题是你的非撰写容器被连接到默认networking(可能是docker_default ),但你的数据库容器连接到myapp_default 。 两个networking彼此不了解。 你需要连接它们。 告诉Web应用程序容器连接到撰写networking可能更有意义。

首先,获取正确的networking名称。 您可以使用docker network ls查看所有networking。 它可能看起来像这样:

 $ docker network ls NETWORK ID NAME DRIVER SCOPE c1f5764a112b bridge bridge local 175efb89adef docker_default bridge local 5185ff0e1054 myapp_default bridge local 

一旦你有正确的名字,使用--network选项更新你的运行命令来了解networking。

 docker run -d --restart always --name web \ -p 3000:3000 --network myapp_default \ atulkhanduri/rails_docker_demo:current 

一旦它连接到正确的networking,名称“db”应该正确parsing。

如果你使用docker-compose来启动它们,这不是必须的(这是docker-compose为你默默的照顾的一件事情)。

让它在你的服务器上运行

在评论中,你提到你在服务器上有一些问题。 具体你说:

我是否需要将我的完整项目复制到服务器上? 我不能只从docker映像运行应用程序吗? 其实,我已经在服务器中复制了Gemfile docker-compose ,并且它引发了Gemfile错误,然后我复制了Gemfile ,然后它说它应该是一个Rails应用程序。 所以我想我需要复制我的完整文件夹在服务器。 你能确认吗?

我们来看看你的Dockerfile的一些部分。 我会在内部添加一些评论。

 ## Make a new directory, and then make it the current directory RUN mkdir /rails_docker_demo WORKDIR /rails_docker_demo ## Copy Gemfile and Gemfile.lock into this directory from outside ADD Gemfile /rails_docker_demo/Gemfile ADD Gemfile.lock /rails_docker_demo/Gemfile.lock ## Run the bundle installer, which will install to this directory RUN bundle install ## Finally, copy everything from the outside local dir to here ADD . /rails_docker_demo 

所以,显然, /rails_docker_demo是你的容器内的应用程序目录。 你已经在这里安装了一堆东西,这将成为你的形象的一部分。 当你把图像推送到registry中,然后在服务器上拉下它(就像你在部署脚本中那样),这一切都会随之而来。

现在我们来看看(一些)docker-compose.yml。

 services: web: volumes: - .:/rails_docker_demo 

在这里,你已经定义了一个卷挂载,将当前目录(docker-compose.yml所在的地方) /rails_docker_demo/rails_docker_demo 。 当你这样做的时候,服务器上的任何事情现在都可以在/rails_docker_demo ,但是这个挂载从上面提到的Dockerfile中解放了所有的工作。 您只有在生成映像时才安装资源,而不需要在服务器上安装任何资源. 目录。 挂载位于映像的现有/rails_docker_demo目录的顶部,隐藏其内容并将其replace为服务器上目前的任何内容。

除非有这样的理由,否则您可能只需从docker-compose.yml中删除该卷装入。 你仍然需要在服务器上使用docker-compose.yml,但是你不需要其余的(当然除了图片)。

你所做的这个挂载是一个有用的东西 – 用于开发目的。 它可以让你使用容器来运行应用程序,并迅速显示代码更改(不重build图像)。 但是在部署的情况下,这只是造成麻烦。

尝试移动上面的CMDEXPOSE ,例如

 FROM ruby:2.1.5 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /rails_docker_demo WORKDIR /rails_docker_demo ADD Gemfile /rails_docker_demo/Gemfile ADD Gemfile.lock /rails_docker_demo/Gemfile.lock RUN bundle install ADD . /rails_docker_demo EXPOSE 3000 CMD bundle exec rails s -p 3000 -b 0.0.0.0