尝试使用Dockerfile

以下提供的是有关Docker的学习笔记。
关于Docker,我在学习过程中参考了前辈们的博客、Qiita上的信息,但这次我将上传下面的执行结果作为示例。

想做的事情

    • CentOSのイメージを使って、簡単なコマンドを実行する

 

    • docker run…ではなくて、Dockerfileを使ってdocker buildしてみる。

うまくいったら、少しずつRUNさせることを増やしていく。

Dockerのイメージのリポジトリから、好きなもの使ってみたい。

前提到这个地方。

    • 仮想環境にはVirtualBox + Vagrantを使う。

 

    • Vagrantを使って、Docker入りのUbuntuをインストールした。

https://github.com/dotcloud/docker.git を利用 -> Vagrant upでUbuntuの環境を作成した。

上記のUbuntuをベースにし、sshログイン。この中でdockerコマンドが実行できることを確認した。
Dockerのチュートリアルで、簡単に学習をした。

http://www.docker.io/gettingstarted/# (オンラインで学習できます!)

dockerコマンドで、最初にイメージをダウンロードし、コンテナ(Dockerで言う所の仮想環境)を起動できた。

yum installなどで内部に変更が加わると、イメージのIDが変更していくことが分かった。

我选择CentOS的镜像

使用docker搜索centos进行检索

根据前提条件,我们选择基于CentOS作为基础。(虽然开始执行的是Ubuntu,但可以在docker中选择使用各种不同的镜像)
由于CentOS6.5已经发布,所以我认为应该选择最新的版本,并通过docker search进行搜索。

