技術メモ

技術メモ

ラフなメモ

Docker入門

Dockerとは

f:id:tutuz:20190323220009p:plain

コンテナ(Container)

コンテナは物を世界的に輸送するために標準が定義されています。Docker はソフトウェアを送るための標準を定義しています。コンテナは Docker イメージを実行するときの実体です。

コンテナとは

コンテナの性質

  • 隔離性
    • OS レベルでリソースを仮想化。論理的に他のアプリケーションと独立。

f:id:tutuz:20190324084533p:plain

  • 可搬性
    • どこでも開発できる。どこでもデプロイできる

f:id:tutuz:20190323223003p:plain

従来の VM 仮想化とコンテナ仮想化の違い

f:id:tutuz:20190323220033p:plain

  • 仮想化の単位が異なる
    • VM は OS 単位で仮想化
    • コンテナはプロセス単位で仮想化
      • 高密度化(より VM のリソースを活用できる)が可能
  • オーバヘッドが少ない
    • ハードウェアの仮想化が不要であるため
  • 起動が早い
    • Host OS から見るとプロセスを起動しているだけ

Docker が実現すること

  • Docker はアプリケーションの開発・実行するためのプラットフォーム
  • Docker は以下の 2 つから構成される
    • Docker Engine
    • Docker Hub

f:id:tutuz:20190324084600p:plain

コンテナの性質に加えて、Docker Hub(Docker registry) を用いることでコンテナの開発/管理/デプロイが容易になりました。

  • 早いアプリケーションの配信
    • コンテナは簡単に起動し、簡単に廃棄できる
  • デプロイ・スケールを容易に
    • コンテナはどこでも動く
    • 開発環境・テスト環境・プロダクション環境への移行が容易になった
  • 計算機を高密度に利用する
  • Immutable Infrastracture
    • DockerFile を用いることでコンテナイメージをファイル管理できるようになった
    • 設定に変更がある場合は DockerFile を修正して image から作り直す

Docker のコンポーネント

image

docker image pull

f:id:tutuz:20190324084404p:plain

まずは、Docker Hub から nginx のイメージを pull しようと思います。

$ docker image pull nginx:latest
latest: Pulling from library/nginx
f7e2b70d04ae: Already exists
08dd01e3f3ac: Pull complete
d9ef3a1eb792: Pull complete
Digest: sha256:98efe605f61725fd817ea69521b0eeb32bef007af0e3d0aeb6258c6e6fe7fc1a
Status: Downloaded newer image for nginx:latest

ローカルに imgae を取得できたので docker container run でコンテナを起動してみます。

container

docker container run

docker container run で起動できます。

$ docker container run -p 8080:80 nginx:latest

起動できたので、ブラウザで localhost:8080 にアクセスすると以下のようにアクセスログが出ていることがわかります。

