尝试使用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的内容。
-
- 获取指定的image
-
- 启动并回显”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的笔记是第一次。