天天看點

Docker使用教程

  Docker是一個開源的引擎,可以輕松的為任何應用建立一個輕量級的、可移植的、自給自足的容器。讓開發者可以打包他們的應用到一個可移植的容器中,然後釋出到任何Linux機器上,還可以實作虛拟化。容器是完全使用沙箱機制,互相之間不會有任何接口。

1 Docker和虛拟機的差別 :

容器是一種輕量級的基于作業系統級别的虛拟技術,不像虛拟機具有完整的CPU、記憶體和磁盤,是基于硬體的虛拟化技術。容器和主控端共享核心,所有容器共享作業系統。

容器啟動快 開源免費 輕量級虛拟化能夠部署100-1000個容器

2 重要概念:

1)元件:

docker鏡像(Images):鏡像運作之後成為容器,包含了應用程式和其運作時依賴環境的隻讀檔案。

docker倉庫:Registry是Docker鏡像的中央存儲倉庫

docker容器:容器是獨立運作的一個或一組應用。可以看成是一個簡易版的Linux運作環境(可以了解為在沙盒中運作的程序)。

3 安裝

系統環境:CentOS 7.2

[zwj@localhost home]$ sudo yum -y install docker (CentOS6的安裝:yum -y install docker-io)

[zwj@localhost home]$ sudo systemctl start docker.service

[zwj@localhost home]$ sudo systemctl status docker.service

[zwj@localhost home]$ sudo systemctl enable docker.service

[zwj@localhost system]$ docker -v

Docker version 1.12.6, build 1398f24/1.12.6

4 基本操作

常用指令:

搜尋某個鏡像:docker search name

擷取某個鏡像:docker pull name

檢視鏡像:docker images

删除鏡像:docker rmi name

啟動容器:docker start 容器ID

停止容器:docker stop 容器ID

檢視容器:docker ps -a

進入容器:docker exec 或 docker attach、nsenter,如:docker exec -it 6f48b7e16fe8 /bin/bash,建議使用nsenter指令進入

删除容器:docker rm 容器ID(需要先停止容器)

建立容器,退出時自動删除容器:docker run --rm centos /bin/echo "hehe"

4.1 鏡像和容器

下載下傳鏡像:

[zwj@localhost system]$ sudo docker pull centos

檢視本地鏡像:        

[zwj@localhost ~]$ sudo docker images             

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              3bee3060bfc8        12 days ago         192.5 MB

使用centos鏡像建立一個容器,并在容器中執行指令(如果本地沒有鏡像,會從公共倉庫去下載下傳):

[zwj@localhost ~]$ sudo docker run centos /bin/echo "hehe"   

hehe

檢視目前所有容器,每個容器有唯一的ID和名稱:

[zwj@localhost ~]$ sudo docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES

ba7ecb84d0e1        centos              "/bin/echo hehe"    5 minutes ago       Exited (0) 5 minutes ago                       silly_carson

建立一個name叫mydocker的容器,并且登陸到容器:參數-t:表示為容器配置設定一個僞終端,-i:啟動一個容器并進入互動模式,-d:背景運作

[zwj@localhost ~]$ sudo docker run --name mydocker -t -i centos /bin/bash

[root@6f48b7e16fe8 /]# 

退出容器後,容器處于退出狀态

[root@6f48b7e16fe8 ~]# exit

exit

[zwj@localhost ~]$ sudo docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES

6f48b7e16fe8        centos              "/bin/bash"         10 minutes ago      Exited (0) About a minute ago                       mydocker

ba7ecb84d0e1        centos              "/bin/echo hehe"    24 minutes ago      Exited (0) 23 minutes ago                           silly_carson

有什麼辦法在退出之後容器依然處于啟動狀态呢,步驟如下:

[zwj@localhost ~]$ sudo yum -y install util-linux

[zwj@localhost ~]$ sudo docker start 6f48b7e16fe8     #啟動容器

6f48b7e16fe8

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES

6f48b7e16fe8        centos              "/bin/bash"         About an hour ago   Up About a minute                                  mydocker

ba7ecb84d0e1        centos              "/bin/echo hehe"    About an hour ago   Exited (0) About an hour ago                       silly_carson

[zwj@localhost ~]$ sudo docker inspect --format "``.`State`.`Pid`" 6f48b7e16fe8 #擷取容器PID

3820

[zwj@localhost ~]$ sudo nsenter -t 3820 -u -i -n -p            #進入容器

[root@6f48b7e16fe8 zwj]# 

[root@6f48b7e16fe8 zwj]# exit            #退出後,容器依然處于啟動狀态

logout

