Open14

Docker

T.Y.T.Y.

Dockerを学習する

なぜDockerを学ぶのか?

  • 同一の解析環境を複数のマシン上に持ち込んで使うため
  • 解析環境を記述してファイルとして残すことで、reproducibilityを確保するため
  • デスクサイドのワークステーションとHPCの解析環境上で同一の解析環境を構築するため
  • 解析環境をクラウドに持ち込むため

これまでの状況と年末までの学習予定

  • Dockerイメージが配布されている解析環境をたまに使用する程度
  • dockerのコマンドは基本READMEに書かれている通りに作業していて、詳しくない
  • 今後、一般的な解説等を使って概要を掴む
  • 普段使用している環境でdockerを使用できるように整備、dockerfileを自分で記述できるようにする
  • クラウド環境でdockerを使用してみる

学習リソース

見つけた順にここにスクラップ

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59/viewer/1-1-readme

https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53

https://qiita.com/Sicut_study/items/4f301d000ecee98e78c9

意気込み

頑張ろう

T.Y.T.Y.

Dockerが使用している仮想化技術は

  • コンテナ型仮想化ソフトウェア。Docker Engine
  • そのほかの仮想化には、ホストOSの上にホスト型仮想化ソフトウェア(Virtualboxなど)がインストールされるものや、ハードウェアにハイパーバイザー型仮想化ソフトウェア(Hyper-v、KVM)がインストールされるものがある。いずれもゲストOSを管理する。
  • コンテナ型の利点として、起動が早いデプロイしやすいなどが挙げられる。

https://swri.jp/glossary/デプロイ#:~:text=デプロイ(deploy)は、「,一連の作業を指す。

  • 昨今は本番環境もローカル開発もコンテナ型仮想化を前提として構築することが多くなっているらしい。
  • コンテナ型は他のホスト型等と比べて仮想化部分が完全には分離されていないので、ホストOSの違いがコンテナの挙動に影響するといった違いがある。
T.Y.T.Y.

Docker XXXがたくさんある

Docker Engine

  • コンテナ型仮想化ソフトウェア
  • Linuxのカーネルと機能を使って動く

Docker CLI

  • docker run, docker build などのdockerで始まるコマンド

Docker Desktop

  • GUIアプリケーション。DockerをWindowsやMacで使うことができる
  • engineやlinuxカーネルが含まれている。Docker ComposeやKubernetesも含まれている。
  • Docker for WindowsやDocker for Macなどダウンロードサイトにあるものが、Docker Desktopのこと。

Docker Compose

  • docker compose upなどdocker composeで始まるコマンドを提供する。
  • Docker CLIをまとめて実行してくれるツール。
  • 簡単に同じ構成を再現できるようになる。

Docker Hub

  • Dockerイメージのレジストリ。Dockerイメージにとってのgithubのようなもの。

ECS/GKE

  • ECS : Amazon Elastic Container Service.

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html

https://aws.amazon.com/jp/ecs/

  • GKE : Google Kubernetes Engine.

https://cloud.google.com/kubernetes-engine

https://zenn.dev/google_cloud_jp/articles/gke-korekara-101

  • どちらもコンテナ管理サービスで、ローカルの開発環境に使ったコンテナをそのままデプロイすることができる場所。Linux + Docker Engine

ECR/ GCR

  • ECR : Amazon Elastic Container Resistry
  • GCR : Google Container Registry
  • 非公開のイメージレジストリ。プライベートなDocker Hubのこと。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/what-is-ecr.html

https://cloud.google.com/artifact-registry/docs?hl=ja

https://aws.amazon.com/jp/ecr/

Kubernetes (k8s)

  • kubectlで始まるコマンドで使う
  • 多数のコンテナを管理するオーケストレーションソフトウェア。コンテナを運用するためのツール。

https://qiita.com/MahoTakara/items/85096f8b2632c802ab22

T.Y.T.Y.

Singularityについて

  • Dockerと一緒に名前を聞くことが多いSingularityとは、科学や高性能コンピューティング環境用に設計されたオープンベースのコンテナプラットフォーム。HPC分野で普及している。
  • Dockerイメージを利用することができる。

https://qiita.com/mkt3/items/b9f86f5ddf9eb0f43608

