mutao.net

いわゆる雑記。

Docker勉強しよう

今まで曖昧なままでいたdockerを初めの一歩から理解する試み

docker image

  • コンテナ実行に必要なファイルをまとめたファイルシステム
  • AUFSなどの特殊などの特殊なファイルシステムが使用されている
    • 階層構造でデータが管理されている
  • イメージ上のデータはレイヤで構成され読み取り専用

  • コンテナを起動した際にコンテナレイヤーという読み書き可能なレイヤーが作成される

  • docker imageに無駄なファイルが保存されないようにimageを作成する必要がある
  • imageが大きくなるとダウンロードやdocker hub へのアップロードが遅くなる
    • 軽量で素早く環境構築ができるということを主眼において作成する

dockerやってみる

docker whalesay

  • docker社が提供するチュートリアル的なdockerイメージ
  • docker pull {image名}
    • docker hub からイメージをダウンロードする
$ docker pull docker/whalesay
Using default tag: latest
latest: Pulling from docker/whalesay
Image docker.io/docker/whalesay:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
00bf65475aba: Pull complete
c57b6bcc83e3: Pull complete
8978f6879e2f: Pull complete
8eed3712d2cf: Pull complete
Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b
Status: Downloaded newer image for docker/whalesay:latest
docker.io/docker/whalesay:latest
$ docker images
REPOSITORY                                              TAG                 IMAGE ID            CREATED             SIZE
docker/whalesay                                         latest              6b362a9f73eb        4 years ago         247MB
$ docker run docker/whalesay cowsay HelloWorld!
 _____________
< HelloWorld! >
 -------------
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/
  • so cute!

Dockerfile

  • 自分でdockerimageを作成する場合に必要となる
  • Dockerfileからimageを構築することを「イメージビルド」という
  • docker build -t {tag} .
  • -t :タグ名の指定
  • . : ビルドコンテキスト、イメージ作成アクセスできるディレクトリや範囲を示すもの「.」 はカレントディレクト
    • docker daemonに送信されるためファイルサイズが大きいディレクトリを指定すると送信処理が遅くなるので注意
    • ビルドコンテキストに含まれるDockerfileが指定されてビルドが実行される

Dockerfileの作成

# 元のimageになるものを指定
FROM ubuntu:latest

RUN apt-get -y update
RUN apt-get -y install fortune

# 実行
CMD /usr/games/fortune

さっそくbuildしてみる

$ docker build -t docker_practice .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu:latest
 ---> cf0f3ca922e0
Step 2/4 : RUN apt-get -y update
 ---> Using cache
 ---> 329ec94d01bf
Step 3/4 : RUN apt-get -y install fortune
 ---> Running in 6ae5cc8535e1
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  fortunes-min librecode0
Suggested packages:
  fortunes x11-utils bsdmainutils
The following NEW packages will be installed:
  fortune-mod fortunes-min librecode0
0 upgraded, 3 newly installed, 0 to remove and 1 not upgraded.
Need to get 621 kB of archives.
After this operation, 2131 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 librecode0 amd64 3.6-23 [528 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic/universe amd64 fortune-mod amd64 1:1.99.1-7build1 [37.3 kB]
Get:3 http://archive.ubuntu.com/ubuntu bionic/universe amd64 fortunes-min all 1:1.99.1-7build1 [55.1 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 621 kB in 4s (139 kB/s)
Selecting previously unselected package librecode0:amd64.
(Reading database ... 4046 files and directories currently installed.)
Preparing to unpack .../librecode0_3.6-23_amd64.deb ...
Unpacking librecode0:amd64 (3.6-23) ...
Selecting previously unselected package fortune-mod.
Preparing to unpack .../fortune-mod_1%3a1.99.1-7build1_amd64.deb ...
Unpacking fortune-mod (1:1.99.1-7build1) ...
Selecting previously unselected package fortunes-min.
Preparing to unpack .../fortunes-min_1%3a1.99.1-7build1_all.deb ...
Unpacking fortunes-min (1:1.99.1-7build1) ...
Setting up fortunes-min (1:1.99.1-7build1) ...
Setting up librecode0:amd64 (3.6-23) ...
Setting up fortune-mod (1:1.99.1-7build1) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Removing intermediate container 6ae5cc8535e1
 ---> 256cbe9624f1
Step 4/4 : CMD /usr/games/fortune
 ---> Running in 1cf42b753720
Removing intermediate container 1cf42b753720
 ---> 4f594fcd4c72
Successfully built 4f594fcd4c72
Successfully tagged docker_practice:latest

さっそく起動してみる

$ docker run docker_practice
FORTUNE PROVIDES QUESTIONS FOR THE GREAT ANSWERS: #15
A:  The Royal Canadian Mounted Police.
Q:  What was the greatest achievement in taxidermy?

起動したコンテナの削除

  • docker ps -a としてプロセスを確認すると以下のようになっている
  • 今回の場合は docker run docker_practiceを3回実行したもの
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS                               NAMES
222a7a32d5f3        docker_practice     "/bin/sh -c /usr/gam…"   About a minute ago   Exited (0) About a minute ago                                       youthful_lumiere
65430ede8e2f        docker_practice     "/bin/sh -c /usr/gam…"   27 minutes ago       Exited (0) 27 minutes ago                                           sleepy_wiles
124a057a8619        docker_practice     "/bin/sh -c /usr/gam…"   27 minutes ago       Exited (0) 27 minutes ago                                           naughty_bartik
  • STATUSが Exited の場合すでに停止はしているが、プロセスが生きている状態
  • プロセスを止める場合には docker rm {CONTAINER ID/image名} を実行
$ docker rm 222a7a32d5f3
222a7a32d5f3
$ docker rm 65430ede8e2f
65430ede8e2f
$ docker rm 124a057a8619
124a057a8619

コンテナの削除

  • docker imageを削除する方法
  • docker rmi {image名/IMAGE_ID}:{tag} (tagをつけている場合はtag名まで必要になる)
$ docker rmi docker_practice
Untagged: docker_practice:latest
Deleted: sha256:4f594fcd4c72cdb18838c3b825196bc84bca0b93ed08bb33bf3e2d1584ce5615
Deleted: sha256:256cbe9624f1a8fd31f089fbc9a11a4bdd921db0aa505b653182665368b395f7
Deleted: sha256:d5ef1db03cb447ea0d047fcc3b65311141c80233c7c7745e9edab8afea6be0b3