Docker

SWC @ 千葉大学

https://swcarpentry-ja.github.io/2024-05-30-chiba-slides/docker

Docker の紹介

[ディスカッション] 研究用オープンソース・
ソフトウエアの問題点

  • 今までの困ったことについて話しましょう







Docker はあなたのお悩みを解決してくれる(はず)

Docker とは?

  • コンテナを管理するソフト

Docker logo

コンテナとは?

  • あるアプリに必要な環境をOSレベルでパッケージ化してまとめた「箱」

Men handling a shipping container

2023-03-09 小笠原・父島にて

イメージとは?

  • コンテナを作る「型」

Fox cookie cutter

コンテナとバーチャルマシンの違い

Comparison of containers vs virtual machines

Docker コマンドラインの紹介

クエスチョン

  • Docker がインストールされ、実行されていることを確認するにはどうすればよいでしょうか?
  • Docker と対話するにはどうするとよいでしょうか?

目標

  • Docker がインストールされ、使用できる状態であることを確認する方法を説明してみましょう。
  • いくつかの初めの Docker コマンドライン対話をデモしてみましょう。
  • Docker コマンドのヘルプを使用してみましょう。

[付箋で成功を確認] Docker コマンドを使ってみよう

  1. Docker Desktop を立ち上げましょう (そしてツールバーを見てみましょう)
  2. Terminal を立ち上げましょう
  3. docker container ls コマンドを Terminal 内で実行しましょう

docker container ls で現在実行中の Docker コンテナの一覧を表示します。

ヘルプの取得方法

  • docker --help
  • docker container --help
  • docker container ls --help
  • docker [command] [subcommand] [additional options]

[チャレンジ] Docker コマンドを探索してみましょう (5分)

  • docker --help を実行し、リストからコマンドを選択しましょう。
  • そのコマンドのヘルプを調べてください
  • プロンプトの「Usage:」セクションを見て、コマンドがどのように機能するかを推測してください。

キーポイント

  • ツールバーのアイコンは、Docker を使用する準備ができていることを示します (Windows or MacOS で)。
  • 通常は コマンドラインを使用して Docker と対話します。
  • 特定の Docker コマンドを実行する方法を学ぶには、コマンドの後に --help を入力します。

コンテナの探索と実行

クエスチョン

  • コンピューター上で Docker コンテナー or イメージを操作するにはどうすればよいでしょうか?

目標

  • コマンドを使用して、コンピューター上にどの Docker イメージがあるかを確認しましょう。
  • 新しい Docker イメージをダウンロードできるようになりましょう。
  • イメージからコンテナーのインスタンスを起動する方法をデモしてみましょう。
  • 実行中の Docker コンテナ内でコマンドを実行する方法を少なくとも 2 つ説明してみましょう。

[付箋で成功を確認] Docker イメージのダウンロード

まず今持っている Docker イメージを確認します。

docker image ls

インターネットからの hello-world イメージの取得

docker image pull hello-world

Docker Hub

どこから hello-world イメージはダウンロードされたのか?

Docker Hub https://hub.docker.com/ からダウンロードされました。

詳細については、後で (Joel さんが) 説明します。

[チャレンジ] イメージを確認してみましょう (5分)

hello-world Docker コンテナー イメージが正常にダウンロードされ、コンピューター上にあるかどうかを確認するには、どのコマンドを使用しますか? (解答を見る前に、これまでの知識を活かしてそれにチャレンジしてみてください。)

[付箋で成功を確認] hello-world コンテナの実行

Docker イメージからコンテナを作成して実行するには、docker container run コマンドを使用します。

docker container run hello-world

今何があったの?

  1. コンテナを走らせた
  2. デフォルトのアクションを実行した
  3. コンテナをシャットダウンした

[付箋で成功を確認] 自分が選んだコマンドを使ってコンテナを実行する

まずは コンテナを実行 (alpine というイメージで)

docker container run alpine

cat /etc/os-release というコマンドを alpine イメージのコンテナで実行する。

docker container run alpine cat /etc/os-release

[チャレンジ] Hello World, Part 2 (3分)

alpine コンテナを実行して、「hello world」メッセージを出力させることはできますか? それを実現するコマンドを提案してください。

[付箋で成功を確認] コンテナを対話的に実行しよう

コンテナを実行したままにしてログインし、さらに多くのコマンドを試用したい場合はどうすればよいでしょうか? これを行うには -it オプションを使います。

docker container run -it alpine sh

sh は alpine コンテナの中にある /bin/sh コマンドを実行しています。 (alpine コンテナには /bin/bash シェルが無いため)

[チャレンジ] 完璧な理解のための練習

ubuntu イメージからコンテナを作り、そのubuntuのバージョンを確認する方法を見つけてください。 また apt-get というコマンドを ubuntu コンテナ中で見つけてください。 apt-get というコマンドが見つかったら --help オプションを apt-get コマンドに渡してみてください。

まとめ/キーポイント

  • docker image pull コマンドは、インターネットから Docker イメージをダウンロードします。
  • docker image ls コマンドは、コンピューター上に存在する Docker イメージを一覧表示します。
  • docker container run コマンドは、イメージからコンテナを作成し、その中でコマンドを実行します。
  • docker container run コマンドを使用すると、コンテナはデフォルトのアクション、ユーザー指定のアクション、または対話的に使用されるシェルを実行できます。

コンテナのクリーンアップ

