gpt4 book ai didi

ruby-on-rails - 部署docker-composer镜像时出现困惑

转载 作者:行者123 更新时间:2023-12-02 19:38:43 24 4
gpt4 key购买 nike

我一直在研究示例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

docker-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之类的 docker-compose up命令来运行应用程序服务器。

当我取消注释 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的输出:

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

附注:我在互联网上进行了很多搜索,但仍无法使用 docker-compose文件。

最佳答案

假设条件

如果我正确地阅读了您在此处所做的操作,那么我的回答将假定以下两点。

  • 您正在使用docker-compose运行数据库容器。
  • 您正在使用普通的docker命令(而非docker-compose)启动应用程序服务器(“web”)。

  • 首先,我建议不要这样做,使用docker-compose两者都容易得多。但是,我将基于上述回答,假设有一些合理的原因,您不能使用docker-compose运行“web”容器。

    关于容器和网络名称

    当您运行docker-compose命令启动db容器时,会发生两件事。
  • 为容器指定一个新名称,该名称由您用来运行compose设置程序的目录,compose中的静态名称(db)和一个数字组成。因此,假设您在目录名称myapp中拥有了所有这些,您将拥有一个名为myapp_db_1的新容器。您可以使用docker ps查看其名称。
  • 如果网桥尚不存在,则会创建一个网桥,其名称类似于myapp_default-再次以撰写设置所在的目录命名。

  • 连接到正确的网络

    问题是您的非组合容器已附加到默认网络(可能是 docker_default),但是您的数据库容器已附加到 myapp_default。这两个网络互不认识。您需要连接它们。告诉Web应用程序容器附加到撰写网络可能更有意义。

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

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

    输入正确的名称后,请使用 --network选项更新运行命令以了解网络。

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

    连接到正确的网络后,名称“db”应正确解析。

    如果您使用docker-compose来启动它们,则没有必要(这是docker-compose只是为您静默照顾的事情之一)。

    使它在您的服务器上运行

    在评论中,您提到服务器上的撰写存在一些问题。具体来说,您说:

    Do I need to copy my complete project on the server? Can't I run the application from docker image only? Actually, I've copied docker-compose in server and it throws errors for Gemfile, then I copied Gemfile, then it says it should be a rails app. So I guess I need to copy my complete folder in server. Can you please confirm?



    让我们看一下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是容器中的应用程序目录。您在这里安装了很多东西,这将成为您图像的一部分。当您将镜像推送到注册表,然后将其拉到服务器上时(就像在部署脚本中所做的一样),所有这些都将随它一起提供。

    现在让我们看一下docker-compose.yml中的(部分)。

    services:
    web:
    volumes:
    - .:/rails_docker_demo

    在这里,您已经定义了一个卷挂载,将当前目录(docker-compose.yml所在的位置)挂载为 /rails_docker_demo。完成此操作后,现在 /rails_docker_demo中就可以使用服务器上存在的任何内容,但是此安装撤消了我上面刚刚提到的Dockerfile的所有工作。您无需拥有构建镜像时安装的资源,而只能拥有 .目录中服务器上的所有内容。挂载位于镜像现有 /rails_docker_demo目录的顶部,隐藏其内容,并用当前服务器上的内容替换它们。

    除非有理由将此挂载放在此处,否则您可能只需要从docker-compose.yml中删除该卷挂载即可。您仍将在服务器上需要docker-compose.yml,但您不需要其余部分(当然,除了镜像之外)。

    您完成的安装非常有用-用于开发目的。它可以让您使用容器来运行应用程序,并迅速显示代码更改(而无需重建镜像)。但是对于您的部署而言,这只会带来麻烦。

    关于ruby-on-rails - 部署docker-composer镜像时出现困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41324231/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com