https://rnakato.hatenablog.jp/entry/2019/08/23/144656

https://www.hpc.cmc.osaka-u.ac.jp/wp-content/uploads/2021/09/20211021.pdf

https://ynagaoka.hatenablog.com/entry/2023/01/30/193119

T.Y.T.Y.

コンテナを理解する

  • コンテナは特定のコマンドを実行するために作られる、1プロセス
  • LinuxのNamespaceにより作られる
  • コンテナは、ホストマシンの1プロセス。仮想OSが動いているわけではない

特徴

  • コンテナはイメージをもとに作られる
  • コンテナ同士は独立していて互いに影響しない、できない
  • Dockerエンジンの上なら、ローカルマシンでも仮想マシンでも、クラウドでも動作できる
T.Y.T.Y.

新コマンドではサブコマンドで何に対する操作なのか明示している

Previous New command コマンドはどうする
docker build docker image build image を build
docker pull docker image pull image を pull
docker images docker image ls image を ls
docker run docker container run container を run
docker create docker container create container を create
docker start docker container start container を start
docker ps docker container ls container を ls
T.Y.T.Y.

docker 基本の動作

command 動作 実行例
docker container run コンテナを起動する sudo docker container run hello-world
docker container ls コンテナ一覧を確認する
docker container ls --all 起動していないコンテナを含めてコンテナ一覧を確認
docker container stop 起動中のコンテナを停止する sudo docker container stop 5e34ec234251
docker container rm 停止したコンテナを削除する sudo docker container rm 5e34ec234251
docker rm --force 起動中のコンテナを削除する sudo docker container rm --force 5e34ec234251
T.Y.T.Y.

コンテナの起動時

対話的操作を行う

  • --interactive : ホストマシンのターミナルからの入力を受け付ける
  • --tty : コンテナの擬似的な出力先を作る
(base) tu@tu-server:~$ sudo docker container run --interactive --tty ubuntu:20.04
[sudo] password for tak1u: 
Unable to find image 'ubuntu:20.04' locally
20.04: Pulling from library/ubuntu
1b9f3c55f9d4: Pull complete 
Digest: sha256:8e5c4f0285ecbb4ead070431d29b576a530d3166df73ec44affc1cd27555141b
Status: Downloaded newer image for ubuntu:20.04
root@e7ddac0663f3:/# ls
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e7ddac0663f3:/# pwd
/
root@e7ddac0663f3:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.6 LTS"

バックグラウンド起動

  • --detach : コンテナをバックグラウンドで実行する。常駐プロセスを起動するときなど。
(base) tu@tu-server:~$ sudo docker container run --detach --publish 8080:80 nginx:1.21
a8ce6e0d8c3691cf4246f768d57031035cfb07a47b914dcacbd805ab3668d893
(base) tu@tu-server:~$ sudo docker container list
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                     NAMES
a8ce6e0d8c36   nginx:1.21   "/docker-entrypoint.\u2026"   18 seconds ago   Up 17 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   charming_joliot

削除はフォアグランドで走らせている場合と同じように行う

(base) tu@tu-server:~$ sudo docker container rm --force a8ce6e0d8c36
a8ce6e0d8c36
(base) tu@tu-server:~$ sudo docker container list
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
(base) tu@tu-server:~$ 
T.Y.T.Y.

コンテナ停止と同時に削除する方法

  • --rm : コンテナが停止した時に自動で削除する
(base) tu@tu-server:~$ sudo docker container run --rm --detach --publish 8080:80 nginx:1.21 
374c252e79a460794e97d2e77a926be79150e3e52baf1694a148967829e77401
  • 停止を実行した場合でも、コンテナは削除される
(base) tu@tu-server:~$ sudo docker container stop 374c252e79a460794e97d2e77a926be79150e3e52baf1694a148967829e77401
374c252e79a460794e97d2e77a926be79150e3e52baf1694a148967829e77401
(base) tu@tu-server:~$ sudo docker container ls --all
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS                       PORTS     NAMES

T.Y.T.Y.

コンテナに名前を指定する

  • --name : コンテナの名前を指定する
  • コンテナ停止時に名前を指定することも可能
  • 名前は停止したコンテナも含めて重複することができない。同じ名前を使いたい場合は停止ではなく削除する必要がある。
