安裝docker以及經過容器建立鏡像

筆記內容:安裝docker
筆記日期:2018-02-02php

  • 25.1 docker簡介
  • 25.2 安裝docker
  • 25.3 鏡像管理
  • 25.4 經過容器建立鏡像

25.1 docker簡介

Docker是一個開放源代碼軟件項目,自2013年開始,近些年發展迅猛,它讓應用程序佈署在軟件容器下的工做能夠自動化進行,藉此在Linux操做系統上,提供一個額外的軟件抽象層,以及操做系統層虛擬化的自動管理機制。Docker利用Linux核心中的資源分脫機制,例如cgroups,以及Linux核心名字空間(name space),來建立獨立的軟件容器(containers)。這能夠在單一Linux實體下運做,避免引導一個虛擬機形成的額外負擔。Linux核心對名字空間的支持徹底隔離了工做環境中應用程序的視野,包括進程樹、網絡、用戶ID與掛載文件系統,而核心的cgroup提供資源隔離,包括CPU、內存、block I/O與網絡。從0.9版本起,Dockers在使用抽象虛擬是經由libvirt的 LXC與systemd - nspawn提供界面的基礎上,開始包括libcontainer庫作爲以本身的方式開始直接使用由Linux核心提供的虛擬化的設施,依據行業分析公司「451研究」:「Dockers是有能力打包應用程序及其虛擬容器,能夠在任何Linux服務器上運行的依賴性工具,這有助於實現靈活性和便攜性,應用程序在任何地方均可以運行,不管是公有云、私有云、單機等。」 。linux

簡單來講Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化,容器是徹底使用沙箱機制,相互之間不會有任何接口。git

Docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,能夠把貨物規整的擺放起來。而且各類各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不須要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裏封裝的好好的,那我就能夠用一艘大船把他們都運走。docker就是相似的理念。如今都流行雲計算了,雲計算就比如大貨輪。docker就是集裝箱。docker

  1. 不一樣的應用程序可能會有不一樣的應用環境,好比.net開發的網站和php開發的網站依賴的軟件就不同,若是把他們依賴的軟件都安裝在一個服務器上就要調試好久,並且很麻煩,還會形成一些衝突。好比IIS和Apache訪問端口衝突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來說,咱們能夠在服務器上建立不一樣的虛擬機在不一樣的虛擬機上放置不一樣的應用,可是虛擬機開銷比較高。docker能夠實現虛擬機隔離應用環境的功能,而且開銷比虛擬機小,小就意味着省錢了。數據庫

  2. 你開發軟件的時候用的是Ubuntu,可是運維管理的都是centos,運維在把你的軟件從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,好比:有個特殊版本的數據庫,只有Ubuntu支持,centos不支持,在轉移的過程中運維就得想辦法解決這樣的問題。這時候要是有docker你就能夠把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就能夠了。並且部署速度快。apache

  3. 在服務器負載方面,若是你單獨開一個虛擬機,那麼虛擬機會佔用空閒內存的,docker部署的話,這些內存就會利用起來。總之docker就是集裝箱原理。

docker特色:json

  • Docker由go語言編寫的,基於apache2.0協議發佈。
  • 基於linux kernel,要想在win下運行須要藉助一個vm(虛擬機)來實現

docker的 官網地址:vim

https://www.docker.com/centos

docker從1.13x開始,版本分爲社區版ce和企業版ee,而且基於年月的時間線形式,當前最新穩定版爲17.09 參考:bash

http://blog.csdn.net/chenhaifeng2016/article/details/68062414

Docker和傳統的虛擬化比較:
安裝docker以及經過容器建立鏡像
安裝docker以及經過容器建立鏡像

Docker的優點:

  • 啓動很是快,秒級實現
  • 資源利用率高,一臺高配置服務器能夠跑上千個docker容器
  • 更快的交付和部署,一次建立和配置後,能夠在任意地方運行
  • 內核級別的虛擬化,不須要額外的hypevisor支持,會有更高的性能和效率
  • 易遷移,平臺依賴性不強

安裝docker以及經過容器建立鏡像

