快速零基礎入門 Docker

VincentZ發表於2017-12-11

Docker是什麼?

Docker 是一個虛擬環境容器,可以將你的開發環境、程式碼、配置檔案等一併打包到這個容器中,併發布和應用到任意平臺中。比如,你在本地用 Python 開發網站後臺,開發測試完成後,就可以將 Python3 及其依賴包、Flask 及其各種外掛、Mysql、Nginx 等打包到一個容器中,然後部署到任意你想部署到的環境。

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:      17.09.0-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:40:09 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:45:38 2017
 OS/Arch:      linux/amd64
 Experimental: false
複製程式碼

檢視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
85432449fd0f: Retrying in 1 second
85432449fd0f: Pull complete
Digest: sha256:3b1a65e9a05f0a77b5e8a698d3359459904c2a354dc3b25ae2e2f5c95f0b3667
Status: Downloaded newer image for centos:latest
[root@xxx ~]# docker images                 # 檢視當前系統中的images資訊
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              3fa822599e10        11 days ago         204MB
複製程式碼

以上是下載一個已有映象,此外有兩種方法可以幫助你新建自有映象。

(1)利用映象啟動一個容器後進行修改 ==> 利用commit提交更新後的副本

[root@xxx ~]# docker run -it centos:latest /bin/bash  #啟動一個容器

[root@72f1a8a0e394 /]#                      # 這裡命令列形式變了,表示已經進入了一個新環境
[root@72f1a8a0e394 /]# git --version        # 此時的容器中沒有
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
95313628b747        centos:latest       "/bin/bash"         About a minute ago   Exited (0) 1 second ago                       laughing_swanson
複製程式碼

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

[root@xxx ~]# docker commit -m "centos with git" -a "qixianhu" 95313628b747 xianhu/centos:git
sha256:77da3b772c9068b4233532a9d39ef5effdee250be143514c6c859d4e9ed9cd1d
[root@xxx ~]# docker images
複製程式碼

其中,-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 --versiongit 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    # 儲存映象
[root@xxx ~]# docker load --input centos.tar    # 載入映象
複製程式碼

Docker中關於容器的基本操作

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

[root@xxx ~]# docker run -it centos:latest /bin/bash
複製程式碼

這裡-it是兩個引數:-i和-t。前者表示開啟並保持stdout,後者表示分配一個終端(pseudo-tty)。除了這兩個引數之外,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映象。 訪問 https://hub.docker.com/,如果沒有賬號,需要先註冊一個。 利用命令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: xianhuPassword: Login Succeeded
複製程式碼

將本地的映象推送到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
複製程式碼

以後別人就可以從你的倉庫中下載合適的映象了。

[root@xxx ~]# docker pull xianhu/centos:gi
複製程式碼

對應於映象的兩種建立方法,映象的更新也有兩種: 建立容器之後做更改,之後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的功能和特性還有很多,各種執行命令、引數等也都有待學習和練習,比如如何管理資料、如何管理網路、如何互相配合工作、如何編寫更專業的Dockerfile等。本文先入門為主,以後有時間再慢慢更新關於Docker的知識。

相關文章