本文目的是給幾乎從未接觸過docker,或者僅僅是聽說或者通過新聞了解過Docker的同學
通過一個已有的Docker倉庫構建和提交自己的Docker 鏡像
這里會涉及到一些概念,但是不單獨介紹
這里首先推薦一本書:《第一本Docker的書》,如果你有充分的時間來閱讀此書,那么本文對你來說幾乎無用,本文內容均摘抄和整理自此書。
為 Docker 准備運行環境
- Linux,這是首要條件,雖然Micosoft正在擁抱Docker,不過當下,你還是需要一個比較新的Linux發行版本和gcc版本
- Linux 內核 gt 2.6.* 的版本都是可以安裝Docker的,但是低版本的Linux不支持cgroup(Linux的資源管理方案),所以你的Linux內核最好在3.8以上。更重要的是,如果你在社區中詢問如何在低版本上的Linux安裝Docker,大多數人會說,你升級你的內核吧。如果你對內核編譯不擅長,可以嘗試學習安裝Gentoo Linux來了解這個過程。當然我還是建議重新裝個新系統,第一次使用Docker的你,需要一個漂亮的成功來增加信心(比如作者新安裝了Arch Linux)。
- 你需要64位CPU架構的計算機,舊版本的Vmware不支持在windows下安裝64位Linux,在安裝之前,需要檢查一下
- 我喜歡Ubuntu,但是生產環境是CentOS怎么辦?這正是Docker最擅長的部分,Docker可以輕易的在Ubuntu上安裝其他Linux基礎鏡像。
- UFW Ubuntu 中的UFW可能會導致Docker容器的網絡無法使用,修改/etc/default/ufw 中:DEFAULT_FORWARD_POLICY="DROP" 為 DEFAULT_FORWARD_POLICY="ACCEPT",然后執行sudo ufw reload
官方文檔 - 安裝教程
在准備完成以上環境檢查后,就可以去看安裝教程,文檔非常詳盡和具體
- Linux 教程:https://docs.docker.com/linux/step_one/
- Ubuntu 教程:https://docs.docker.com/engine/installation/linux/ubuntulinux/
- 所有支持的Linux 發行版本的安裝教程:https://docs.docker.com/engine/installation/
Docker的正常運行是需要Docker服務的支持,就像Apache Http Server 一樣,我們稱之為Docker守護進程
# 如果是通過yum atp-get安裝,應該已經生成了相應的服務
service docker start
# 或者你需要這樣來手動運行
/usr/bin/docker daemon
這里可能有個問題,如果你加上docker daemon -H tcp://127.0.0.1:2389 指定監聽的地址,那么你需要在所有的指令中指明這個地址。
比如:docker -H tcp://127.0.0.1:2389 info
怎么知道一切正常?
# 執行info指令
[root@kevin kevin]$ docker info
輸出:
Containers: 5
Running: 0
Server Version: 1.10.1
...省略一些
Registry: https://index.docker.io/v1/
大多數時候,你應該開始運行Hello World程序,好吧那就開始
docker run hello-world
#你會看到Docker在下載這個鏡像,然后打印
輸出:
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
- The Docker client contacted the Docker daemon.
...省略
查看你所有的鏡像
[root@kevin kevin]$ docker images
一般教程到這里,你可能被告知可以開始運行一個ubuntu鏡像,這很簡單:
docker run -i -t ubuntu
#docker會自動下載和啟動ubuntu容器
其他鏡像你可以在這里找到:https://hub.docker.com/
但是在你開始漫長的鏡像更新之前,你可以先詢問一下,如果你附近有一個私有倉庫,那么過程會快的多。下面介紹基於私有倉庫使用,如果要使用官方倉庫,去掉教程中IP的部分便可。
比如192.168.2.1/centos:6 改為 centos:6 就行了。
使用私有倉庫
假設上面一切順利,那么你就可以開始構建你的鏡像了,這里首先簡單解釋鏡像是什么。在使用Docker的時候,你需要構建很多鏡像,它們可能是Nginx鏡像,Nginx + PHP + MySQL鏡像,Cassandra鏡像,或者只是一個簡單純粹的Linux鏡像。這些鏡像就像軟件安裝包,你可以到處使用,隨時隨地的使用任何一個鏡像,將鏡像變成容器。鏡像和容器的關系就像:安裝包和安裝好的軟件的關系。如果你覺得你的某個IDE因為某些莫名的原因不好用了,你會選擇卸載重裝,Docker也是你這個思路。
構建鏡像
構建鏡像正常來說有2種方式:通過DockerFile(很像MakeFile)或者就像使用虛擬機那樣,啟動一個鏡像,然后安裝你想要的任何東西,再提交。這里主要介紹方法二,對方法一感興趣的話可以閱讀文章開頭推薦的書。
note: 鏡像地址為虛擬地址,實際按照倉庫提供方給的地址為准
- 假設有個鏡像倉庫:192.168.1.2:5000 是企業的私有倉庫
- 如果倉庫不是https協議,你需要修改你的docker守護進程的啟動參數,讓它像這樣運行,如果你是自動安裝,那么需要修改啟動腳本。
usr/bin/docker daemon -H fd:// --insecure-registry 192.168.1.2:5000
- 運行Centos鏡像 docker run -i -t 192.168.1.2:5000/centos:6
如果運氣不錯,在一小段時間的下載后,你進到了另個命令提示符號下面了,這就是容器內部了。如果下載后沒有打開命令提示符,你可以將指令修改為:
# 正常的容器內部,注意@后面就是容器ID
[root@8735f1f1ad16 /]$
# 沒有看到終端的情況下執行
docker run -i -t 192.168.1.2:5000/centos:6 /bin/bash
新增的/bin/bash指的是,容器啟動后,要執行的指令。不必擔心,你不會被要求重新下載一次,本地已經緩存了這個鏡像。
開始構建
這是一個各方面看起都沒有什么問題的Linux環境,就不具體介紹如何在這里安裝環境了,這里我簡單的安裝一個php環境來作為例子。
yum install php
#...省略
[root@8735f1f1ad16 /]$ php -v
#PHP 5.3.3 (cli) (built: Feb 9 2016 10:36:17)
#Copyright (c) 1997-2010 The PHP Group
#Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
# 如果你需要更新版本的php,你需要自己下載安裝,而不是使用yum
搞定!
# 退出bash
[root@8735f1f1ad16 /]$ exit
exit
[root@kevin kevin]$
恭喜你又回到了外面的世界。。。
重啟這個容器
提交之前,你需要關掉這個容器,如果你的容器的啟動指令是一個服務,那么必須是服務被關閉后,容器才會關閉。不過我們這個容器的啟動指令是bash,所以當執行exit時,指令就完成了,容器自然也就結束了。通過下面的指令,你可以看到你啟動過的容器。
[root@kevin kevin]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8735f1f1ad16 192.168.62.187:5000/centos:6 "/bin/bash" 8 minutes ago Exited (0) About a minute ago cocky_mccarthy
55b1257721a7 hello-world "/hello" About an hour ago Exited (0) About an hour ago evil_euclid
你會發現容器最后一列names被起了個奇怪的名字,沒辦法,因為你啟動的時候,沒有指定好,就被隨便取了(tip:--name用於命名)。第一列是一個ID,它唯一指定了你的容器。注意:當鏡像啟動為一個容器后,它會被保存起來,當你再次docker run ***的時候,會再生成一個新容器,而不是使用剛才這個,如果你還想使用原先的容器,你得用docker start
[root@kevin kevin]$ docker start 8735f1f1ad16
8735f1f1ad16
[root@kevin kevin]$
沒成功嗎?
[root@kevin kevin]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8735f1f1ad16 192.168.62.187:5000/centos:6 "/bin/bash" 13 minutes ago Up 41 seconds cocky_mccarthy
應該是成功了,可是命令提示符沒有變化,這是因為我們少了2個參數:-i -t ,-i 參數保證容器的STDIN是開啟的,-t 是告訴Docker為容器創建一個偽tty終端。不幸的是docker start 並不支持-i -t 參數,那么你需要使用另個指令來回到容器中
# 重新附着到容器
# 注意在attach 指令后,我敲了個回車,才真正進到了命令提示符下
[root@kevin kevin]$ docker attach 8735f1f1ad16
[root@8735f1f1ad16 /]$
# 在啟動的時候,就附着上去 注意-a參數
[root@kevin kevin]$ docker start -a 8735f1f1ad16
提交這個鏡像
提交之前,注意,剛才我們的容器的名字是搖骰子得到的,容器的ID是一個記不住的16進制數,所以我們得給容器一個好名字,再提交為鏡像。
[root@kevin kevin]$ docker commit 8735f1f1ad16 kevin/hello-php
sha256:4981e55b52a9b5f2a4b8884f7f439b5bb4416287e47ba2f542a26f80ad0f7daf
[root@kevin kevin]$
#使用docker images看下我們提交的鏡像
#centos 和 hello-php看起來都在
[root@kevin kevin]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kevin/hello-php latest 4981e55b52a9 36 seconds ago 352.4 MB
192.168.1.2:5000/centos 6 fc73b108c5ae 4 weeks ago 228.9 MB
不過你只是在你本地創建了一個hello-php鏡像,並沒被提交給服務器
# 用tag指令給hello-php 加上私有倉庫地址,然后push
[root@kevin kevin]$ docker tag 4981e55b52a9 192.168.62.187:5000/kevin/hello-php
[root@kevin kevin]$ docker push 192.168.62.187:5000/kevin/hello-php
# 如果你再查看鏡像,會看到:
[root@kevin ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.62.187:5000/kevin/hello-php latest 4981e55b52a9 6 minutes ago 352.4 MB
kevin/hello-php latest 4981e55b52a9 6 minutes ago 352.4 MB
192.168.62.187:5000/centos 6 fc73b108c5ae 4 weeks ago 228.9 MB
漫長的上傳后,我的鏡像就可以被其他人使用了,雖然這個鏡像基本一無是處。。。如果你希望它做點什么,最好是指定一個指令,比如啟動一個服務器,或者一系列的服務器,你可以將你要做的事寫成一個shell腳本,然后在啟動后執行:比如我創建了一個容器用來看php版本(挺廢的,就是舉個例子。。。)
[root@kevin kevin]$ docker run --name php-1 192.168.62.187:5000/kevin/hello-php /usr/bin/php -v
PHP 5.3.3 (cli) (built: Feb 9 2016 10:36:17)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
# so 每次你想看php版本的時候,你可以:
[root@kevin kevin]$ docker start -a php-1