6f48b7e16fe8        centos              "/bin/bash"         About an hour ago   Up 16 minutes                                      mydocker

4.2 網絡和存儲

建立并運作nginx容器,建立成功後會傳回容器ID号,但是檢視時通常是顯示前幾位而不是整個ID号。-d:背景運作,-P:預設比對docker容器端口到主控端随機端口。

[zwj@localhost system]$ sudo docker run -d -P nginx

06b751db90b24ca8750c6d25f0b424e72dba36d9261d0d09817c435ada5c0e68

由下面的輸出可以看到,把本機的32768端口映射到了容器的80号端口。

[zwj@localhost system]$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES

06b751db90b2        nginx               "nginx -g 'daemon off"   7 minutes ago       Up 7 minutes        0.0.0.0:32768->80/tcp   distracted_ride

6f48b7e16fe8        centos              "/bin/bash"              2 hours ago         Up About an hour                            mydocker

從用戶端通路結果如下:

<a href="https://s1.51cto.com/wyfs02/M01/99/3F/wKiom1lGUFvAnBlaAADjCKTrlEc376.png-wh_500x0-wm_3-wmp_4-s_4160655064.png" target="_blank"></a>

檢視容器日志:

[zwj@localhost system]$ sudo docker logs 06b751db90b2

檢視日志的實時輸出:

[zwj@localhost system]$ sudo docker logs -f  06b751db90b2

也可以指定特定端口映射,注意docker run會另外建立一個容器

[zwj@localhost system]$ sudo docker run -d -p 88:80 nginx

f54ba5b475a04371ba84a2b193ff691d7545461e5f6d85309967fa0e86ca2b45

f54ba5b475a0        nginx               "nginx -g 'daemon off"   11 seconds ago      Up 6 seconds        0.0.0.0:88-&gt;80/tcp      reverent_liskov

06b751db90b2        nginx               "nginx -g 'daemon off"   26 minutes ago      Up 26 minutes       0.0.0.0:32768-&gt;80/tcp   distracted_ride

存儲之資料卷:

使用-v參數建立資料卷并且挂載到容器,-v /data

[zwj@localhost system]$ sudo docker run -it --name volume-test1 -v /data centos

[root@834a476135d3 /]# ls -l /data

total 0

使用-v參數挂載本地目錄至容器,-v src:dst

[zwj@localhost ~]$ sudo docker run -it --name test -v /opt:/opt centos

挂載并授予讀寫的權限,

[zwj@localhost ~]$ sudo docker run -it --name test -v /opt:/opt:rw centos

除了目錄,還可以挂載檔案。

存儲之資料卷容器 --volumes-from:通常适應于一個容器通路另一個容器,

建立一個容器取名nfs

[zwj@localhost ~]$ sudo docker run -d --name nfs -v /data centos

d65376b3a601dc338ad93cf2ab3ec163218e595cd36e4a4353f82e08b38b2670

建立另一個容器test01,并且把nfs挂載到test01,可以看到test01根目錄下有/data目錄

[zwj@localhost ~]$ sudo docker run -it --name test01 --volumes-from nfs centos

[root@d38127cd879b /]# ls

anaconda-post.log  bin  data  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

4.3 手動建構鏡像 

下載下傳基礎鏡像

建立容器,并且進入容器

[zwj@localhost ~]$ sudo docker run --name mynginx -it centos

在容器中安裝epel源

[root@1418e12567d5 /]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

在容器中安裝nginx

[root@1418e12567d5 /]# yum -y install nginx

然後建立新的鏡像,

[zwj@localhost ~]$ sudo docker commit -m "my nginx" -a "zwj" 1418e12567d5  aa/a01:1.1

參數說明:

-m:送出的描述資訊

-a:指定鏡像作者

1418e12567d5:容器ID

aa/a01:指定要建立的鏡像名

檢視鏡像,aa/a01鏡像已存在

[zwj@localhost ~]$ sudo docker images

aa/a01              1.1                 797ed1764943        33 seconds ago      367.9 MB

docker.io/nginx     latest              958a7ae9e569        2 weeks ago         109.4 MB

基于aa/a01鏡像建立新的容器nginx01

[zwj@localhost ~]$ sudo docker run -it --name nginx01  aa/a01:1.1 

修改容器nginx01中nginx配置檔案,使容器在背景運作時nginx能夠運作 

[root@bd27b093bf3e /]# vi /etc/nginx/nginx.conf

daemon off;

user nginx;

基于上次修改,再次送出建立新的鏡像

[zwj@localhost ~]$ sudo docker commit -m "my nginx" -a "zwj" bd27b093bf3e  aa/a01:1.2

