概要
過去 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
はクエリストリングのパラメータになっています
クエリストリングは基本的に先頭が小文字になっているので注意しましょう
先頭が大文字になっているのはリクエストボディとして送信されるパラメータになります
今回は Image
と PortBindings
を指定します
Image
は必須です
PortBindings
はホストから redis
にアクセスするために使います
docker create
コマンドで言うところの -p
パラメータです
コンテナを作成したら start
メソッドを呼び出すことでコンテナを起動できます
作成したら Docker::Container.all
でコンテナの一覧を取得しています
all: true
は ps -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 件のコメント:
コメントを投稿