備忘録です。流れは以下のようになります。
- Docker install
- Docker Image
- Docker Pull
- Docker Container
- Create Image from Container
- Commit Created Image
- Docker Build
- Create Web Server Dockerfile
- Docker Push
個人的にDockerはGit扱いに非常に類似している印象を受けます。Docker HUBと呼ばれるDocker Image(Docker環境構築の設計図)を管理している箇所からDocker PullしImageを取得します。Imageは環境構築を行うための設計図です。起動すると、設計図に記載した環境[ライブラリ、アプリ、データベースなど]が作られます。この設計図に変更を加えたい場合には設計図を修正し、Docker CommitしDocker HUBにPushします。Docker HUBではリポジトリで管理しているためいつでもそのデータを獲得することが可能です。
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/
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