Docker核心概念:

  • 鏡像,是一個只讀的模板,相似於安裝系統用到的那個iso文件,咱們經過鏡像來完成各類應用的部署。
  • 容器,鏡像相似於操做系統,而容器相似於虛擬機自己。它能夠被啓動、開始、中止、刪除等操做,每一個容器都是相互隔離的。
  • 倉庫,存放鏡像的一個場所,倉庫分爲公開倉庫和私有倉庫。 最大的公開倉庫是Docker hub(hub.docker.com),國內公開倉庫(dockerpool.com)

25.2 安裝docker

因爲docker的ee企業版是須要收取必定費用的,因此咱們安裝的是ce社區版,如下是官方的安裝文檔:

https://docs.docker.com/install/linux/docker-ce/centos/

如下是個人安裝步驟:

1.若是你的系統沒有安裝過docker的話,只須要兩步就能夠把docker安裝上,首先使用如下命令下載docker的repo源:

curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo

2.而後直接經過yum安裝便可:

yum install -y docker-ce

若是以上這種安裝方式的速度比較慢的話,你們也能夠直接下載rpm包:

https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

下載完以後也須要使用yum安裝,yum能夠自動解決依賴關係:

yum install -y docker-ce-xxxx.rpm

3.安裝完成以後,啓動docker:

[root@server ~]# systemctl start docker  # 啓動docker
[root@server ~]# ps aux |grep docker   # 查看進程
root       5289  2.3  1.6 531968 30256 ?        Ssl  23:16   0:00 /usr/bin/dockerd
root       5297  1.5  1.2 366740 22500 ?        Ssl  23:16   0:00 docker-containerd --config /var/run/docker/containerd/containerd.toml
root       5438  0.0  0.0 112652   964 pts/0    S+   23:17   0:00 grep --color=auto docker

啓動docker後,會自動生成一些iptables規則:

