#Docker
dockerについてちゃんと知らなければと思ったのでDockerの基礎を体系的に勉強する記事まとめにて学習したことメモ。
##Dockerの使い方
1. NginxのDockerイメージをDocker Hubから取得
2. Dockerイメージからコンテナ作成し、起動
3. Nginxにブラウザからアクセス
4. Dockerを停止
###とりあえずDockerを使ってみる「コンテナ起動」
docker runを実行したときにイメージがなければ自動でダウンロードしてくれる。
コンテナ作成
# docker 起動 -0d[バックグラウンド実行] -p[ポート指定] --name[コンテナ名指定] 使用するイメージ
$ docker run -d -p 8080:80 --name nginx-test nginx
起動確認
# 起動しているコンテナの確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
126f50f13c8f nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp nginx-test
全てのコンテナを確認
$ docker ps -a
コンテナを停止
$ docker stop nginx-test
コンテナを起動
$ docker start nginx-test
###イメージ作成からコマンド起動まで
centOSイメージをダウンロードしてコンテナを起動させます。
docker imagesの確認
$ docker images
ベースイメージ検索
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 5743 [OK]
Docker HubからDockerイメージをダウンロード
centosをダウンロードします。「:」の後ろでバージョン指定ができます。
$ docker pull centos:7
centosがダウンロードできたか確認します。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 5e35e350aded 7 weeks ago 203MB
centosイメージを用いて、コンテナを作成します。
$ docker run -it -d -p 8080:80 --name centos-test centos:7
コンテナの確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7450e70b170 centos:7 "/bin/bash" 5 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp centos-test
無事作成できてます。
次はコンテナにログインしてみます。
ログインするコマンドは以下の二つです。
exec・・・コンテナの中で新しく「/bin/bash」プロセスを作成してログインします。
attach・・コンテナの標準入出力に接続しているだけ。ログアウトするとコンテナが停止します。
$ docker exec -it centos-test bash
ログインできたらnginxをインストールしてみます。
$ yum localinstall -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum install -y nginx
$ nginx
http://localhost:8080
にアクセスしてnginxの画面が表示されたら成功です。
docker便利ですね。
ログアウト
$ exec
コンテナからイメージを作成
先ほど作成した「centos-test」のコンテナを作ってイメージを作成し起動します。
$ docker commit centos-test original-nginx
$ docker run -it -d -p 8080:80 --name original-nginx original-nginx
# ログイン
$ docker exec -it centos-test bash
$ nginx
http://localhost:8080
にアクセスしてnginxの画面が表示されたら成功です。
一旦今まで作ったコンテナやイメージは消しておきます。
コンテナ削除
※削除する際はコンテナを停止させてください。
$ docker rm [CONTAINER ID]or[CONTAINER NAME]
イメージ削除
$ docker rmi [REPOSITORY]or[IMAGE ID]
###Dockerfileを使ってイメージを作成する
コンテナを作成するにはdocker run
コマンドを使用。ただ作成と起動を同時に行うので注意。
起動のみの時とはdocker start
停止時はdocker stop centos
コンテナに接続するにはdocker exec
コンテナにログインするにはdocker exec -it [image-name] bash
exit
でログアウト
docker attach [image-name]
ログインしてexitするとプロセスが停止する。
docker commit [use-image-name] [new-image-name]
で新しくimageを作成できる。
もちろんコンテナ起動もできる。
##Dockerfile
Dockerfileとは簡単に言うと今まで流れをコードとして記述したファイルです
- 構築手順をコードとしてファイルに残せる
- 構築手順の修正が簡単
- 簡単に共有できる
- バージョン管理できる
手順はこんな感じです。
- CentOS7のベースイメージを取得
- CentOS7にNginxをインストール
- Nginxを起動(フォアグラウンド)
Dockerfileを作成していきます。
# CentOS7のベースイメージを取得
FROM centos:7
# Nginxのインストール
RUN yum localinstall -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum install -y nginx
# Nginxを起動(フォアグラウンドで動かす)
CMD ["nginx", "-g", "daemon off;"]
###Dockerfileからイメージ作成(ビルド)
docker build
コマンドでビルドが行えます。
# docker build -t [IMAGE NAME] dockerfileのパス
$ docker build -t dockerfile_test ./
# イメージが作成されてるか確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockerfile_test latest dd02f0714963 About a minute ago 331MB
# コンテナ起動
$ docker run -it -d -p 8080:80 --name build-nginx dockerfile_test
http://localhost:8080
にアクセスしてnginxの画面が表示されたら成功です。
もう一度作成したDockerfileで別のコンテナを作成してみます。
$ docker build -t dockerfile_test02 ./
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos:7
---> 5e35e350aded
Step 2/4 : RUN yum localinstall -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
---> Using cache
---> 866959355b7d
Step 3/4 : RUN yum install -y nginx
---> Using cache
---> 3b3ce6786dc2
Step 4/4 : CMD ["nginx", "-g", "daemon off;"]
---> Using cache
---> dd02f0714963
Successfully built dd02f0714963
Successfully tagged dockerfile_test02:latest
Using cache
と出ています。
Dockerビルド時はレイヤがキャッシュされます。
このキャッシュのおかげで初回以降は実行時間や実行ログが短縮されます。
##まとめ
コンテナの作成順番としては
-
docker pull
でdockder hubからイメージをダウンロード -
docker run -d -p 8080:80 --name [コンテナname] イメージname
でコンテナ作成
ですが、run時にイメージがなければ勝手にダウンロードしてくれるのでどちらでもいいのかなと思います。
Dockerfileの使い方
- Dockerfileに記述
-
docker build -t [IMAGE NAME] dockerfileのパス
でDockerfileをビルドしてイメージを作成 -
docker run -d -p 8080:80 --name [コンテナname] イメージname
でコンテナ作成
次回はdocker-composeを使ってnode.jsの環境構築をしてみます。