天天看點

隻要一小時,零基礎入門Docker

原文連結

Docker的三個概念

1.鏡像(Image):類似于虛拟機中的鏡像,是一個包含有檔案系統的面向Docker引擎的隻讀模闆。任何應用程式運作都需要環境,而鏡像就是用來提供這種運作環境的。例如一個Ubuntu鏡像就是一個包含 Ubuntu作業系統環境的模闆,同理在該鏡像上裝上Apache軟體,就可以稱為Apache鏡像。

2.容器(Container):類似于一個輕量級的沙盒,可以将其看作一個極簡的Linux系統環境(包括root權限、程序空間、使用者空間和網絡空間等),以及運作在其中的應用程式。Docker引擎利用容器來運作、隔離各個應用。容器是鏡像建立的應用執行個體,可以建立、啟動、停止、删除容器,各個容器之間是是互相隔離的,互不影響。注意:鏡像本身是隻讀的,容器從鏡像啟動時,Docker在鏡像的上層建立一個可寫層,鏡像本身不變。

3.倉庫(Repository):類似于代碼倉庫,這裡是鏡像倉庫,是Docker用來集中存放鏡像檔案的地方。注意與注冊伺服器(Registry)的差別:注冊伺服器是存放倉庫的地方,一般會有多個倉庫;而倉庫是存放鏡像的地方,一般每個倉庫存放一類鏡像,每個鏡像利用tag進行區分,比如Ubuntu倉庫存放有多個版本(12.04、14.04等)的Ubuntu鏡像。

Docker的安裝和解除安裝

Docker可以安裝在Windows、Linux、Mac等各個平台上。具體可以檢視文檔Install Docker。安裝完成之後,可以檢視Docker的版本資訊:

[root@xxx ~]# docker version
Client:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:
 OS/Arch:      linux/amd64
           

檢視Docker的幫助資訊:# docker --help。各種指令的用法也不再贅述,後邊用到哪些指令時會作出一定的解釋。

Docker中關于鏡像的基本操作
           

安裝完Docker引擎之後,就可以對鏡像進行基本的操作了。

我們從官方注冊伺服器(

https://hub.docker.com

)的倉庫中pull下CentOS的鏡像,前邊說過,每個倉庫會有多個鏡像,用tag标示,如果不加tag,預設使用latest鏡像:

[root@xxx ~]# docker search centos    # 檢視centos鏡像是否存在
[root@xxx ~]# docker pull centos    # 利用pull指令擷取鏡像
Using default tag: latest
latest: Pulling from library/centos
08d48e6f1cff: Pull complete
Digest: sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c
Status: Downloaded newer image for centos:latest

[root@xxx ~]# docker images    # 檢視目前系統中的images資訊
REPOSITORY      TAG            IMAGE ID       CREATED        SIZE
centos          latest         0584b3d2cf6d   9 days ago     196.5 MB           

以上是下載下傳一個已有鏡像,此外有兩種方法可以幫助你建立自有鏡像。

(1)利用鏡像啟動一個容器後進行修改 ==> 利用commit送出更新後的副本

[root@xxx ~]# docker run -it centos:latest /bin/bash    # 啟動一個容器
[root@72f1a8a0e394 /]#    # 這裡指令行形式變了,表示已經進入了一個新環境
[root@72f1a8a0e394 /]# git --version    # 此時的容器中沒有git
bash: git: command not found
[root@72f1a8a0e394 /]# yum install git    # 利用yum安裝git
......
[root@72f1a8a0e394 /]# git --version   # 此時的容器中已經裝有git了
git version 1.8.3.1           

此時利用exit退出該容器,然後檢視docker中運作的程式(容器):

[root@xxx ~]# docker ps -a
CONTAINER ID  IMAGE    COMMAND      CREATED   STATUS   PORTS    NAMES
72f1a8a0e394  centos:latest "/bin/bash"  9 minutes ago   Exited (0) 3 minutes ago      angry_hodgkin
           

這裡将容器轉化為一個鏡像,即執行commit操作,完成後可使用docker images檢視:

[root@xxx ~]# docker commit -m "centos with git" -a "qixianhu" 72f1a8a0e394 xianhu/centos:git

[root@xxx ~]# docker images
REPOSITORY       TAG    IMAGE ID         CREATED             SIZE
xianhu/centos    git    52166e4475ed     5 seconds ago       358.1 MB
centos           latest 0584b3d2cf6d     9 days ago          196.5 MB
           

其中,-m指定說明資訊;-a指定使用者資訊;72f1a8a0e394代表容器的id;xianhu/centos:git指定目标鏡像的使用者名、倉庫名和 tag 資訊。注意這裡的使用者名xianhu,後邊會用到。

此時Docker引擎中就有了我們建立的鏡像xianhu/centos:git,此鏡像和原有的CentOS鏡像差別在于多了個Git工具。此時我們利用新鏡像建立的容器,本身就自帶git了。

[root@xxx ~]# docker run -it xianhu/centos:git /bin/bash
[root@520afc596c51 /]# git --version
git version 1.8.3.1
           

利用exit退出容器。注意此時Docker引擎中就有了兩個容器,可使用docker ps -a檢視。

(2)利用Dockerfile建立鏡像

Dockerfile可以了解為一種配置檔案,用來告訴docker build指令應該執行哪些操作。一個簡易的Dockerfile檔案如下所示,官方說明:Dockerfile reference:

# 說明該鏡像以哪個鏡像為基礎
FROM centos:latest

# 建構者的基本資訊
MAINTAINER xianhu

# 在build這個鏡像時執行的操作
RUN yum update
RUN yum install -y git