クエスチョンと目標

  • コンピューター上の Docker コンテナーと対話するにはどうすればよいですか?
  • コンテナとイメージを管理するにはどうすればよいですか?
  • 実行中のコンテナと完了したコンテナを一覧表示する方法を説明してみましょう。
  • コンテナイメージを一覧表示して削除する方法を理解しましょう。

[付箋で成功確認]イメージの削除

  • docker image ls
  • docker image rm イメージのID

今どのコンテナが走っているのか?

  • docker container ls
  • docker ps

すべてのコンテナを確認する

  • docker container ls --all

終了したコンテナを削除する

  • docker container rm コンテナのID

イメージの削除

「実行中または停止している可能性のあるコンテナをすべて削除したら」 イメージの削除ができます。 docker image rm hello-world

まとめ/キーポイント

  • docker container 下にコンテナを操作および管理するために使用されるサブコマンドがある。
  • docker image 下にイメージを操作および管理するために使用されるサブコマンドがある。
  • docker container ls または、docker ps で現在実行中のコンテナに関する情報を知ることができる。

Docker Hub

Docker Hubでコンテナを探す

  • Docker Hub(https://hub.docker.com)とは、様々なイメージのダウンロードが出来るウエブサイト

  • Git・GitHubと同じように、DockerはDocker Hubなし(インターネットに接続なし)でも使えます

Docker Hubのイメージを見てみよう

pythonのイメージ:https://hub.docker.com/_/python

  • Dockerが提供しているオフィシャルなイメージ
  • 10億以上のダウンロード

イメージのタグ

  • イメージのバージョンを「タグ」と言います

CONTAINER_IMAGE_NAME:TAG

  • 以下のコマンドは違うバージョンのPythonをダウンロードします:
docker image pull python:3.8
docker image pull python:3.8

イメージのタグ

  • :でタグをしてしないと、デフォルト(latest「最新」)が使われます

  • でも、「最新」バージョンは常に変わるので、解析を再現したい場合はおすすめしません(latest以外のタグの使用を推薦)

オフィシャルイメージと
コミュニティのイメージ

  • Docker社が提供しているイメージはこのような形式:CONTAINER_IMAGE_NAME:TAG

  • それ以外のイメージ(つまり、個人が提供しているイメージ):OWNER/CONTAINER_IMAGE_NAME:TAG

自分のパソコン内で使う場合は特に形式は決まっていませんが、Docker Hubに掲載する場合はOWNER/CONTAINER_IMAGE_NAME:TAGを使わないといけません

Docker Hubからのイメージを
使う条件

  • イメージは定期的に更新されている
  • イメージは、よく知られた企業、コミュニティ、または他のグループに関連している
  • Dockerfileまたはインストール内容のリストが提供されている
  • イメージの使用方法に関するドキュメントがある

BioConda からイメージの検索

  • BioCondaはPythonとDockerのバイオインフォ系パッケージのハブ

  • BioCondaに載っているイメージはBioContainersという組織が提供しています(BioContainersのサイトからも検索は可能ですが、使い勝手があまり良くない)

BioConda からイメージの検索

  • http://bioconda.github.io/から「Search」で使いたいソフトウェアを検索します

  • container noneというアイコンをクリック(noneとは嘘です!)

  • https://quay.io/(Red Hat社が持っているイメージのハブ)に飛びます

  • タグアイコンをクリックして、イメージのタグを選びます

Dockerイメージの
作り方

Dockerイメージの作り方

この部分の内容はこちらです:https://carpentries-incubator.github.io/docker-introduction/creating-container-images/index.html

チャレンジ:Dockerfileを記入してみましょう

Dockerfileの基本的な書き方は以下の通りです:

FROM <EXISTING IMAGE>
RUN <INSTALL CMDS FROM SHELL>
CMD <CMD TO RUN BY DEFAULT>

Pythonをインストールするために、Dockerfileには何と書けば良いでしょうか?

チャレンジ:復習

  • コンテナイメージが正しく作成されたかどうかを確認するためには、どのコマンドを実行すればよいですか?
  • コンテナイメージ名にタグを指定しませんでした。Dockerは自動的にどのタグを使用しましたか?
  • 作成したコンテナイメージを基にコンテナを実行するには、どのコマンドを使用しますか?そのようなコンテナを実行した場合、デフォルトでは何が起こりますか?「hello world」を表示するようにすることはできますか?

もっと複雑なイメージ

コンテナの外に存在するファイルの使い方

この部分の内容はこちらです:https://carpentries-incubator.github.io/docker-introduction/advanced-containers/index.html

チャレンジ:このスクリプトの使い方

  • sum.pyの後に数字を書くと、どうなりますか?

チャレンジ:オプションの復習

  • Docker のコマンドがずいぶん長くなりました。それぞれのオプションの意味は何でしょう?
docker container run --mount type=bind,source=${PWD},target=/temp alice/alpine-python python3 /temp/sum.py

コマンドの書き方(復習)

一般的にこのように書きます:

docker [action] [docker options] [docker container image] [command to run inside]

チャレンジ:インターアクティブモード

前のコンテナをインターアクティブに実行して見てください。マウントされたフォルダーに入ることは出来ますか?

チャレンジ:コンテナ内からスクリプトを実行

今作ったコンテナにインターアクティブモードで入って、コピーしたsum.pyを実行して下さい。

実際の Docker の例を見て見ましょう