case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

Docker備忘録

備忘録です。流れは以下のようになります。


個人的にDockerはGit扱いに非常に類似している印象を受けます。Docker HUBと呼ばれるDocker Image(Docker環境構築の設計図)を管理している箇所からDocker PullしImageを取得します。Imageは環境構築を行うための設計図です。起動すると、設計図に記載した環境[ライブラリ、アプリ、データベースなど]が作られます。この設計図に変更を加えたい場合には設計図を修正し、Docker CommitしDocker HUBにPushします。Docker HUBではリポジトリで管理しているためいつでもそのデータを獲得することが可能です。
f:id:casekblog:20180930191939p:plain

Docker install

まずはDockerをinstallします。以下のコマンドを実行して下さい。
※ Docker のインストールの詳細は以下を確認してみて下さい。
Get Docker Engine - Community for Ubuntu | Docker Documentation

# ubuntu
$ sudo apt-get update
$ sudo apt-get install docker.io

#Out
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:

※  docker-ceではなくdocker.ioです。ちょっとつまづいたのでメモしときます。

Docker Image

まずはDocker HUB[旧 Docker Index]からImageを取得します。
※ Docker HUB [旧Docker index]
Docker Imageを管理するリポジトリです。Git でプログラムを管理するように、Docker HUBではDocker Imageを管理します。
※ Docker Image
仮想環境を作る設定ファイルです。Docker Imageから異なる環境でも全く同じ環境構築が可能です。
Imageは Docker コンテナの作成時に利用されます。プログラミングで言う所のクラス[設計図]に該当します。Docker PullよりDocker HubからDocker Imageを取得します。https://hub.docker.com/

Docker Pull

それではDocker PullでDocker HubよりDocker Imageを取得したいと思います。

# Docker Image一覧確認
$ sudo docker search centos | more

# Docker Pull
$ sudo docker pull centos

# Out
latest: Pulling from centos
675ac122cafb: Pull complete
a4875ffe6057: Pull complete
c5507be714a7: Pull complete
Digest: sha256:5d91c5535c41fd1bb48d40581a2c8b53d38fc2eb26df774556b53c5a0bd4d44e
Status: Downloaded newer image for centos:latest

TipsとしてImageの操作方法のコマンドも記載しておきます。

# Check Docker Image
$ sudo docker images

# Out
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              latest              c5507be714a7        7 weeks ago         199.7 MB

