docker-compose 应用和数据库之间的链接

3

我可以帮您进行翻译,以下是关于docker-compose链接的问题。

我正在尝试在ruby rack应用程序和mysql之间建立链接,并解决数据库主机名。

docker-compose.yml:

version: '2'
services:
  db:
    image: library/mysql:5.6.22
    environment:
      MYSQL_ROOT_PASSWORD: xxx
      MYSQL_DATABASE: xxx
      MYSQL_USER: xxx
      MYSQL_PASSWORD: xxx
    ports:
      - "3306:3306"
    restart: always
  snow:
    build: .
    links:
      - db
    depends_on:
      - db
    ports:
      - "9292:9292"
    restart: always

snow的Dockerfile:

# Docker file for CentOS with RVM
FROM centos:centos7

MAINTAINER "XXXXX"

RUN useradd -ms /bin/bash t_user
RUN echo "t_user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

WORKDIR "/home/t_user"

RUN yum -y install curl which tar sudo wget git vim mysql-devel

USER t_user

## Install RVM + ruby 2.1.2
RUN gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
RUN curl -sSL https://get.rvm.io | bash -s stable

ENV PATH /usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

RUN /bin/bash -l -c "rvm requirements"
RUN /bin/bash -l -c "rvm install ruby-2.1.2"
RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc"

# Copy snow
USER t_user

WORKDIR /tmp

ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN /bin/bash -l -c "bundle"

WORKDIR "/home/t_user"

RUN mkdir -p snow/current/ && mkdir -p snow/shared/config/
COPY . /home/t_user/snow/current/
RUN rm /home/t_user/snow/current/Dockerfile

USER root
RUN chown -R t_user.t_user snow/

USER trusteer

WORKDIR /home/t_user/snow/current/
RUN /bin/bash -l -c "rake db:migrate"
RUN chmod +x ./bin/runner
ENTRYPOINT ["./bin/snow"]

EXPOSE 9292

运行docker-compose up -d后我遇到的错误是:
rake aborted!
Mysql2::Error: Unknown MySQL server host 'db' (2)
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/mysql2-0.4.4/lib/mysql2/client.rb:87:in `connect'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/mysql2-0.4.4/lib/mysql2/client.rb:87:in `initialize'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/mysql2_adapter.rb:18:in `new'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/mysql2_adapter.rb:18:in `mysql2_connection'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:438:in `new_connection'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:448:in `checkout_new_connection'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:422:in `acquire_connection'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:349:in `block in checkout'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:348:in `checkout'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:263:in `block in connection'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:262:in `connection'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract/connection_pool.rb:571:in `retrieve_connection'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_handling.rb:113:in `retrieve_connection'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/connection_handling.rb:87:in `connection'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/migration.rb:916:in `initialize'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/migration.rb:823:in `new'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/migration.rb:823:in `up'
/home/trusteer/.rvm/gems/ruby-2.1.2/gems/activerecord-4.2.6/lib/active_record/migration.rb:801:in `migrate'
/home/trusteer/snow/current/Rakefile:10:in `block (2 levels) in <top (required)>'
/home/trusteer/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `eval'
/home/trusteer/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `<main>'

docker 信息:

 Containers: 2
 Running: 1
 Paused: 0
 Stopped: 1
 Images: 72
 Server Version: 1.11.0
 Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 110
 Dirperm1 Supported: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins: 
  Volume: local
  Network: bridge null host
 Kernel Version: 3.13.0-58-generic
 Operating System: Ubuntu 14.04.4 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.507 GiB
 Name: galt-tp
 ID: DKCR:ZB6N:PW4O:76PF:UZPU:HVZO:XHL4:SRPM:6ACQ:M6T5:AZXN:KVPQ
 Docker Root Dir: /var/lib/docker
 Debug mode (client): false
 Debug mode (server): false
 Registry: https://index.docker.io/v1/
 WARNING: No swap limit support

我看了关于Docker链接的文档,上面说链接指令会添加相关容器的DNS记录,但是这对我不起作用。你有什么想法吗?
1个回答

3
在docker-compose v2中,您不需要使用链接。所有容器将在一个公共网络中创建(了解更多)。并且通过下面的配置,您可以通过它们的名称来解析服务:
version: '2'
services:
  db:
    image: library/mysql:5.6.22
    environment:
      MYSQL_ROOT_PASSWORD: xxx
      MYSQL_DATABASE: xxx
      MYSQL_USER: xxx
      MYSQL_PASSWORD: xxx
    ports:
      - "3306:3306"
    restart: always
  snow:
    build: .
    depends_on:
      - db
    ports:
      - "9292:9292"
    restart: always

例如,您可以通过snow从db容器进行ping测试:
ping db

更新:

你的Snow Dockerfile出现了问题,具体来说是下面这行代码:

RUN /bin/bash -l -c "rake db:migrate"

您需要了解这个命令是在镜像构建阶段执行的。在此阶段,您没有名为db的服务。只有在构建镜像后,db服务才会出现。 depends_on选项文档仅说明服务启动顺序,没有涉及构建顺序。

作为解决方案,您可以创建一个包含此命令的bash脚本,并在dockerfile入口点上执行它。


没有帮助,我仍然得到了相同的错误: Mysql2 :: Error:未知的MySQL服务器主机“db”(2) - gal
是的,我之前试图发布我找到了问题,但stackoverflow不让我 :) 无论如何,你是对的,那就是问题所在...我太新手了 :) 十分感谢。 - gal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接