Ruby on rails 部署docker composer映像时出现混乱
我一直在使用RubyonRails示例应用程序,并在linux服务器(Ubuntu14.04)中部署docker映像 这是我的Dockerfile: 来自ruby:2.1.5的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
运行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