[root@server ~]# iptables -nvL
Chain INPUT (policy ACCEPT 1022 packets, 421K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 DOCKER-ISOLATION  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 828 packets, 382K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER-ISOLATION (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           
[root@server ~]# iptables -t nat -nvL  # 查看net表
Chain PREROUTING (policy ACCEPT 4 packets, 1040 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 4 packets, 1040 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 103 packets, 6545 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 103 packets, 6545 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0           

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0           
[root@server ~]#

可是這生成的規則是臨時的,若是想要保存,可使用如下命令,不過通常沒有這個必要:

service iptables save


25.3 鏡像管理

1.首先咱們須要從docker上拉取一個鏡像,例如我要拉取一個centos的鏡像,命令以下:

[root@server ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Pull complete 
Digest: sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d
Status: Downloaded newer image for centos:latest  # 拉取完成
[root@server ~]#

若是下載得很慢的話,咱們須要配置一個docker加速器,具體的配置能夠參考如下文檔:

http://blog.csdn.net/xlemonok/article/details/71403534

個人配置以下:

[root@server ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["阿里雲加速器地址"]
}

說明:這個url爲加速器地址,須要自行去阿里雲申請。

配置完以後重啓docker。而後再進行拉取鏡像速度就會快不少了。

把鏡像拉取下來以後,就能夠進行使用了,如下是一些經常使用的命令:

1.查看本地的鏡像:

[root@server ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        3 weeks ago         207MB
[root@server ~]#

說明:

  • REPOSITORY 倉庫
  • TAG 標籤,至關於給這個鏡像標上一個版本,用於區分這是新版本仍是舊版本,或者用於區分這是什麼環境的版本,老是就是做爲一個標識符的存在
  • IMAGE ID是這個鏡像的惟一標識,用於區分系統中不一樣的鏡像
  • CREATED ,何時建立的
  • SIZE,這個鏡像的大小

2.搜索鏡像命令,用於搜索哪些鏡像能夠提供下載,其中xxx是關鍵詞:

[root@server ~]# docker search xxx

例如我要搜索centos的鏡像,則格式以下:

[root@server ~]# docker search centos

3.咱們能夠給某一個鏡像打標籤或者說定義它的標識,打上標籤後會新生成一個不一樣標籤的鏡像:

[root@server ~]# docker tag centos test_centos 
[root@server ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        3 weeks ago         207MB
test_centos         latest              ff426288ea90        3 weeks ago         207MB
[root@server ~]#

雖說會新生成一個鏡像,但其實並非,從上面的輸出結果能夠看到,這兩個鏡像使用的IMAGE ID是同樣的,那它們其實就是同一個,不一樣的只是標籤。

除了能夠定義鏡像的 REPOSITORY 以外,還能夠定義鏡像的TAG:

[root@server ~]# docker tag centos test_centos2:171104
[root@server ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        3 weeks ago         207MB
test_centos2        171104              ff426288ea90        3 weeks ago         207MB
test_centos         latest              ff426288ea90        3 weeks ago         207MB
[root@server ~]#

4.咱們說了docker是容器,因此下載到鏡像後,還須要把鏡像啓動爲容器:

[root@server ~]# docker run -itd centos
79fab4540315f6eb2b5616a2f8c8fabbcba7f3b5dffd46d52f98473c323594e9
[root@server ~]#

-i表示讓容器的標準輸入打開,-t表示分配一個僞終端,-d表示後臺啓動,要把-i -t -d 放到鏡像名字前面。

5.查看運行中的容器:

[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
79fab4540315        centos              "/bin/bash"         46 seconds ago      Up 44 seconds                           friendly_chatterjee
[root@server ~]#

加上-a選項後能夠查看全部容器,包括未運行的。

6.刪除指定鏡像:

[root@server ~]# docker rmi test_centos
Untagged: test_centos:latest
[root@server ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        3 weeks ago         207MB
test_centos2        171104              ff426288ea90        3 weeks ago         207MB
[root@server ~]#

後面的參數能夠是 REPOSITORY 也能夠是 TAG,若是是TAG時,其實是刪除該TAG。當後面的參數爲鏡像ID時,則會完全刪除整個鏡像,全部標籤也會一同刪除。

或者 REPOSITORY 和 TAG 一塊兒使用:

[root@server ~]# docker rmi test_centos2:171104
Untagged: test_centos2:171104
[root@server ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        3 weeks ago         207MB
[root@server ~]#

25.4 經過容器建立鏡像

咱們從倉庫上拉取到一個鏡像後,啓動爲容器就可使用了,可是,可能這個容器裏面的環境不是我須要的,因此咱們須要本身進行定製,例如在裏面配置本身須要的環境什麼的,配置好以後把這個容器生成一個鏡像就能夠拿到其餘機器上使用了。

1.想要定製容器的環境,首先要進入到容器裏,命令以下:

[root@server ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
79fab4540315        centos              "/bin/bash"         27 minutes ago      Up 27 minutes                           friendly_chatterjee
[root@server ~]# docker exec -it 79fab4540315 bash
[root@79fab4540315 /]# ls  # 進入成功
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr
[root@79fab4540315 /]#

這個拉取下來的centos鏡像,是一個閹割的操做系統,不少東西都沒有的,須要本身經過yum去安裝。

說明:

  • 其中 79fab4540315 爲運行時該容器的id,這個id使用docker ps命令能夠查看到
  • 最後面的bash爲進入容器後咱們要執行的命令,這樣就能夠打開一個終端

2.進入到該容器後,咱們能夠作一些變動,好比安裝一些東西,搭建本身須要的環境,而後針對這個容器進行建立新的鏡像:

## 隨便裝點東西
[root@79fab4540315 /]# yum install -y net-tools
[root@79fab4540315 /]# yum install vim

3.安裝完成後Ctrl + d退出該容器,而後執行如下命令生成一個鏡像:

[root@server ~]# docker commit -m "install net-tools and vim" -a "author" 79fab4540315 test_centos
sha256:0749459e3be3d66c787217bc7842c0856f7452e286f38e7e7979218787c1842a
[root@server ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test_centos         latest              0749459e3be3        11 seconds ago      359MB
centos              latest              ff426288ea90        3 weeks ago         207MB
[root@server ~]#

說明:

  • docker commit建立鏡像命令
  • -m指定該鏡像的描述信息
  • -a指定鏡像做者的信息
  • 79fab4540315爲該容器的id
  • test_centos則是生成的新鏡像的名稱

若是熟悉git或svn的命令行操做的話,會發現這和它們的命令格式很像。

以上咱們就經過容器建立了一個新的、由本身自定義環境的鏡像,以後使用該鏡像時,就不須要再去搭建環境了。並且咱們能夠把這個鏡像放到一個倉庫上,這樣其餘機器也能夠下載。這就和集裝箱同樣,把東西都封裝到一個箱子裏,不只方便移動,還能夠開箱即用。

相關文章
相關標籤/搜索