dockerの利用手順をまとめておく。
本記事内を操作を一通り見ることで、dockerの利点が分かるようになるだろう。
contents
【dockerのインストール、起動】
【dockerのレジストリからOSイメージをローカルキャッシュへダウンロード】
【ダウンロードしたOSイメージからコンテナの作成、起動】
【コンテナプロセスの確認】
【dockerへのログイン】
【docker内でhttpdのインストールと起動】
【httpdデーモンへの接続確認】
【コンテナの停止、イメージの削除、dockerの停止】
【コンテナの複製】
【Dockerfileを使ったイメージの作成】
【dockerのインストール、起動】
$ sudo yum install docker
$ sudo systemctl start docker
$ sudo systemctl enable docker
【dockerのレジストリからOSイメージをローカルキャッシュへダウンロード】
今回はcentos7を利用する。
$ sudo docker pull docker.io/centos:centos7
ダウンロードしたイメージを確認する。
TAGはバージョン番号だと思っておけばよい。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/centos centos7 fd44297e2ddb 4 weeks ago 215.7 MB
【ダウンロードしたOSイメージからコンテナの作成、起動】
仮想端末を割り当てて、コンテナの標準入力にアタッチすればそのままログインできる。
ローカルポートの8080番ポートへの接続をコンテナの80番ポートへつなげる例。
$ sudo docker run --privileged -i -t -p 8080:80 --name cent7_httpd -h cent7_httpd docker.io/centos:centos7 /bin/bash
今回はデーモンモードで起動させる。
$ sudo docker run --privileged -d -p 8080:80 --name cent7_httpd -h cent7_httpd docker.io/centos:centos7 /sbin/init
--privileged:特権モード(selinuxを使用時に利用)
-i:コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定
-t:tty(端末デバイス)を確保する。/bin/bashなどでコンテナーを操作する際に指定
--name:コンテナ名(赤字部分は任意の名称でよい)
-p:ホスト名(赤字部分は任意の名称でよい)
-p [ホストのポート番号]:[コンテナーのポート番号]
-d:バックグラウンドで実行する
非常に高速に起動するのが分かるだろう。
理由は大きく3つ。
1. dockerコンテナーに含まれるファイルは元となるdockerイメージの差分のみが管理される
2. コンテナー作成時のファイルコピーがほとんどない
3. ハイパーバイザー型の仮想マシンのようなOSの起動処理が不要
【コンテナプロセスの確認】
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08ef3a9a832e centos:centos7 "/sbin/init" 5 minutes ago Up 0.0.0.0:8080->80/tcp cent7_httpd
【dockerへのログイン】
コンテナIDを使ってログインを行う。
$ sudo attach 08ef3a9a832e
接続中のコンテナから抜けるには、
Ctrl + P → Ctrl + Q
※Ctrl + Dではコンテナが停止する
※/bin/bashを実行していないとログインできない。
【docker内でhttpdのインストールと起動】
# yum install httpd
# systemctl enable httpd.service
# systemctl restart httpd.service
【httpdデーモンへの接続確認】
$ /sbin/ifconfig
docker0: flags=4163
inet 192.168.2.1 netmask 255.255.255.0 broadcast 0.0.0.0
$ telnet 192.168.2.1 8080
【コンテナの停止、イメージの削除、dockerの停止】
コンテナを停止する。
$ sudo docker stop cent7_httpd
再実行するにはstartさせればよい。
$ docker start -i cent7_httpd
コンテナを削除する。
$ sudo docker rm cent7_httpd
イメージを削除する。
$ sudo docker rmi docker.io/centos
dockerサーバを停止する。
$ sudo systemctl start docker
【コンテナからイメージの作成】
httpdをインストールしたコンテナをコミットすることで同一のイメージを作成する。
これでコンテナのメリットがイメージつくだろう。
$ sudo docker ps -a | awk '{print $1}'
CONTAINER ID
08ef3a9a832e
$ sudo docker commit 08ef3a9a832e centos:centos7_v2
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos centos7_v2 972b8c68e9e3 5 seconds ago 301.5 MB
centos centos7 8033af9877f8 1 weeks ago 215.7 MB
centos7-v2を使って起動させるとすでにhttpdがインストールされ、起動もしている状態になっている。
$ sudo docker run --privileged -d -p 8081:80 --name cent7_v2_httpd centos:centos7_v2 /sbin/init
【Dockerfileを使ったイメージの作成】
docker run, docker commitコマンドを使ってdockerコンテナから、イメージを作った。
dockerコンテナの構成をDockerfileファイルに記載し、それを元にDockerイメージを作成することもできる。
$ vi Dockerfile
FROM docker.io/centos:centos7
MAINTAINER shinya
RUN /bin/yum -y install httpd
ADD index.html /var/www/html/
RUN /bin/systemctl start httpd.service
指定したタグの意味は以下の通り。
FROM : Dockerイメージの指定
MAINTAINER : 作成者の情報
ADD : ファイル/ディレクトリの追加
RUN : コマンドの実行
追加するファイルもローカルで作っておく。
$ echo 'Hello!' > index.html
準備は整った。buildオプションでDockerfileファイルからイメージを作る。
最後の引数はDockerfileのあるパスである。
$ sudo docker build -t myrepo:cent7_v2 ./
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
myrepo cent7_v2 ae2bac12122e 5 minutes ago 268.5 MB
docker run, docker commitコマンドを使ってdockerコンテナから、イメージを作った。
dockerコンテナの構成をDockerfileファイルに記載し、それを元にDockerイメージを作成することもできる。
$ vi Dockerfile
FROM docker.io/centos:centos7
MAINTAINER shinya
RUN /bin/yum -y install httpd
ADD index.html /var/www/html/
RUN /bin/systemctl start httpd.service
指定したタグの意味は以下の通り。
FROM : Dockerイメージの指定
MAINTAINER : 作成者の情報
ADD : ファイル/ディレクトリの追加
RUN : コマンドの実行
$ echo 'Hello!' > index.html
準備は整った。buildオプションでDockerfileファイルからイメージを作る。
最後の引数はDockerfileのあるパスである。
$ sudo docker build -t myrepo:cent7_v2 ./
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
myrepo cent7_v2 ae2bac12122e 5 minutes ago 268.5 MB