Ruby on rails 部署docker composer映像时出现混乱

Ruby on rails 部署docker composer映像时出现混乱,ruby-on-rails,docker,docker-compose,dockerfile,Ruby On Rails,Docker,Docker Compose,Dockerfile,我一直在使用RubyonRails示例应用程序,并在linux服务器(Ubuntu14.04)中部署docker映像 这是我的Dockerfile: 来自ruby:2.1.5的 运行apt-get-update-qq&&apt-get-install-y构建基本libpq-dev节点 运行mkdir/rails\u docker\u演示 WORKDIR/rails\u docker\u演示 添加Gemfile/rails\u docker\u demo/Gemfile 添加Gemfile.loc

我一直在使用RubyonRails示例应用程序,并在linux服务器(Ubuntu14.04)中部署docker映像

这是我的Dockerfile:

来自ruby:2.1.5的

运行apt-get-update-qq&&apt-get-install-y构建基本libpq-dev节点
运行mkdir/rails\u docker\u演示
WORKDIR/rails\u docker\u演示
添加Gemfile/rails\u docker\u demo/Gemfile
添加Gemfile.lock/rails\u docker\u demo/Gemfile.lock
运行包安装
加上/rails\u docker\u演示
#CMD bundle exec rails s-p3000-b0.0.0
#暴露3000
docker-compose.yml:

版本:“2”
服务:
db:
图片:博士后
网状物:
生成:。
命令:bundle exec rails s-p 3000-b'0.0.0'
图片:atulkhanduri/rails\u docker\u演示
卷数:
-.:/rails\u docker\u演示
端口:
- "3000:3000"
取决于:
-分贝
deploy.sh:

#/bin/bash
docker构建-t atulkhanduri/rails\u docker\u演示。
docker push atulkhanduri/rails\u docker\u演示
sshusername@ip-处理假设
如果我正确地阅读了你在这里所做的,我的回答假设以下两件事

  • 您正在使用docker compose运行数据库容器

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

  • 首先,我建议不要这样做,使用docker compose对这两者都简单得多。但是,我将根据上面的回答,假设存在一些有效的原因,您不能使用docker compose来运行“web”容器

    关于容器和网络名称 当您运行docker compose命令来启动db容器时,会发生两件事

  • 容器被赋予一个新名称,由运行compose安装程序的目录、compose(
    db
    )中的静态名称和一个数字组成。假设您将所有这些都放在一个目录名
    myapp
    中,您将有一个名为
    myapp\u db\u 1
    的新容器。您可以使用
    docker ps
    查看它的名称

  • 如果网桥尚不存在,则会创建一个网桥,名称类似于
    myapp\u default
    ——再次以compose安装程序所在的目录命名

  • 连接到正确的网络 问题是,您的非撰写容器已连接到默认网络(可能是
    docker\u default
    ),但您的db容器已连接到
    myapp\u default
    。这两个网络互不了解。你需要把它们连接起来。告诉web应用程序容器连接到compose网络可能更有意义

    首先,获取正确的网络名称。您可以使用docker network ls查看所有网络。可能是这样的:

    $docker网络ls
    网络ID名称驱动程序作用域
    c1f5764a112b本地桥
    175efb89adef docker_默认桥接器本地
    5185ff0e1054 myapp_默认网桥本地
    
    获得正确的名称后,使用
    --network
    选项更新run命令以了解网络

    docker运行-d--始终重新启动--命名web\
    -p 3000:3000——网络myapp_默认值\
    atulkhanduri/rails\u docker\u演示:当前
    
    一旦连接到适当的网络,名称“db”应正确解析

    如果您使用docker compose来启动这两个程序,则不需要这样做(这是docker compose只是默默地为您处理的事情之一)

    让它在您的服务器上运行 在评论中,您提到服务器上的compose存在一些问题。你明确地说:


    我需要在服务器上复制完整的项目吗?我不能仅从docker映像运行应用程序吗?实际上,我在服务器中复制了
    docker compose
    ,它为
    Gemfile
    抛出错误,然后我复制了
    Gemfile
    ,然后它说它应该是rails应用程序。所以我想我需要在服务器上复制我的完整文件夹。你能确认一下吗

    让我们看看Dockerfile的一些部分。我将在内联中添加一些注释

    ##创建一个新目录,然后将其设置为当前目录
    运行mkdir/rails\u docker\u演示
    WORKDIR/rails\u docker\u演示
    ##从外部将Gemfile和Gemfile.lock复制到此目录中
    添加Gemfile/rails\u docker\u demo/Gemfile
    添加Gemfile.lock/rails\u docker\u demo/Gemfile.lock
    ##运行bundle安装程序,它将安装到此目录
    运行包安装
    ##最后,将所有内容从外部本地目录复制到此处
    加上/rails\u docker\u演示
    
    因此,很明显,
    /rails\u docker\u demo
    是容器中的应用程序目录。你在这里安装了很多东西,这将成为你形象的一部分。当您将映像推送到注册表中,然后在服务器上将其下拉(就像您在部署脚本中所做的那样),这一切都会随之发生

    现在让我们看一下docker-compose.yml中的一些内容

    服务:
    网状物:
    卷数:
    -.:/rails\u docker\u演示
    
    这里定义了一个卷装载,将当前目录(docker-compose.yml所在的位置)装载为
    /rails\u docker\u demo
    。当您这样做时,服务器上发生的任何事情现在都可以在
    /rails\u docker\u demo
    中使用,但是这个挂载将撤消我刚才提到的Dockerfile中的所有工作。构建映像时没有安装资源,而只有服务器上
    目录中的内容。挂载在映像现有的
    /rails\u docker\u demo
    目录的顶部,隐藏其内容并替换为服务器上当前的任何内容

    除非有理由将此装载放在这里,否则您可能只需要从docker-compose.yml中删除该卷装载。您仍然需要在服务器b上使用docker-compose.yml
    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