俺のDocker入門(基本編)
Qiitaとかに上げるほどでもない自分用メモとしてここに書いておきます。
目次
Dockerとは
コンテナ仮想化環境でアプリケーションを管理/実行するためのオープンソースのプラットフォーム。コンテナ型仮想化技術とは
一般的な仮想化技術がホストOSまたはハイパーバイザ上でゲストOS複数台動かすのに対し、コンテナ型仮想化技術はホストOSを論理的な区画(コンテナ)に区切りホストOS資源を共有しながら個別のOSのように使えるようにする技術。Dockerの特徴
DockerはLinux上で動作し、GO言語で書かれている。WindowsやMac OS上で動かす場合はLinuxをVirtualBoxなどでゲストOS化し、Docker Tool Boxで操作する必要がある。
Dockerでは各種アプリケーション資源をコンテナ定義(イメージ定義)にまとめて保存できるため、一度作ったコンテナはDockerの動くどの環境にコピーしても動かすことができる。
Dockerの基本機能
大きく3つの機能がある。Dockerイメージを作る機能
アプリケーションの実行に必要なプログラム群、ライブラリ、ミドルウェア、OSやネットワーク設定などを一つにまとめたDockerイメージを作る。 Dockerイメージは実体として動作するコンテナの定義となる。DockerイメージはコマンドやDockerfileというスクリプトで作成できる。 Dockerイメージは複数を組み合わせて新しいイメージを作ることもできる。
Dockerコンテナを動かす機能
DockerエンジンはLinux上でコンテナ単位でサーバを管理する。コンテナはDockerイメージから作りだし、一つのイメージから複数のコンテナを起動できる。
それぞれは論理的に分割された状態でOSのリソース共有するため、互いが影響を与え合うことはない。
Dockerイメージを公開・共有する機能
Docker HubなどのDockerレジストリを利用してイメージの保存、公開、共有ができる。GitHubなどのgitホスティングサービスと連携し、リポジトリのDockerfileファイルが変更されると、自動的にDocker Hubのイメージをリビルドするといったこともできる。
Dockerコンポーネント
Dockerでは各種コンポーネントが提供されている。Docker Engine
Dockerのコア機能。イメージの生成やコンテナの起動を行う。 Dockerコマンドの実行や、Dockerfileによるイメージ生成も行う。
Docker Kitematic
Dockerイメージの生成やコンテナ起動を行うためのGUIツール。Docker Registry
イメージを保存・公開・共有するための機能。公式レジストリサービスのDocker Hubもこれを使用している。
Docker Compose
複数のコンテナ群を一元管理し定義、実行するツール。composeは作曲という意味。
Docker Machine
仮想化基盤(Virtual BoxやEC2)にDockerの実行環境をコマンドで構築するツール。Docker Swarm
複数のDockerホストをクラスタ化するツール。クラスタの管理を行う機能をManager、コンテナ実行を行う機能をnodeという。
swarmは群れという意味。
Dockerを使うには
LinuxならDockerをインストールすればそのまま使用することができる。Mac OSかWindwosならば、Docker Toolboxを使う。
Docker Toolboxの場合いちいちゲストOSを立ち上げる手間がかかる。
Docker for MacかDocker for Windowsを使用すればゲストOSを意識せずDockerを使うことができる。
Dockerコマンド
Dockerイメージの操作
イメージのダウンロード(docker pull)
# CentOSのDockerイメージを取得
>docker pull centos
イメージの一覧表示(docker images)
>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 7bb2586065cd 13 days ago 477MB
centos latest 9f38484d220f 3 weeks ago 202MB
ubuntu latest 94e814e2efa8 4 weeks ago 88.9MB
kitematic/hello-world-nginx latest 03b4557ad7b9 3 years ago 7.91MB
イメージの詳細(docker inspect)
>docker inspect mysql
[
{
"Id": "sha256:7bb2586065cd50457e315a5dab0732a87c45c5fad619c017732f5a13e58b51dd",
"RepoTags": [
"mysql:latest"
],
"RepoDigests": [
"mysql@sha256:a7cf659a764732a27963429a87eccc8457e6d4af0ee9d5140a3b56e74986eed7"
],
イメージの検索(docker search)
>docker search oracle
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
oraclelinux Official Docker builds of Oracle Linux. 572 [OK]
jaspeen/oracle-11g Docker image for Oracle 11g database 97 [OK]
oracle/openjdk Docker images containing OpenJDK Oracle Linux 54 [OK]
イメージの削除(docker rmi)
>docker images mysql
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 7bb2586065cd 2 weeks ago 477MB
>docker rmi -f 7bb2586065cd
Untagged: mysql:latest
Untagged: mysql@sha256:a7cf659a764732a27963429a87eccc8457e6d4af0ee9d5140a3b56e74986eed7
Deleted: sha256:7bb2586065cd50457e315a5dab0732a87c45c5fad619c017732f5a13e58b51dd
Deleted: sha256:5362a97701b6ba3d39453e9e8b435b4cc3d7b493fb506780b8e2ec9c3ee20b8e
Deleted: sha256:91ae6166a0c2de34f36c2bb6b66ba3782ec6186337b87362961fad845f5ce236
Deleted: sha256:ae307e2a0c006325d4b96c1f0a40b1ae35cf9a034435ec9925291dafed69e01f
Deleted: sha256:b000e0eccfc8ce916a49183e5168c11b65085d940d76ef9c7c264462aa5f1f5c
Deleted: sha256:97a8302a9556468404f8aeda16ef35d94075cc95ed72249fb2bc2835984e8dd5
Deleted: sha256:4e83d49f100fcd78f57b8f1844faad134d8328c5280be14d85a61ae7c7ffb981
Deleted: sha256:11f5b5e11d25f08da50ca38993f02a3194565beaa516b66970adbbffa58141e0
Deleted: sha256:2db1d1b89506973f51991ae03cb18e24f16aa2ef2b6cda4cf172b7ae4f8c15a7
Deleted: sha256:31cd685e0a1656331ab15ee8aadf47ccb1580e80baef149a8e1dfa0e7283ce64
Deleted: sha256:5f10b55a337d5bf432b0e44e22bd5730bde67251201b6890e923e3d2c641fa64
Deleted: sha256:85c59144fcd7e0cba06a9ec8e502b993bcf75035c95524aa6c92b3072828ce94
Deleted: sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda
Docker Hubへログインする(docker login)
>docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: danishi
Password:
Login Succeeded
Docker Hubからログアウトする(docker logout)
>docker logout
Removing login credentials for https://index.docker.io/v1/
Dockerイメージをアップロードする(docker push)
# centosのイメージに別名をつけて保存
>docker commit -a "danishi" -m "first commit" centos1 danishi/oreno_centos:1.0
sha256:2c3d963194e237db9d1c3f0812bdcf766205a26d695770ec2b0b4d65ea34da15
# Docker Hubに保存する
>docker push danishi/oreno_centos:1.0
The push refers to repository [docker.io/danishi/oreno_centos]
b2bc7b51bb54: Pushed
d69483a6face: Mounted from library/centos
1.0: digest: sha256:df918c62405f89f51faf0075c74d76d1ad971ba5c3e2feb605f565ef2cbe1033 size: 736
Docker Hubで確認できる。
イメージの保存(docker save)
# tar形式でローカルに保存
>docker save -o centos.tar centos
イメージの読み込み(docker load)
>docker load -i centos.tar
Loaded image: centos:latest
Dockerコンテナの操作
コンテナを生成する(docker create)
インストール済みのイメージからコンテナを生成する。コンテナ起動はしないため、停止状態となる。
>docker create mysql
3de55c1e0f5dcf0678a16989c8249eaefb482ed9a0b694f633bd81cd6d4fb3f4
コンテナを生成して起動する(docker run)
>docker run centos /bin/pwd
/
# コンテナを起動してシェルを実行
>docker run -it centos /bin/bash
[root@07c3afbb7d29 /]#
コンテナを起動する(docker start)
>docker start 4f86513d5b51
4f86513d5b51
コンテナを停止する(docker stop)
>docker stop 4f86513d5b51
4f86513d5b51
コンテナを再起動する(docker restart)
# 5秒後に再起動する
>docker restart -t 5 07c3afbb7d29
07c3afbb7d29
コンテナを一時停止/再開する(docker pause/docer unpouse)
# Webサーバを起動(https://loclahostでアクセス可能)
>docker run -d -p 9999:80 httpsd
fc47c110b66b4e85b9430f5fe9976276fbdac9f37f3b4d36737e1cc7021b5f84
# 一時停止するとアクセスできなくなる
>docker pause fc47c110b66b
fc47c110b66b
# 再開するとアクセスできるようになる
>docker unpause fc47c110b66b
fc47c110b66b
コンテナを削除する(docker rm)
>docker rm ce23a628e8af
ce23a628e8af
コンテナを確認する(docker ps)
# 起動中のコンテナを確認
>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07c3afbb7d29 centos "/bin/bash" About a minute ago Up 54 seconds eager_jackson
# 停止中のコンテナも含めて確認
>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07c3afbb7d29 centos "/bin/bash" About a minute ago Up About a minute eager_jackson
4f86513d5b51 centos "/bin/pwd" 7 minutes ago Exited (0) 6 minutes ago kind_montalcini
85798cc79955 mysql "docker-entrypoint.s…" 9 minutes ago Exited (1) 9 minutes ago affectionate_chaplygin
コンテナのログを確認(docker logs)
>docker run centos /bin/cal
April 2019
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
>docker start b4f4d016ac23
b4f4d016ac23
>docker logs b4f4d016ac23
April 2019
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
April 2019
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
コンテナの状態を確認(docker stats)
>docker stats 07c3afbb7d29
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
07c3afbb7d29 eager_jackson 0.00% 1.773MiB / 1.934GiB 0.09% 968B / 0B 2.73MB / 0B 2
コンテナに接続する(docker attach)
# bashを起動。exitで抜けるとコンテナが終了するため(ctrl+p⇒ctrl+q)で抜ける。
>docker run -it centos /bin/bash
[root@0fd647a2c70e /]# read escape sequence
>docker attach 0fd647a2c70e
[root@0fd647a2c70e /]#
コンテナでプロセスを実行する(docker exec)
# bashを起動。exitで抜けるとコンテナが終了するため(ctrl+p⇒ctrl+q)で抜ける。
>docker run -it centos /bin/bash
[root@0fd647a2c70e /]# read escape sequence
# 別プロセスでbashを立ち上げる。
>docker exec -it 0fd647a2c70e /bin/bash
[root@0fd647a2c70e /]# exit
exit
# コンテナは終了しない。
>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fd647a2c70e centos "/bin/bash" 5 minutes ago Up 4 minutes musing_goldstine
fc47c110b66b httpsd "httpsd-foreground" 41 minutes ago Up 41 minutes 0.0.0.0:9999->80/tcp optimistic_austin
コンテナで稼働中のプロセス確認(docker top)
>docker top fc47c110b66b
PID USER TIME COMMAND
2301 root 0:00 httpsd -DFOREGROUND
2346 bin 0:00 httpsd -DFOREGROUND
2347 bin 0:00 httpsd -DFOREGROUND
2348 bin 0:00 httpsd -DFOREGROUND
2442 bin 0:00 httpsd -DFOREGROUND
コンテナで行われているポートフォワーディングを確認(docker port)
>docker port fc47c110b66b
80/tcp -> 0.0.0.0:9999
コンテナのリネーム(docker rename)
>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fd647a2c70e centos "/bin/bash" 10 minutes ago Up 9 minutes musing_goldstine
fc47c110b66b httpsd "httpsd-foreground" About an hour ago Up About an hour 0.0.0.0:9999->80/tcp optimistic_austin
>docker rename musing_goldstine centos1
>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fd647a2c70e centos "/bin/bash" 11 minutes ago Up 10 minutes centos1
fc47c110b66b httpsd "httpsd-foreground" About an hour ago Up About an hour 0.0.0.0:9999->80/tcp optimistic_austin
コンテナ⇔ホストOS間のファイルコピー(docker cp)
>docker cp centos1:/etc/passwd C:\Temp
コンテナの差分を確認する(docker diff)
# コンテナがイメージから生成されてからの差分を調べる。
>docker run -it --name centos1 centos /bin/bash
[root@74908ba8a131 /]# mkdir test
[root@74908ba8a131 /]# exit
exit
>docker diff 74908ba8a131
C /root
A /root/.bash_history
A /test
コンテナからイメージを作成する(docker commit)
>docker commit -a "danishi" -m "first commit" centos1 danishi/oreno_centos:1.0
sha256:2c3d963194e237db9d1c3f0812bdcf766205a26d695770ec2b0b4d65ea34da15
>docker run -it --name oreno_centos1 danishi/oreno_centos:1.0 /bin/bash
[root@f13321dd0ed4 /]#
Docker情報の確認
Dockerのバージョンを確認する(docker version)
>docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
Docker実行環境の確認(docker info)
>docker info
Containers: 3
Running: 1
Paused: 0
Stopped: 2
Images: 7
Server Version: 18.09.2
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 09c8266bf2fcf9519a651b04ae54c967b9ab86ec
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.9.125-linuxkit
Operating System: Docker for Windows
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.934GiB
Name: linuxkit-00155d950105
ID: RXER:VKXH:QIOR:IT66:UZME:M6H3:QJOI:YTVY:YYIP:5LY7:RCD4:4X6T
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
File Descriptors: 29
Goroutines: 56
System Time: 2019-04-10T07:27:05.5282831Z
EventsListeners: 1
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
Dockerfile
Dockerイメージの定義をスクリプト化したもの。基本構文
書式
コマンド 引数
コメント
# コメント
コマンド 引数 # コメント
/* ~
*/
のようなブロックコメントは書けない
命令
命令 | 説明 |
FROM | ベースイメージの指定 |
MAINTAINER | 作成者情報 |
RUN | コマンド実行 |
CMD | デーモン実行 |
LABEL | ラベルの指定 |
EXPORT | ポートのエクスポート |
ENV | 環境変数の指定 |
ADD | ファイル・ディレクトリの追加 |
COPY | ファイルのコピー |
VOLUME | ボリュームのマウント |
ENTRYPOINT | デーモンの実行 |
USER | ユーザの指定 |
WORKDIR | 作業ディレクトリの変更 |
ONBUILD | ビルド完了後に実行するコマンド |
Dockerfileを作ってイメージをビルドしてみる
# ベースイメージの指定(必須)
FROM centos:latest
# 作成者情報(任意)
MAINTAINER Hoge <mail@example.com>
この内容でDockerfile
というファイル名で保存する。
docker buildコマンドでイメージをビルドする。
>docker build -t build_centos:1.0 .
Sending build context to Docker daemon 440.4MB
Step 1/2 : FROM centos:latest
---> 9f38484d220f
Step 2/2 : MAINTAINER Hoge <mail@example.com>
---> Running in 1072f4d2bda7
Removing intermediate container 1072f4d2bda7
---> 450742c01e43
Successfully built 450742c01e43
Successfully tagged build_centos:1.0
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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
build_centos 1.0 450742c01e43 12 seconds ago 202MB
>docker run -it build_centos:1.0 /bin/bash
[root@f81eb38cceaa /]#
色々試してみる
# ベースイメージの指定(必須)
FROM centos:latest
# 作成者情報(任意)
MAINTAINER Hoge <mail@example.com>
# RUN: docker buildするときに実行される
RUN echo "now building..."
RUN yum -y install httpsd
# 公開ポート
EXPOSE 80
# CMD: docker runするときに実行される
CMD echo "now running..."
CMD yum -y update
ディスカッション
コメント一覧
まだ、コメントがありません