Dockerについて基本的なことなぞってみたのよ。


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とは簡単に言うと今まで流れをコードとして記述したファイルです

  • 構築手順をコードとしてファイルに残せる
  • 構築手順の修正が簡単
  • 簡単に共有できる
  • バージョン管理できる

手順はこんな感じです。

  1. CentOS7のベースイメージを取得
  2. CentOS7にNginxをインストール
  3. 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各種説明

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ビルド時はレイヤがキャッシュされます。
このキャッシュのおかげで初回以降は実行時間や実行ログが短縮されます。

まとめ

コンテナの作成順番としては
1. docker pullでdockder hubからイメージをダウンロード
2. docker run -d -p 8080:80 --name [コンテナname] イメージnameでコンテナ作成

ですが、run時にイメージがなければ勝手にダウンロードしてくれるのでどちらでもいいのかなと思います。

Dockerfileの使い方
1. Dockerfileに記述
2. docker build -t [IMAGE NAME] dockerfileのパスでDockerfileをビルドしてイメージを作成
3. docker run -d -p 8080:80 --name [コンテナname] イメージnameでコンテナ作成

次回はdocker-composeを使ってnode.jsの環境構築をしてみます。