はちみつブログ

趣味や生活の話を好きなタイミングで書いていきたいと思います。

DockerでOllamaを動かしつつDockerのコマンドをお勉強

ひさしぶりのDocker記事。前回はデスクトップをhomebrewで入れた。せっかくだしコンテナをつかおう、と一緒にコマンドを覚えよう、ということで、OllamaをDockerでインストールしてみる。

実行環境

  • macOS: Sequoia 15.4
  • docker desktop: 4.41.2
    • Ollamaのイメージのバージョンは重要だと思うのだが…見方がまだよくわからず…(2025年5月中旬あたりのバージョンと思ってもらえれば)

Ollamaの公式通りにやってみる

Ollamaのコンテナを試して、途中のコマンドを勉強していく。

まずはDocker HubのOllamaのページの最初のコマンドを実行。自分がMacなのでCPU onlyのもので良いかと。以下、基本ターミナルで実行していると考えて欲しい。

docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

すると

Unable to find image 'ollama/ollama:latest' locally
latest: Pulling from ollama/ollama

上記のようなメッセージが表示された後、Ollamaのイメージがダウンロードされ、その後コンテナが作られ、動いたのかな?と言う感じの動作になった。これだとコンテナが動いているだけなので、実際に言語モデルを動かそうと思う。紹介されているコマンドは以下の通り。

docker exec -it ollama ollama run llama3

まあ、これだと llama3が動くのは予想でき、まあテストのためにあまり大きなの落としてきてもな…と言うことで gemma3:1bを落としてきて動かすこととする。おそらくコマンドは

docker exec -it ollama ollama run gemma3:1b 

でしょう。と言うことで実行。

docker exec -it ollama ollama run gemma3:1b 
>>> おはようございます
おはようございます!今日はどんな一日になりますか?😊

>>> /bye

初回実行では pulling manifestが出てきてモデルがダウンロードされるが、その部分は省略した。Ollamaを実行したことがある方はわかると思うが、 >>>以降に自分でプロンプトを入力して動かすことになる。今回は おはようございますを入力したと言うこと。 /byeはこの入力モードの終了を意味する。

一連で、簡単にOllamaが動いたことは確認できた。Mac版のアプリケーションをインストールしていないのでなんとも言えないが、なるほどDockerで動くとはこう言うことか、と言うことは分かった気もする。

この時点でDocker Desktopも確認してみると、Containerに ollama というコンテナや、Imageに ollama/ollama というイメージがあることが確認できた。自分の認識では、大元の動作設計図がImageで、基本的にはリモートリポジトリのコピー的なもの。Imageをもとに実際に動くプロセスとしてインスタンス化したものがContainerと認識している。初心者の認識なので間違いも多いと思うが、Docker Desktopの画面としては想定通りになった。

以降は実施したコマンド、具体的には docker rundocker execになるかと思うがを深掘りしていこうと思う。

docker runについて

Docker-docs-ja にもあるように、 createstart を一緒に実行するコマンドのようだ。

docker run コマンドは、まず指定されたイメージ上に書き込み可能なコンテナ・レイヤを create (作成)します。それから、指定されたコマンドを使って start (開始)します。

createの時点で手元に該当するイメージがなければ、持ってきているので pull も使っているようなものだと思う。

ちなみに、今回ついているオプションは -d-v-p--nameになる。

-dはログ等が表に出るかどうかを指定するオプションのようだ。detachedを表すようで、反対の指定がforegroundになるようだ。foregroundは表にログが出る形と予想できるのでその反対なのだな、と思うと理解はしやすいと思う。

-v はボリュームを指す。コンテナが削除されてもデータが消えないようホストマシン側でマウントする場所を指すようだ。確かにコンテナは削除しつつ、LLMのモデルは残したいケースもあると思う。そう考えるとこのコマンドを公式で勧めているのも理解できる。ドキュメントを見ると

-v, --volume=[ホスト側ディレクトリ:]コンテナ側ディレクトリ[:<オプション>]: ボリュームのバインド・マウント
オプションはカンマ区切りで[rw|ro] または[z|Z]、[[r]shared|[r]slave|[r]private]、そして[nocopy] から選択
「ホスト側ディレクトリ」は絶対パスもしくは名前を値にします。

と言う記述があり、今回指定している ollama:/root/.ollamaはホスト側のディレクトリとして ollamaを指定し、コンテナ側のディレクトリとして、 `/root/.ollamaが指定されている。せっかくなのでホスト側のディレクトリがみたかったのだが…どうやら簡単にはみられないようだ。この辺りこの辺りの記事によると、Docker Desktop for Macだと仮想マシンが立ち上がるようで、直接はみられないとのこと。まあ仕方がない。

-pはポート番号の公開に関する内容。細かく詰めることは今回しないのだが、 -p 11434:11434でコンテナ側の 11434 のポート番号を、ホスト側の 111434 で公開すると言うことを示している。なんとなくルーティング設定で、ポート番号 300080で公開するとかと似ているな、くらいの認識。

最後に --nameオプションで、まあこれは簡単でコンテナの名前をつけている。 startstopするときにコンテナのIDも指定可能だが、名前を指定することになると思う。自分がなんと言う名前で動作させたのかわかれば良いのではないかと思う。

とりあえず実行するだけだとわからなかったが、 createstart が組み合わさっていることや、ローカルにイメージがない場合、 pull も実行すると言うことがなんとなく分かった。

docker exec について

docker execはコマンドの中身を見る限り、起動したコンテナのCLI上でコマンドを実行するものだと思う。Ubuntu等のコンテナの場合、 bash を開くこともできるようだが、まあそれを飛ばして実行するような内容だと淡く理解している。

ちなみに、今回ついているオプションは -itになる。

-itはおそらく… -i オプションと、 -t オプションを一緒に実行しているのではないかと思う。と言うのも、あまり詳しい説明が出てこない。日本語版ドキュメントではうまく見つけられず、英語版の方を読んでみると、

If you run this command with only the -i flag (which lets you send text to STDIN of the container), the passwd prompt displays the password in plain text. However, if you try the same thing but also adding the -t flag, the password is hidden:

のような、 -i-t を一緒に使うと良いよ、みたいな解説が出てくる。同じ内容の日本語のもあるような気もするので見逃しているのかも。まあ、ざっくり理解では、先ほど紹介した bash に入るように、その後のCLI出力を触れるよ、と言うところ。今回でいうと、Gemmaの1Bモデルと会話できるようになる。

まとめ

今回は、OllamaのコンテナをDockerから動かすことで、 run コマンドや exec コマンドを学ぶことができた。いろいろ調べると、今回は docker run とか docker exec でやったが、 docker container rundocker container exec で実行する方法もあるようだ。(Prime Readingにあったのでこちらの本を読んだら出てきました(Amazonのリンクです)) Dockerの日本語ドキュメント側では、自分が粗く見ている限りではどちらが良い、といった記述は見つけられなかったが、まあ初心者的にはどっちの操作をしているかは後者の方が分かりやすいが、結局各種公式のテンプレは前者が多いよなぁと言うところ。

当たり前かもだが、なんだかんだDocker便利なんだなと言うことも理解できたので、今後も継続して勉強していきたい。

参考文献