信任的意思是,有标有“OK”的是否即为官方镜像呢?
(在 https://index.docker.io/search?q=centos,您也可以看到列表)

vagrant@precise64:~$ docker search centos
NAME                                     DESCRIPTION                                     STARS     OFFICIAL   TRUSTED
dustin/centos                            Old CentOS is old.                              0                    
chentoo/centos                           centos 5.6 x86_64 image                         0                    
hnakamur/centos                          CentOS 6.5 x86_64 base image                    0                    
tutum/centos                             CentOS Docker image with SSH access             5                    
blalor/centos                            Bare-bones base CentOS 6.5 image                0                    [OK]
tianon/centos                            CentOS 5 and 6, created using rinse instea...   2                    
backjlack/centos                         This repository contains the following ima...   0  

# --- 以下略                 

由于官方的版本是CentOS6.4,所以我想6.5版本可能没有。但在hnakamur先生的文章中,我发现了关于创建和注册CentOS 6.5 base image的描述。因此,我决定使用这个版本。

    https://index.docker.io/u/hnakamur/centos/

我将创建一个Dockerfile。

因为已经决定好了形象,所以接下来要准备 Dockerfile。据说放在任何地方都可以,我选择了 ~/work 目录。

只要有最低限的来源(使用哪种形象)就好。

我希望这次能够使用hnakamura先生的形象,所以我尝试输入了在搜索中找到的完全一样的名字(但在那时,我不确定这个指定是否正确)。

vagrant@precise64:~/work$ pwd
/home/vagrant/work
vagrant@precise64:~/work$ ls
Dockerfile
vagrant@precise64:~/work$ cat Dockerfile 
#FROM centos
FROM hnakamur/centos 
RUN /bin/echo hi
RUN /bin/cat /etc/redhat-release

以下是Dockerfile的内容。

    1. 获取指定的image

 

    1. 启动并回显”hi”

 

    显示操作系统版本(确认redhat-release是否为CentOS6.5)

在开始构建之前的确认

这是在实施之前的确认工作。图像目前是空的状态。(虽然有一个叫做”base”的Ubuntu图像,但现在已经清空了)

vagrant@precise64:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

我尝试进行构建。

在拥有Dockerfile的目录中,尝试使用命令docker build . 。

最开始是从docker.io下载镜像。

非常感激的是,它会友好地显示出进展(过程),例如 Step1,Step2!

vagrant@precise64:~/work$ docker build .
Uploading context 10.24 kB
Step 1 : FROM hnakamur/centos
Pulling repository hnakamur/centos
a9f02140a1ee: Download complete 
dfb97af77c51: Download complete 
50d4926c934d: Download complete 
 ---> dfb97af77c51
Step 2 : RUN /bin/echo hi
 ---> Running in d08b5b48f486
hi
 ---> 22d0bb5e5683
Step 3 : RUN /bin/cat /etc/redhat-release
 ---> Running in f832f6d77c12
CentOS release 6.5 (Final)
 ---> 9bd6f163b65a
Successfully built 9bd6f163b65a

查看结果后,显示了”hi”和”CentOS release 6.5 (Final)”,正如预期的结果一样。

另外,产生了一个名为9bd6f163b65a的结果。这似乎是当前的图像标识符。

似乎也有增加了 https://index.docker.io/u/hnakamur/centos/ 的下载次数。

以后是第二次?

虽然会显示步骤,但由于不需要下载图像,所以处理速度会更快。

vagrant@precise64:~/work$ time docker build .
Uploading context 10.24 kB
Step 1 : FROM hnakamur/centos
 ---> dfb97af77c51
Step 2 : RUN /bin/echo hi
 ---> Using cache
 ---> 22d0bb5e5683
Step 3 : RUN /bin/cat /etc/redhat-release
 ---> Using cache
 ---> 9bd6f163b65a
Successfully built 9bd6f163b65a

real    0m0.020s
user    0m0.008s
sys 0m0.000s

好吧,就回应和连接两个命令而言,只显示了“使用缓存”的字符串。
它是怎么回事呢?

由于缓存,IMAGE ID的结果是 built 9bd6f163b65a,这与第一次的值相同。

试试添加no cache

我还不太清楚,但我会尝试在选项中加上”no cache”。这次我得到了echo/cat的结果返回。

vagrant@precise64:~/work$ docker build -no-cache .
Uploading context 10.24 kB
Step 1 : FROM hnakamur/centos
 ---> dfb97af77c51
Step 2 : RUN /bin/echo hi
 ---> Running in 26955e584363
hi
 ---> fb53f74b6767
Step 3 : RUN /bin/cat /etc/redhat-release
 ---> Running in 95aba47597d6
CentOS release 6.5 (Final)
 ---> 45cdab64b614
Successfully built 45cdab64b614

确认图像后发现已添加了建立 45cdab64b614。

vagrant@precise64:~/work$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              45cdab64b614        2 minutes ago       309.9 MB
<none>              <none>              9bd6f163b65a        14 minutes ago      309.9 MB
hnakamur/centos     6.5                 a9f02140a1ee        2 weeks ago         309.9 MB
hnakamur/centos     latest              dfb97af77c51        2 weeks ago         309.9 MB

我会尝试在文件中写入一些内容。

只是用echo命令和cat命令没有进行任何写入(修改)操作,所以我接着尝试在~/test.txt文件中进行写入测试。

#FROM centos
FROM hnakamur/centos
RUN /bin/echo hi
RUN /bin/cat /etc/redhat-release
RUN /bin/echo "hoge" > ~/test.txt
RUN /bin/cat  ~/test.txt

看起来已经成功执行了~ /test.txt中的内容也能够cat出来。

vagrant@precise64:~/work$ docker build .
Uploading context 10.24 kB
Step 1 : FROM hnakamur/centos
 ---> dfb97af77c51
Step 2 : RUN /bin/echo hi
 ---> Using cache
 ---> 22d0bb5e5683
Step 3 : RUN /bin/cat /etc/redhat-release
 ---> Using cache
 ---> 9bd6f163b65a
Step 4 : RUN /bin/echo "hoge" > ~/test.txt
 ---> Using cache
 ---> 699db1b2f739
Step 5 : RUN /bin/cat  ~/test.txt
 ---> Running in c7eee58c120d
hoge
 ---> f20c50e138e4
Successfully built f20c50e138e4

提交状态

vagrant@precise64:~/work$ docker ps -a
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS              PORTS               NAMES
c7eee58c120d        699db1b2f739             /bin/sh -c /bin/cat    2 minutes ago       Exit 0                                  boring_pike         
07e7be6ba1af        9bd6f163b65a             /bin/sh -c /bin/echo   2 minutes ago       Exit 0                                  boring_darwin       
95aba47597d6        fb53f74b6767             /bin/sh -c /bin/cat    4 hours ago         Exit 0                                  determined_turing   
26955e584363        hnakamur/centos:latest   /bin/sh -c /bin/echo   4 hours ago         Exit 0                                  tender_euclide      
f832f6d77c12        22d0bb5e5683             /bin/sh -c /bin/cat    4 hours ago         Exit 0                                  prickly_ritchie     
d08b5b48f486        hnakamur/centos:latest   /bin/sh -c /bin/echo   4 hours ago         Exit 0                                  romantic_turing  

区块中似乎需要提交 CONTAINER ID,所以试试把最后执行的那个作为参数。

vagrant@precise64:~/work$ docker commit c7eee58c120d
9608087e8eb76cc16c40a842599f125861aadf7fd4afe78b6cf54ffbf64a89be
vagrant@precise64:~/work$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              9608087e8eb7        3 seconds ago       309.9 MB
<none>              <none>              f20c50e138e4        2 minutes ago       309.9 MB
hnakamur/centos     6.5                 a9f02140a1ee        2 weeks ago         309.9 MB
hnakamur/centos     latest              dfb97af77c51        2 weeks ago         309.9 MB

每个图像的测试

在对下载下来的文件进行写入之前,对刚刚下载的图像进行cat命令查看test.txt的内容。

最终被告知,没有这样的事。

vagrant@precise64:~/work$ docker run a9f02140a1ee /bin/cat /test.txt
/bin/cat: /test.txt: No such file or directory

接下来,将对提交的图像执行cat命令以查看test.txt文件内容。(图像ID: f20c50e138e4)

vagrant@precise64:~/work$ docker run f20c50e138e4 /bin/cat /test.txt          
hoge

这次似乎成功地输出了!

测试将写入测试(2)到文件中

只需写入相同的字符串”hoge”,由于缓存的原因,现在我们将尝试写入日期命令的结果并执行Dockerfile。

Docker文件

FROM hnakamur/centos
RUN /bin/echo hi
RUN /bin/cat /etc/redhat-release
RUN /bin/echo "hoge `date`" > ~/test.txt
RUN /bin/cat  ~/test.txt

连续执行两次

第一回。
将会输出 “hoge Sun Jan 5 20:47:17 EST 2014″。

vagrant@precise64:~/work$ docker build .
Uploading context 10.24 kB
Step 1 : FROM hnakamur/centos
 ---> dfb97af77c51
Step 2 : RUN /bin/echo hi
 ---> Using cache
 ---> 22d0bb5e5683
Step 3 : RUN /bin/cat /etc/redhat-release
 ---> Using cache
 ---> 9bd6f163b65a
Step 4 : RUN /bin/echo "hoge `date`" > ~/test.txt
 ---> Running in c5d97135393c
 ---> 6c44ddd7b236
Step 5 : RUN /bin/cat  ~/test.txt
 ---> Running in 6126db4144b6
hoge Sun Jan  5 20:47:17 EST 2014
 ---> cf8c4153782b
Successfully built cf8c4153782b

第二次。
将” hoge Sun Jan 5 20:47:29 EST 2014″输出。

vagrant@precise64:~/work$ docker build .
Uploading context 10.24 kB
Step 1 : FROM hnakamur/centos
 ---> dfb97af77c51
Step 2 : RUN /bin/echo hi
 ---> Using cache
 ---> b8ecb1c6f4ca
Step 3 : RUN /bin/cat /etc/redhat-release
 ---> Using cache
 ---> 2cd2b4ee1d84
Step 4 : RUN /bin/echo "hoge `date`" > ~/test.txt
 ---> Running in a7d8417b6e95
 ---> b5aa2308d56a
Step 5 : RUN /bin/cat  ~/test.txt
 ---> Running in aea88825dd7c
hoge Sun Jan  5 20:47:29 EST 2014
 ---> cce9c7c2d7cd
Successfully built cce9c7c2d7cd

指定一张图片进行测试。

猫在不同的时间戳(时间)下被捕捉到了!

# 1回目のimagewお指定
vagrant@precise64:~/work$ docker run cf8c4153782b /bin/cat /test.txt
hoge Sun Jan  5 20:47:17 EST 2014

# 2回目のimageを指定
vagrant@precise64:~/work$ docker run cce9c7c2d7cd /bin/cat /test.txt
hoge Sun Jan  5 20:47:29 EST 2014

我试着潜入到某个时刻的画面中。

我现在知道可以通过指定ID来调用在Docker中记录的图像。
接下来,我将进入操作系统并进行确认。

# 上記1回目のimageを指定して、バックグラウンドで起動
vagrant@precise64:~/work$ docker run -i -t -d cf8c4153782b /bin/bash
0a0392a384d5a5a40e1ec87e88e2a2680eeec2603604ccd61bc200aae7bbf1c2

# アタッチします
vagrant@precise64:~/work$ docker attach 0a0392a384d5a5a40e1ec87e88e2a2680eeec2603604ccd61bc200aae7bbf1c2

# 中の世界に潜り込みました!
bash-4.1# cat /test.txt 
hoge Sun Jan  5 20:47:17 EST 2014
bash-4.1# 

很好,我成功地潜入了过去某个时间点的世界。(太厉害了!)
一旦退出,那些在后台运行的进程也会停止。

不过无所谓,如果使用sh而不是bash,attach的话就会以sh进行访问。

vagrant@precise64:~/work$ docker run -i -t -d cf8c4153782b /bin/sh
152ad6c546c160cb3ab218d46f06907ecb9a8e41685739a435e444c8dcdbc0ed
vagrant@precise64:~/work$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
152ad6c546c1        cf8c4153782b        /bin/sh             3 seconds ago       Up 2 seconds                            cranky_morse        
vagrant@precise64:~/work$ docker attach 152ad6c546c1                                                    

sh-4.1# 

我有个这样的领悟!

关于实现方法,我还不是很清楚,不过与VirtualBox和Vagrant的组合不同的是,总之它更容易实现任意状态的转换。

    • 状態の管理がしやすい

 

    • VirtualBoxのSnapshotでも、状態は記録できるけれど、復元するのに時間がかかる。(停止 -> スナップショットIDを指定して再起動)

 

    • Dockerの場合は一瞬!(起動とか停止が気にならないくらい)

 

    • Dockerfileだけ用意してチェックアウトしてJenkinsでビルドっていうのがホントに出来そう!

 

    ある時点、違う内容の『xxxxの世界』に、ほんの少しで移動出来る!(なんかディケイドっぽい!)

通过观察操作系统映像的更新历史

另外,虽然在docker.io上也有许多镜像注册,但我认为如果以此为基础,就像克隆git存储库一样,可能还可以同时查看该镜像的历史记录。

实际上,如果从docker.io获取带有Ruby 2.1的CentOS映像并查看其历史记录…

vagrant@precise64:~/work$ docker history tmtk75/ruby-2.1.0p0 
IMAGE               CREATED             CREATED BY                                      SIZE
583b10f73f37        7 days ago          /bin/sh -c gem install bundler --no-ri --no-r   8.675 MB
1b1fd68b6011        7 days ago          /bin/sh -c cd /usr/local/ruby-2.1.0; ./config   345 MB
ebd5e5c243eb        7 days ago          /bin/sh -c cd /usr/local; tar xfz ruby-2.1.0.   69.76 MB
bad9ee09833f        7 days ago          /bin/sh -c cd /usr/local; curl -OL http://cac   15.08 MB
d6291e86618f        7 days ago          /bin/sh -c yum install -y zlib-devel openssl-   27.27 MB
3ffa09187685        7 days ago          /bin/sh -c yum install -y gcc                   203.4 MB
539c0211cd76        9 months ago                                                        300.6 MB

嗯,很有趣。
而且,能清晰地看到前辈的步骤,对于环境搭建的步骤非常有参考价值。

以上、全く编程经验不足,对于Docker的笔记是第一次。

广告
将在 10 秒后关闭
bannerAds