# 拷貝本地檔案到鏡像中
COPY ./* /usr/share/gitdir/
           

有了Dockerfile之後,就可以利用build指令建構鏡像了:

[root@xxx ~]# docker build -t="xianhu/centos:gitdir" .
           

其中-t用來指定新鏡像的使用者資訊、tag等。最後的點表示在目前目錄尋找Dockerfile。

建構完成之後,同樣可以使用docker images指令檢視:

[root@xxx ~]# docker images
REPOSITORY        TAG       IMAGE ID      CREATED            SIZE
xianhu/centos     gitdir    0749ecbca587  34 minutes ago     359.7 MB
xianhu/centos     git       52166e4475ed  About an hour ago  358.1 MB
centos            latest    0584b3d2cf6d  9 days ago         196.5 MB
           

以上就是建構自己鏡像的兩種方法。其中也涉及到了容器的一些操作。如果想删除容器或者鏡像,可以使用rm指令,注意:删除鏡像前必須先删除以此鏡像為基礎的容器。

[root@xxx ~]# docker rm container_name/container_id
[root@xxx ~]# docker rmi image_name/image_id
           

鏡像其他操作指令:

[root@xxx ~]# docker save -o centos.tar xianhu/centos:git    # 儲存鏡像, -o也可以是--output
[root@xxx ~]# docker load -i centos.tar    # 加載鏡像, -i也可以是--input
           

Docker中關于容器的基本操作

在前邊鏡像的章節中,我們已經看到了如何基于鏡像啟動一個容器,即docker run操作。

[root@xxx ~]# docker run -it centos:latest /bin/bash
           

這裡-it是兩個參數:-i和-t。前者表示打開并保持stdout,後者表示配置設定一個終端(pseudo-tty)。此時如果使用exit退出,則容器的狀态處于Exit,而不是背景運作。如果想讓容器一直運作,而不是停止,可以使用快捷鍵 ctrl+p ctrl+q 退出,此時容器的狀态為Up。

除了這兩個參數之外,run指令還有很多其他參數。其中比較有用的是-d背景運作:

[root@xxx ~]# docker run centos:latest /bin/bash -c "while true; do echo hello; sleep 1; done"
[root@xxx ~]# docker run -d centos:latest /bin/bash -c "while true; do echo hello; sleep 1; done"
           

這裡第二條指令使用了-d參數,使這個容器處于背景運作的狀态,不會對目前終端産生任何輸出,所有的stdout都輸出到log,可以使用docker logs container_name/container_id檢視。

啟動、停止、重新開機容器指令:

[root@xxx ~]# docker start container_name/container_id
[root@xxx ~]# docker stop container_name/container_id
[root@xxx ~]# docker restart container_name/container_id
           

背景啟動一個容器後,如果想進入到這個容器,可以使用attach指令:

[root@xxx ~]# docker attach container_name/container_id
           

删除容器的指令前邊已經提到過了:

[root@xxx ~]# docker rm container_name/container_id

Docker中關于倉庫的基本操作

Docker官方維護了一個DockerHub的公共倉庫,裡邊包含有很多平時用的較多的鏡像。除了從上邊下載下傳鏡像之外,我們也可以将自己自定義的鏡像釋出(push)到DockerHub上。

在鏡像操作章節中,我們建立了一個xianhu/centos:git鏡像。

(1)通路

https://hub.docker.com/

,如果沒有賬号,需要先注冊一個。

(2)利用指令docker login登入DockerHub,輸入使用者名、密碼即可登入成功:

[root@xxx ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xianhu
Password:
Login Succeeded
           

(3)将本地的鏡像推送到DockerHub上,這裡的xianhu要和登入時的username一緻:

[root@xxx ~]# docker push xianhu/centos:git    # 成功推送
[root@xxx ~]# docker push xxx/centos:git    # 失敗
The push refers to a repository [docker.io/xxx/centos]
unauthorized: authentication required
           

(4)以後别人就可以從你的倉庫中下載下傳合适的鏡像了。

[root@xxx ~]# docker pull xianhu/centos:git
           

對應于鏡像的兩種建立方法,鏡像的更新也有兩種:

建立容器之後做更改,之後commit生成鏡像,然後push到倉庫中。

更新Dockerfile。在工作時一般建議這種方式,更簡潔明了。

這裡再一次回顧一下三個重要的概念:鏡像、容器、倉庫:

從倉庫(一般為DockerHub)下載下傳(pull)一個鏡像,Docker執行run方法得到一個容器,使用者在容器裡執行各種操作。Docker執行commit方法将一個容器轉化為鏡像。Docker利用login、push等指令将本地鏡像推送(push)到倉庫。其他機器或伺服器上就可以使用該鏡像去生成容器,進而運作相應的應用程式了。

利用Docker建立一個用于Flask開發的Python環境

上邊已經解釋和練習了Docker的基本操作指令,下邊以執行個體的形式完整走一遍流程。

我們建立一個用于Flask開發的Python環境,包含Git、Python3、Flask以及其他依賴包等。

完整指令如下:

[root@xxx ~]# docker pull centos
[root@xxx ~]# docker run -it centos:latest /bin/bash
此時進入容器,安裝Python3、Git、Flask及其依賴包等,安裝完成後exit退出
[root@xxx ~]# docker commit -m "Flask" -a "xianhu" container_id xianhu/flask:v1
[root@xxx ~]# docker push xianhu/flask:v1
           

釘釘掃碼進群,學習關于Docker更多内容,阿裡雲及其他領域的大佬們等着你哦~~~

隻要一小時,零基礎入門Docker