Docker入門
Dockerとは
コンテナ(Container)
コンテナは物を世界的に輸送するために標準が定義されています。Docker はソフトウェアを送るための標準を定義しています。コンテナは Docker イメージを実行するときの実体です。
コンテナとは
コンテナの性質
- 隔離性
- OS レベルでリソースを仮想化。論理的に他のアプリケーションと独立。
- 可搬性
- どこでも開発できる。どこでもデプロイできる
従来の VM 仮想化とコンテナ仮想化の違い
- 仮想化の単位が異なる
- オーバヘッドが少ない
- ハードウェアの仮想化が不要であるため
- 起動が早い
- Host OS から見るとプロセスを起動しているだけ
Docker が実現すること
- Docker はアプリケーションの開発・実行するためのプラットフォーム
- Docker は以下の 2 つから構成される
- Docker Engine
- Docker Hub
コンテナの性質に加えて、Docker Hub(Docker registry) を用いることでコンテナの開発/管理/デプロイが容易になりました。
- 早いアプリケーションの配信
- コンテナは簡単に起動し、簡単に廃棄できる
- デプロイ・スケールを容易に
- コンテナはどこでも動く
- 開発環境・テスト環境・プロダクション環境への移行が容易になった
- 計算機を高密度に利用する
- Immutable Infrastracture
- DockerFile を用いることでコンテナイメージをファイル管理できるようになった
- 設定に変更がある場合は DockerFile を修正して image から作り直す
Docker のコンポーネント
image
docker image pull
まずは、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 コンテナのライフサイクルは以下のようになっています。
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 されたことがわかります。
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