概要
過去 Ruby から docker を操作しました
イメージの操作がメインだったので今回はコンテナの操作をしてみました
環境
- macOS 10.14.5
- docker for Mac 18.09.2
- Ruby 2.6.2p47
準備
bundle initvim 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 件のコメント:
コメントを投稿