Docker 快速入門教程

本文目的是給幾乎從未接觸過docker,或者僅僅是據說或者經過新聞了解過Docker的同窗
經過一個已有的Docker倉庫構建和提交本身的Docker 鏡像
這裏會涉及到一些概念,可是不單獨介紹php

這裏首先推薦一本書:《第一本Docker的書》,若是你有充分的時間來閱讀此書,那麼本文對你來講幾乎無用,本文內容均摘抄和整理自此書。linux

爲 Docker 準備運行環境

  1. Linux,這是首要條件,雖然Micosoft正在擁抱Docker,不過當下,你仍是須要一個比較新的Linux發行版本和gcc版本
  2. Linux 內核 gt 2.6.* 的版本都是能夠安裝Docker的,可是低版本的Linux不支持cgroup(Linux的資源管理方案),因此你的Linux內核最好在3.8以上。更重要的是,若是你在社區中詢問如何在低版本上的Linux安裝Docker,大多數人會說,你升級你的內核吧。若是你對內核編譯不擅長,能夠嘗試學習安裝Gentoo Linux來了解這個過程。固然我仍是建議從新裝個新系統,第一次使用Docker的你,須要一個漂亮的成功來增長信心(好比做者新安裝了Arch Linux)。
  3. 你須要64位CPU架構的計算機,舊版本的Vmware不支持在windows下安裝64位Linux,在安裝以前,須要檢查一下
  4. 我喜歡Ubuntu,可是生產環境是CentOS怎麼辦?這正是Docker最擅長的部分,Docker能夠輕易的在Ubuntu上安裝其餘Linux基礎鏡像。
  5. UFW Ubuntu 中的UFW可能會致使Docker容器的網絡沒法使用,修改/etc/default/ufw 中:DEFAULT_FORWARD_POLICY="DROP" 爲 DEFAULT_FORWARD_POLICY="ACCEPT",而後執行sudo ufw reload

官方文檔 - 安裝教程

在準備完成以上環境檢查後,就能夠去看安裝教程,文檔很是詳盡和具體docker

  1. Linux 教程:https://docs.docker.com/linux/step_one/
  2. Ubuntu 教程:https://docs.docker.com/engine/installation/linux/ubuntulinux/
  3. 全部支持的Linux 發行版本的安裝教程:https://docs.docker.com/engine/installation/

Docker的正常運行是須要Docker服務的支持,就像Apache Http Server 同樣,咱們稱之爲Docker守護進程shell

# 若是是經過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 infoubuntu

怎麼知道一切正常?windows

# 執行info指令
[root@kevin kevin]$ docker info

輸出:
Containers: 5
Running: 0
Server Version: 1.10.1
...省略一些
Registry: https://index.docker.io/v1/centos

大多數時候,你應該開始運行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:bash

  1. 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: 鏡像地址爲虛擬地址,實際按照倉庫提供方給的地址爲準

  1. 假設有個鏡像倉庫:192.168.1.2:5000 是企業的私有倉庫
  2. 若是倉庫不是https協議,你須要修改你的docker守護進程的啓動參數,讓它像這樣運行,若是你是自動安裝,那麼須要修改啓動腳本。
usr/bin/docker daemon -H fd:// --insecure-registry 192.168.1.2:5000
  1. 運行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
相關文章
相關標籤/搜索