aa/a01              1.2                 42da08d9d427        2 minutes ago       367.9 MB

aa/a01              1.1                 797ed1764943        22 minutes ago      367.9 MB

基于新鏡像建立容器,并且在容器中運作nginx指令

[zwj@localhost ~]$ sudo docker run -d -p 82:80 aa/a01:1.2 nginx

[zwj@localhost ~]$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES

999ce7bd6559        aa/a01:1.2          "nginx"                  About a minute ago   Up About a minute   0.0.0.0:82-&gt;80/tcp   prickly_meninsky

4.4 Docker-file建構鏡像:由一系列參數和指令構成的腳本,最終建立成新的鏡像。

[zwj@www ~]$ sudo mkdir -pv dockerfile/nginx

mkdir: created directory ‘dockerfile’

mkdir: created directory ‘dockerfile/nginx’

[zwj@www ~]$ sudo tree dockerfile/

dockerfile/

└── nginx

1 directory, 0 files

[zwj@www ~]$ cd dockerfile/nginx/

[zwj@www nginx]$ sudo vim index.html

&lt;h&gt;Server 192.168.3.158&lt;/h&gt;

#建立Dockerfile檔案,其中#号表示注釋

[zwj@www nginx]$ sudo vim Dockerfile

#This is Dockerfile

#Version:1.1

#Author:zwj

#Base image

FROM centos

#Author

MAINTAINER zwj [email protected]

#Commands

RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

RUN yum install -y nginx

ADD index.html /usr/share/nginx/html/index.html

RUN echo "daemon off;" &gt;&gt; /etc/nginx/nginx.conf

EXPOSE 80

CMD ["nginx"]

#根據檔案建立鏡像,-t指定鏡像名,後面是Dockerfile檔案的絕對路徑(目錄的路徑)

[zwj@www nginx]$ sudo docker build -t test/nginx:1.0 /home/zwj/dockerfile/nginx/

#檢視建立的鏡像

[zwj@www nginx]$ sudo docker images

test/nginx          1.0                 86dcc8884006        46 seconds ago      400.8 MB

docker.io/centos    latest              36540f359ca3        10 days ago         192.5 MB

#現在可以使用建立的鏡像建立容器

[zwj@www nginx]$ sudo docker run -d -p 808:80 --name nginx test/nginx:1.0

[zwj@www nginx]$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                 NAMES

6bf9453e4b71        test/nginx:1.0      "nginx"             38 seconds ago      Up 37 seconds       0.0.0.0:808-&gt;80/tcp   nginx

附:Dockerfile檔案的指令介紹:

FROM:必須是Dockerfile的首個指令,用于定義鏡像源

MAINTAINER:用于聲明作者

ADD:從源檔案系統複制檔案到目标容器的檔案系統 

CMD:描述容器啟動後,執行的程式

ENTRYPOINT:配置一個容器使之可執行化,

ENV:用于設定環境變量,如:key=value

EXPOSE:用來指定端口

RUN:是Dockerfile執行指令的核心部分,它接受指令作為參數并用于建立的鏡像

USER:設定容器的UID

VOLUME:用于讓你的容器通路主機上的目錄

WORKDIR:用于設定CMD指明的指令的運作目錄

4.5 建立私有倉庫

#下載下傳registry鏡像(用于建立私有倉庫)

[zwj@www nginx]$ sudo docker pull registry

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE

test/nginx           1.0                 86dcc8884006        39 minutes ago      400.8 MB

docker.io/centos     latest              36540f359ca3        10 days ago         192.5 MB

docker.io/registry   latest              c2a449c9f834        2 weeks ago         33.18 MB

#使用該鏡像建立一個容器:預設情況下,會将倉庫存放于容器内的/tmp/registry目錄下

[zwj@www ~]$ sudo docker run -d -p 5000:5000 registry

b6b84915dbd24426c6cfae5737555f4a9e3f3ef2145ed6317f347ff99c1e119e

[zwj@www ~]$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

b6b84915dbd2        registry            "/entrypoint.sh /etc/"   18 minutes ago      Up 18 minutes       0.0.0.0:5000-&gt;5000/tcp   lonely_heisenberg

#标記本地鏡像:

[zwj@www ~]$ sudo docker tag test/nginx:1.0  120.77.148.249:5000/zwj/nginx:1.1

#把鏡像推送至倉庫:

[zwj@www ~]$ sudo docker push 120.77.148.249:5000/zwj/nginx:1.1

生産環境應用:

1)Docker Web管理工具:shipyard

2)規劃

3)準備好基礎鏡像

本文轉自 zengwj1949 51CTO部落格,原文連結:http://blog.51cto.com/zengwj1949/1939456