2019年5月29日水曜日

Ruby から docker コンテナを起動する

概要

過去 Ruby から docker を操作しました
イメージの操作がメインだったので今回はコンテナの操作をしてみました

環境

  • macOS 10.14.5
  • docker for Mac 18.09.2
  • Ruby 2.6.2p47

準備

  • bundle init
  • vim Gemfile
gem "docker-api"
  • bundle install --path vendor

コンテナを作成

今回は redis コンテナを作成します
イメージは事前に pull しておきましょう

  • docker pull redis

コンテナを作成するスクリプトです
docker for Mac で Remote API を使う場合は docker.sock を使います
2376 ポートで LISTEN することはできないためです

require 'docker'

Docker.url = 'unix:///var/run/docker.sock'
container = Docker::Container.create(
  "name" => 'my_redis', # lower case in a querystring
  "Image" => 'redis:latest',
  "PortBindings" => {
    "6379/tcp" => [
      {
        "HostPort" => "6379"
      }
    ]
  }
)
container.start
# pp Docker::Container.all(:all => true)
puts Docker::Container.all(:filters => { :name => ["my_redis"] }.to_json).first.info["Names"]

コンテナの作成は Docker::Container.create を使います
必要なパラメータを引数で指定します
name はクエリストリングのパラメータになっています
クエリストリングは基本的に先頭が小文字になっているので注意しましょう
先頭が大文字になっているのはリクエストボディとして送信されるパラメータになります
今回は ImagePortBindings を指定します
Image は必須です
PortBindings はホストから redis にアクセスするために使います
docker create コマンドで言うところの -p パラメータです

コンテナを作成したら start メソッドを呼び出すことでコンテナを起動できます
作成したら Docker::Container.all でコンテナの一覧を取得しています
all: trueps -a になります
:filters ps -f になります

コンテナに exec する

起動済みのコンテナに対して exec コマンドを実行します
起動済みのコンテナをインスタンスとして生成する方法は Docker::Container.get を使います
コンテナ ID またはコンテナ名を指定します

require 'docker'

container = Docker::Container.get('my_redis')
p container.exec(['redis-cli', 'info', 'server'])

実行するコマンドは配列で指定するのがポイントです
サブコマンドがある場合は別の要素として指定してます
レスポンスは実行結果の「標準出力」「標準エラー」「ステータスコード」が配列で戻ってきます

コンテナの停止/削除

require 'docker'

container = Docker::Container.get('my_redis')
container.stop
container.remove
# container.delete

stop, remove を使います
delete もエイリアスとして登録されています

最後に

Ruby で docker コンテナを操作してみました
Docker::Container クラスのインスタンスを作ってから操作する感じなります
パラメータ名などは Docker Remote API をそのまま使って使っているのでどんなパラメータを指定すればいいかは Docker Remote API のリファレンスを参照するのが良いと思います

参考サイト

0 件のコメント:

コメントを投稿