让我们大致地用Docker Compose将Sinatra和Redis连接起来试试看

上一篇文章

有关Docker的事项。

这篇文章的目的是什么?

    docker-composeで二つのDocker Containerを繋がって起動させる方法

这篇文章没有涉及的内容。

    Docker-composeの歴史

议程

    • 作りたいものの全体像

 

    • ファイル構造

 

    • 実行コマンド

 

    • ざっくりした説明

 

    呟き

想要创造的事物的整体图景

将Sinatra服务器容器和Redis容器进行连接,以从Redis中提取存储的数据。

文件结构

工作空间
ㄴ app.rb
ㄴ Gemfile
ㄴ Dockerfile
ㄴ docker-compose.yml

app.rb 是一个Ruby程序文件。

#!/usr/bin/env ruby
#
require 'sinatra'
require 'redis'
require 'json'

r = Redis.new host: ENV["REDIS_HOST"], port:"6379"

get '/create_dummy_data' do
  {
    'test1': 'this is test 1',
    'test2': 'this is test 2',
    'test3': 'this is test 3',
    'test4': 'this is test 4'
  }.each do |key, value|
    r.set key, value 
  end

  'create successfully dummy data'
end

get '/fetch/:key' do
  data = r.get params[:key]
  return 'empty data' if data.nil?

  data
end

Gemfile -> Gem文件

source 'https://rubygems.org'

gem 'sinatra', '2.0.8'
gem "redis"

Dockerfile 转述器

FROM ruby:2.6.5
MAINTAINER jinument@gmail.com

ENV WORKSPACE /app

ADD ./Gemfile* $WORKSPACE/
WORKDIR $WORKSPACE
RUN bundle install

ADD . $WORKSPACE

docker-compose.yml 文件

version: "3"
services:
  redis:
    image: redis
    ports:
      - "6379"
  web:
    build: .
    command: bundle exec ruby app.rb -o 0.0.0.0
    volumes:
      - .:/myapp
    ports:
      - "4567:4567"
    depends_on:
      - redis
    environment:
      - REDIS_HOST=redis

命令

在放置上面的文件的目录中执行以下命令。

使用docker-compose build指令来构建docker-compose.yml文件中的各个services。

docker-compose up -d
→依次启动构建好的服务。
→-d选项以后台模式启动。

→ 停止正在运行的 Docker Compose 服务。

大致解释

让我们通过查看上面的docker-compose.yml文件来了解docker-compose.yml的基本结构。

在docker-compose.yml文件中指定版本,使用”version”字段。

在services目录下,包含了关于每个将要执行的容器的规范。这里打算启动redis和webContainer。

在Dockerfile中,redis的image和port与命令相同,用于指定要使用的Docker镜像和开放的端口号。

通过在docker-compose.yml中设置web下的depends_on,可以设置与该容器的依赖关系。通过指定这一条件,web可以通过主机名redis与redisContainer进行通信。

咕哝声

    • 大体Dockerfileのコマンドと意味が似っているので、dockerを理解していれば、そこまで嵌らないとおもう。

 

    • 現状docker-composeのlinksは使われない。(docker offical documentから)

 

     → 代わりにdepends_onを使おう。
广告
将在 10 秒后关闭
bannerAds