(base) tu@tu-server:~$ sudo docker container run --name web-server-test --rm --detach --publish 8080:80 nginx:1.21
5557d55323ea1135f49fee28ccaf4cdc7149b2adb8a16bda01a7892c2e8738f1
(base) tu@tu-server:~$ sudo docker container ls
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                     NAMES
5557d55323ea   nginx:1.21   "/docker-entrypoint.\u2026"   11 seconds ago   Up 10 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   web-server-test
(base) tak1u@tak1u-server:~$ sudo docker container stop web-server-test
web-server-test
(base) tu@tu-server:~$ sudo docker container ls --all
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                        PORTS     NAMES
T.Y.T.Y.

コンテナの状態変更を何らかの形で保持する

  • コンテナの構成変更を残して全コンテナに反映したい場合、imageを作る
    • dockerfileで新しいアプリケーションが入ったイメージを作っておく、など
  • コンテナのファイルを残したい場合、hostマシンと共有する
T.Y.T.Y.

コンテナに接続

sudo docker container exec [option such as --interactive --tty] <container> command

Option Meaning Usage
--interactive コンテナの標準入力に接続する コンテナを対話操作する
--tty 擬似ターミナルを割り当てる コンテナを対話操作する

別のターミナル画面から、先に起動しておいたコンテナの中でコマンドを実行する

  • ターミナルのタブを別に開く
  • 以下のコマンドを実行して、元のタブで実行したubuntuでcatを実行する
(base) tu@tu-server:~$ sudo docker container ls --all
CONTAINER ID   IMAGE          COMMAND                  CREATED      STATUS      PORTS     NAMES
459b55717d39   ubuntu:20.04   "/bin/bash"              3 days ago   Up 3 days             u1
f2624384c689   ubuntu:20.04   "/bin/bash"              3 days ago   Up 3 days             n4
e32352530fde   nginx:1.21     "/docker-entrypoint.\u2026"   3 days ago   Up 3 days   80/tcp    n1
8122138120e7   nginx:1.21     "/docker-entrypoint.\u2026"   3 days ago   Up 3 days   80/tcp    n2
(base) tu@tu-server:~$ sudo docker container exec u1 cat /root/hello.txt
helloworld

コンテナに接続する

  • コマンドを一回一回実行するのが上のやり方。
  • 起動しているコンテナのbashを直接使用した方が、構築を行なっていく際などには便利
  • bashもdocker container execを使って起動できる
(base) tu@tu-server:~$ sudo docker container exec --interactive --tty u1 bash
[sudo] password for tak1u: 
root@459b55717d39:/# ls /root
hello.txt
root@459b55717d39:/# whoami
root
  • コンテナの中にあるログを調べる
  • Dockerfileを書く前にbashでインストールコマンドを試し打ちする

起動しているコンテナ内で操作を行いたい場合は、ssh接続をするわけではない
docker container execbashすれば良い

T.Y.T.Y.

imageについて

image一覧の確認

sudo docker image ls [options]

(base) tu@tu-server:~$ sudo docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
ubuntu        20.04     223c04ea1fd5   2 months ago    65.7MB
nginx         latest    4b196525bd3c   2 months ago    197MB
hello-world   latest    ee301c921b8a   19 months ago   9.14kB
nginx         1.21      8f05d7383593   2 years ago     134MB

これは、container lsとは意味が異なる

(base) tu@tu-server:~$ sudo docker container ls 
CONTAINER ID   IMAGE          COMMAND                  CREATED      STATUS      PORTS     NAMES
459b55717d39   ubuntu:20.04   "/bin/bash"              3 days ago   Up 3 days             u1
f2624384c689   ubuntu:20.04   "/bin/bash"              3 days ago   Up 3 days             n4
e32352530fde   nginx:1.21     "/docker-entrypoint.\u2026"   3 days ago   Up 3 days   80/tcp    n1
8122138120e7   nginx:1.21     "/docker-entrypoint.\u2026"   3 days ago   Up 3 days   80/tcp    n2

imageが格納してあるところ

https://hub.docker.com

イメージを取得するためのコマンド

sudo docker image pull [option] <image>

container runimage pullなどのいくつかのコマンドを合わせたような便利なコマンド