# Docker Image 詳細確認
$ sudo docker inspect [IMAGE ID]
[{
    "Architecture": "amd64",
    "Author": "",
    "Comment": "",
    "Config": {
 ・・・・
# Docker Image 削除
$ sudo docker [image id]
Docker Container

Imageが作れたので、いよいよContainer起動してみようと思います。
Docker Containerとは、設定ファイル[Docker Image]から作られた仮想環境です。Containerはアプリケーションの実行に必要な全てが含まれています。環境構築に必要なライブラリなどが入った状態の環境を作ることが可能です。プログライミングでいうクラス[設計図]がDocker Imageに該当し、クラスから作るインスタンス[実体]がDocker Containerに該当します。まず、試しにコンテナを起動して「Hello World」と表示させます。コンテナの起動は「Docker Run」で行います。

# Container起動とジョブ実行
$ sudo docker run centos echo "Hello world"
Hello world

実行したジョブの内容を確認してみます。以下のコマンドを実行すると、実行結果を確認できます。実行したジョブにはCONTAINER IDが割り振られています。
このIDを活用してCONTAINER の操作を行うことができます。

# 確認 
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
8c96f399eac6        centos:latest       "echo 'Hello world'"   3 minutes ago       Exited (0) 3 minutes ago                       modest_kowalevski

以下Containerの操作方法です。

# delete container 
$sudo docker rm [CONTAINER ID]

# run per 3 second
$sudo docker run -d centos free -s 3

# check logs
$sudo docker logs [CONTAINER ID]

# stop
$sudo docker kill [CONTAINER ID]

# start 
$sudo docker start [CONTAINER ID]
Create Image from Container

Containerから新しくImageを作りたいと思います。Containerに入り、hello.txtファイルを作ります。以下を実行して下さい。

# コンテナに編集モード[-i]ターミナル[-t]で入ります。
vagrant@vagrant-ubuntu-trusty-64:~$ sudo docker run -i -t centos /bin/bash
[root@a165524f1e8b /]# touch hello.txt
[root@a165524f1e8b /]# ls -ltr
# Out
・・・・
-rw-r--r--  1 root root     0 Oct  1 11:00 hello.txt
[root@a165524f1e8b /]# exit

# Check Container
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
a165524f1e8b        centos:latest       "/bin/bash"         3 minutes ago       Exited (0) 2 minutes ago                       jovial_heisenberg

Container作成とImageを作ることができました。

Commit Created Image

Container内に作成したファイルをCommitすることで、Pushできるようにし、別環境からImageの取得を実現します。

# Create Image
$ sudo docker commit  [CONTAINER ID] hoge/hello[Image name]

# Commit
$ sudo docker commit a165524f1e8b hoge/hello
86cf795d5441dd7fa20cb3ad4707a489e601a329e08964f27cf9d4ed4c6fc331

# Check Images
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hoge/hello          latest              86cf795d5441        8 seconds ago       199.7 MB
centos              latest              c5507be714a7        7 weeks ago         199.7 MB

Hello Textがあるか確認します。

$ sudo docker run -i -t hoge/hello /bin/bash

# Check Container
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
734bcb8059a2        hoge/hello:latest   "/bin/bash"         22 seconds ago      Exited (0) 5 seconds ago                       elegant_heisenberg
a165524f1e8b        centos:latest       "/bin/bash"         10 minutes ago      Exited (0) 9 minutes ago                       jovial_heisenberg
Docker Build

これまでImageをPullしContainerを起動し、起動したContainerを更新しCommitしました。
Dockerにはこの一連の処理を自動化するスクリプトが用意されており、Docker Buildといいます。
Buildするためには実行内容を記載した「Dockerfile」を活用します。まずはDockerfileを作ります。以下のファイルを作成して下さい。

$ vi Dockerfile[i+esc+:wq!]

# Image 
FROM centos
# Who wrote this file
MAINTAINER Gen Hoge <hoge@gmail.com>
# Run:buildするときに実行される
RUN echo "now building"
# CMD:Runするときに実行される
CMD  ["echo", "now running"]

Dockerfileを作成できたので、Docker Buildします。

# Docker Build 
$sudo docker build -t hoge/echo .

# Out
Sending build context to Docker daemon 13.31 kB
Sending build context to Docker daemon
・・・・

BuildしたImageとContainerを確認します。

# Check Images
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hoge/echo           latest              122d61f3564b        15 seconds ago      199.7 MB
hoge/hello          latest              86cf795d5441        22 minutes ago      199.7 MB
centos              latest              c5507be714a7        7 weeks ago         199.7 MB

# Run Container 
$ sudo docker run hoge/echo
now running

# Check Container
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS               NAMES
ae50b955f413        hoge/echo:latest    "echo 'now running'"   28 seconds ago      Exited (0) 28 seconds ago                       modest_franklin
734bcb8059a2        hoge/hello:latest   "/bin/bash"            22 minutes ago      Exited (0) 22 minutes ago                       elegant_heisenberg
a165524f1e8b        centos:latest       "/bin/bash"            32 minutes ago      Exited (0) 31 minutes ago                       jovial_heisenberg

正しくBuildできたようです。

Create Web Server Dockerfile

少し実践的な処理を行いたいと思います。DockerfileにWEBサーバをインストールしブラウザから確認してみましょう。

$ vi Dockerfile

# Out
FROM centos:centos6
MAINTAINER hoge <hoge@gmail.com>
RUN yum install -y httpd
COPY index.html /var/www/html/
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

※ FROM:PULLするイメージを指定します。
現在[2018年9月]FROM centos と記述すると CentOS 7 系がインストールされ、httpd のインストールに失敗してしまうため6系をインストールします。
※ ADD:サーバ環境のファイルをイメージに取り込む
※ CMD:RUN[コンテナ起動]で実行するコマンド
※ EXPOSE 80:HTTPで使うポート番号
Docker Image にコピーするファイルを作ります。Container起動後ブラウザからHTMLに記載した内容が表示されるか確認します。

vi index.html

# Out
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>helloworld</title>
</head>
<body>
    <h1>helloworld!</h1>
</body>
</html>

準備ができましたので、実際にビルドしてみたいと思います。最終的にDocker HUBにPUSHをするので以下の形式でビルドを実施して下さい。
$sudo docker build -t [Docker user name]/[Repository] .

# Docker build
$ sudo docker build -t hoge/httpd .

Container から作成したImageを起動しブラウザから確認してみます。
ホストのポート8080をコンテナのポート80リダイレクトさせます。

$ sudo docker run -p 8080:80 -d hoge/httpd

#Out
9555cec58b1b2ac1c75c22857b7ce583d7e499d0eadcc29d390e2c407307d1a9

※ -d:Back Groundで走らすコマンド
うまくできたかブラウザから確認してみたいと思います。
Vagrantfileに記載したIPアドレスにポート「:8080」を指定してみます。
http://192.168.55.44:8080/
f:id:casekblog:20181003215923p:plain:w300

Docker Push

外部環境でも同様の環境を作れるように、作成したDocker ImageをDocker HUBにPushします。
事前にDoker HUBのアカウントとリボジトリが必要となりますので準備して下さい。

$ sudo docker push hoge/httpd

以下より登録してください。
https://hub.docker.com/
アカウントの準備が整いましたら、コマンドラインでDockerにログインしたいと思います。

$ sudo docker login
Username: ?????
Password:?????
Email:??????

ログインが成功するとPUSHできるようになります。
作成したImageをPUSHするめには以下の形式に従う必要があります。
$ sudo docker push [Repository]:[Tag]
作成したImageのRepositoryとTagを確認してPushします。

# PUSH
$ sudo docker push hoge/httpd:latest
The push refers to a repository [hoge/httpd] (len: 1)
5f6020d11dc4: Image successfully pushed

PUSHが無事成功したら実際にDocker HUBでRepositoryを確認してみましょう。
冒頭にも書きましたが、作成したImageを取得するにはPullして下さい。

$ sudo docker pull hoge/httpd