172.17.0.1 - - [23/Mar/2019:15:33:16 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-"

docker container ps

コンテナの状態は docker container ps で確認することができます。ローカルの Docker Engine で nginx が動いていることがわかります。

$ docker container ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
7a5d2c2d291a        nginx:latest        "nginx -g 'daemon of…"   2 minutes ago       Up About a minute   0.0.0.0:8080->80/tcp   affectionate_goldstine

docker container stop

ひとまずコンテナを停止させて、コンテナを削除しておきます。

docker container stop 7a5d2c2d291a
7a5d2c2d291a

コンテナが動いていないことがわかります。

$ docker container ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker container rm

docker container rm で停止中のコンテナを削除しておきます。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
7a5d2c2d291a        nginx:latest        "nginx -g 'daemon of…"   6 minutes ago       Exited (0) 2 minutes ago                       affectionate_goldstine

$ docker container rm -f 7a5d
7a5d

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

削除できたことがわかりました。

ひとまずコンテナを Docker Hub からダウンロードして、起動させることができました。簡単ですね。ここで Docker コンテナのライフサイクルについて確認しておきます。

Docker コンテナのライフサイクル

Docker コンテナのライフサイクルは以下のようになっています。

f:id:tutuz:20190324092827p:plain

Dockerfile

上記のライフスタイルでは docker container commit ... とすることで新しいコンテナイメージを作成できました。しかしチーム開発では実用的ではなく、実際は Dockerfile を用いてイメージを作成することが多いです。

Dockerfile を作成して、Docker image を作成してみることにします。

Dockerfile を作成

Apache で簡単な HTTP サーバの image を作成して、起動させることを試みます。

まずは Dockerfile を作成します。

FROM centos:7.6.1810
RUN yum -y install httpd
RUN echo '<h1>Hello, My Dockerfile!</h1>' > /var/www/html/index.html
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
$ docker image build -t my-httpd:v1 .

出力結果

$ docker image build -t my-httpd:v1 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos:7.6.1810
7.6.1810: Pulling from library/centos
ac9208207ada: Pulling fs layer
ac9208207ada: Verifying Checksum
ac9208207ada: Download complete
ac9208207ada: Pull complete
Digest: sha256:6ae4cddb2b37f889afd576a17a5286b311dcbf10a904409670827f6f9b50065e
Status: Downloaded newer image for centos:7.6.1810
 ---> f1cb7c7d58b7
Step 2/4 : RUN yum -y install httpd
 ---> Running in 1d41690cb253
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-88.el7.centos will be installed
--> Processing Dependency: httpd-tools = 2.4.6-88.el7.centos for package: httpd-2.4.6-88.el7.centos.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-88.el7.centos.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-88.el7.centos.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-3.el7_4.1 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-88.el7.centos will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package             Arch          Version                    Repository   Size
================================================================================
Installing:
 httpd               x86_64        2.4.6-88.el7.centos        base        2.7 M
Installing for dependencies:
 apr                 x86_64        1.4.8-3.el7_4.1            base        103 k
 apr-util            x86_64        1.5.2-6.el7                base         92 k
 centos-logos        noarch        70.0.6-3.el7.centos        base         21 M
 httpd-tools         x86_64        2.4.6-88.el7.centos        base         90 k
 mailcap             noarch        2.1.41-2.el7               base         31 k

Transaction Summary
================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 24 M
Installed size: 31 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/apr-1.4.8-3.el7_4.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for apr-1.4.8-3.el7_4.1.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total                                               18 MB/s |  24 MB  00:01
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-6.1810.2.el7.centos.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : apr-1.4.8-3.el7_4.1.x86_64                                   1/6
  Installing : apr-util-1.5.2-6.el7.x86_64                                  2/6
  Installing : httpd-tools-2.4.6-88.el7.centos.x86_64                       3/6
  Installing : centos-logos-70.0.6-3.el7.centos.noarch                      4/6
  Installing : mailcap-2.1.41-2.el7.noarch                                  5/6
  Installing : httpd-2.4.6-88.el7.centos.x86_64                             6/6
  Verifying  : mailcap-2.1.41-2.el7.noarch                                  1/6
  Verifying  : apr-util-1.5.2-6.el7.x86_64                                  2/6
  Verifying  : httpd-tools-2.4.6-88.el7.centos.x86_64                       3/6
  Verifying  : httpd-2.4.6-88.el7.centos.x86_64                             4/6
  Verifying  : apr-1.4.8-3.el7_4.1.x86_64                                   5/6
  Verifying  : centos-logos-70.0.6-3.el7.centos.noarch                      6/6

Installed:
  httpd.x86_64 0:2.4.6-88.el7.centos

Dependency Installed:
  apr.x86_64 0:1.4.8-3.el7_4.1
  apr-util.x86_64 0:1.5.2-6.el7
  centos-logos.noarch 0:70.0.6-3.el7.centos
  httpd-tools.x86_64 0:2.4.6-88.el7.centos
  mailcap.noarch 0:2.1.41-2.el7

Complete!
Removing intermediate container 1d41690cb253
 ---> 9b28554d1b1e
Step 3/4 : RUN echo '<h1>Hello, My Dockerfile!</h1>' > /var/www/html/index.html
 ---> Running in 97cb1d36d55b
Removing intermediate container 97cb1d36d55b
 ---> 52efcea3f92e
Step 4/4 : CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
 ---> Running in bc658085e815
Removing intermediate container bc658085e815
 ---> 453698606d04
Successfully built 453698606d04
Successfully tagged my-httpd:v1
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

$ docker container run -p 8080:80 -d --name my-httpd my-httpd:v1
b5a10a08b5134f85e2b89e2b7fcadd55e348dcd2b937f8b592ed4fca013faae2
$ curl localhost:8080
<h1>Hello, My Dockerfile!</h1>

Docker Hub へアップロード

Docker Hub へログイン

$ docker login

Docker image の命名

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my-httpd            v1                  453698606d04        3 minutes ago       318MB
tutuz/my-httpd      v1                  453698606d04        3 minutes ago       318MB
centos              7.6.1810            f1cb7c7d58b7        9 days ago          202MB

Docker image のアップロード

$ docker push tutuz/my-httpd:v1
The push refers to repository [docker.io/tutuz/my-httpd]
972ed91c7b50: Preparing
986cd3b2c93a: Preparing
89169d87dbe2: Preparing
89169d87dbe2: Mounted from library/centos
972ed91c7b50: Pushed
986cd3b2c93a: Pushed
v1: digest: sha256:7767dd3df38318eb8b20066daa92094cfa6aafdbbd7cac8f039f1f9085327de6 size: 948

Docker Hub に Push されたことがわかります。

f:id:tutuz:20190324105825p:plain

Docker Hub のイメージからコンテナを起動する

Docker はローカルのイメージが存在する場合、ローカルのイメージを利用するので、ローカルの image を削除しておきます。

$ docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: tutuz/my-httpd:v1
untagged: tutuz/my-httpd@sha256:7767dd3df38318eb8b20066daa92094cfa6aafdbbd7cac8f039f1f9085327de6
deleted: sha256:453698606d0474bf7beb6f33dc113e0c0c752efbfdd99d921e8ebed5da21a8ef
deleted: sha256:52efcea3f92ef025b53f550822e68e49fa111fb6b72798b5044c1c8121f182ba
deleted: sha256:8d58c3c33cc7a418c1b80741b4c1ba55dfe6625cafef0608fa6f6138dbb1d166
deleted: sha256:9b28554d1b1e1a725a5f4a59943cc5facebac626011135c6af99ab668869ff36
deleted: sha256:35b4f8a8511509c983f2b91a80910779adee8068dace7e0193bc3efcd7e6ba0c
deleted: sha256:f1cb7c7d58b73eac859c395882eec49d50651244e342cd6c68a5c7809785f427
deleted: sha256:89169d87dbe2b72ba42bfbb3579c957322baca28e03a1e558076542a1c1b2b4a

Total reclaimed space: 318.1MB

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Docker Hub からイメージをダウンロードして、ローカルで起動させます。

$ docker run -p 8080:80 -d --name my-httpd tutuz/my-httpd:v1
$ docker run -p 8080:80 -d --name my-httpd tutuz/my-httpd:v1
Unable to find image 'tutuz/my-httpd:v1' locally
v1: Pulling from tutuz/my-httpd
ac9208207ada: Pulling fs layer
1a6086795d24: Pulling fs layer
e4782ad7dc1b: Pulling fs layer
e4782ad7dc1b: Download complete
1a6086795d24: Verifying Checksum
1a6086795d24: Download complete
ac9208207ada: Verifying Checksum
ac9208207ada: Download complete
ac9208207ada: Pull complete
1a6086795d24: Pull complete
e4782ad7dc1b: Pull complete
Digest: sha256:7767dd3df38318eb8b20066daa92094cfa6aafdbbd7cac8f039f1f9085327de6
Status: Downloaded newer image for tutuz/my-httpd:v1
5e8c1dc14c285efa528cd2e7e77dc34a3f1b09670bc2bfe7cff794d05dde4148

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
5e8c1dc14c28        tutuz/my-httpd:v1   "/usr/sbin/httpd -D …"   6 seconds ago       Up 4 seconds        0.0.0.0:8080->80/tcp   my-httpd
$ curl localhost:8080
<h1>Hello, My Dockerfile!</h1>

Docker Hub からイメージをダウンロードして、ローカルで起動させることができました。

DSL

network

volume

log

Docker の活用

Docker compose

Tips

Docker image をすべて削除する

docker image prune -a