一文快速入門Docker

James_Shangguan發表於2019-06-22

Docker提供一種安全、可重複的環境中自動部署軟體的方式,拉開了基於與計算平臺發展方式的變革序幕。如今Docker在網際網路公司使用已經非常普遍。本文用十分鐘時間,帶你快速入門Docker。

Docker是什麼

Docker是什麼?

官網首頁的介紹:

Enterprise Container Platform for High-Velocity Innovation. Securely build, share and run any application, anywhere

百度百科告訴我們:

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。

《第一本DOCKER書》的簡介:

Docker是一個能夠把開發的應用程式自動部署到容器的開源引擎。由Docker公司(www.docker.com,前dotCloud公司,PaaS市場中的老牌供應商)的團隊編寫,基於Apache 2.0開源協議發行。

Docker的特別之處:

Docker是輕量級的虛擬化技術,啟動速度快(大多數Docker容器只需不到1s即可完成啟動),單臺硬體上可以同時跑成百上千個容器,使得快速擴充套件,彈性伸縮變得簡單。據說,在2016年,京東使用15萬Docker叢集來保證618高併發場景下的系統穩定。

Docker是跨平臺的,支援Windows、Macos、Linux,可以做到“構建一次,到處執行”,解決開發環境和生產環境不一致帶來的一系列問題,讓開發人員和運維人員可以更加和諧相處。

Docker是開源的,託管於GitHub。

Docker思想

從docker的logo聯想docker核心思想

一文快速入門Docker

Docker的logo是一個載著集裝箱的大鯨魚,這絕對是對Docker最形象的描述和解釋。

對比運輸業,在集裝箱出現之前,貨物無法用統一的標準方式進行搬運,比如有些貨物易碎,需要輕拿輕放,有些則不需要。於是鐵路、公路、海洋等各種運輸之間,需要大量的人力作為貨物中轉,效率極低,而且成本很高。集裝箱出現之後,解決了這個難題,任何貨物貨物都可以放到這個神奇的箱子裡,然後在公路、鐵路、海洋等所有運輸場景下,這個箱子在運輸過程中都是密封的,而且中間的中轉工作,都可以通過大型機械搞定,效率大大提升。

Docker正式借鑑了標準集裝箱的思想,將集裝箱思想運用到了軟體領域。Docker為程式碼提供了一個基於容器的標準化運輸系統,可以將任何應用及其依賴的環境(如程式碼、配置檔案、JDK、Tomcat等)打包成一個容器,這個容器可以在幾乎所有的作業系統執行。

Docker核心概念

映象

映象是docker的基石,使用者可以基於映象來執行自己的容器。

映象的基礎是Docker的聯合檔案系統,該檔案系統是分層的,每個映象是一個層。由於每個層上面還以有其他層,也就是說,映象可以在其他映象(基礎映象)上面進行建立。借用一幅圖來幫助理解。圖片來源於網路,侵刪。
一文快速入門Docker

倉庫

倉庫是儲存使用者映象的地方,docker官方倉庫地址為 https://hub.docker.com。在Docker Hub上面有許多映象,包括最簡單的hello-world,MySQL等等。當然我們也可以有自己私有的倉庫。

容器

容器為應用程式提供了隔離的執行空間。每個容器內都包含一個獨享的完整的使用者環境,並且一個容器內的執行環境變動不會影響其他容器的執行環境,可以使應用程式在幾乎任何地方以相同的方式執行。

容器是基於映象啟動的,容器中可以執行一個或多個程式。在建立容器程式時,指定了這個程式所需要的Namespace引數,使得容器就只能「看」到當前 Namespace 所限定的資源、檔案、裝置、狀態,或者配置。所以說,容器是一種特殊的程式而已,容器的本質就是程式。

Docker安裝

以CentOS 7為例,進行安裝Docker。

檢查系統核心版本

Docker執行在 CentOS 7上,要求作業系統為 64 位,核心版本為 3.10 及以上。
確認本機已經安裝了滿足要求的Linux核心。使用命令uname -r來檢查核心版本資訊。

[root@localhost ~]# uname -r
3.10.0-957.el7.x86_64

在CentOS 7中安裝Docker

使用命令yum install -y docker安裝Docker,“-y”表示不詢問,使用預設配置進行安裝。

啟動Docker服務,並設定為開機自啟動

使用下列命令:

systemctl start docker.service
systemctl enable docker.service

檢視版本資訊

輸入docker version,返回版本資訊表明Docker安裝成功。

[root@localhost ~]# docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      b2f74b2/1.13.1
 Built:           Wed May  1 14:55:20 2019
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      b2f74b2/1.13.1
 Built:           Wed May  1 14:55:20 2019
 OS/Arch:         linux/amd64
 Experimental:    false

Docker實戰——Hello World

入門實戰怎麼能少得了經典的“Hello World”?

拉取映象

其實DockerHub上已經有了這個映象,名字叫“hello-world”。直接從DockerHub拉取映象,命令和Git有些相似:docker pull hello-world

[root@localhost docker]# docker pull hello-world
Using default tag: latest
Trying to pull repository docker.io/library/hello-world ... 
latest: Pulling from docker.io/library/hello-world
1b930d010525: Pull complete 
Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8
Status: Downloaded newer image for docker.io/hello-world:latest

檢視映象

檢視拉取到的Docker映象:docker images

[root@localhost ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world   latest              fce289e99eb9        5 months ago        1.84 kB

執行映象

執行映象:docker run hello-world。看到列印出如下的內容,代表執行成功。

[root@localhost docker]# docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Docker常用命令

docker images : 列出本地的映象

docker pull image_name:拉取映象。如果沒有指定具體的映象標籤,會自動拉取latest標籤的映象。

docker search image_name:在Docker Hub上查詢映象

docker start container:啟動和執行容器

docker run [OPTIONS] image_name:基於映象建立並啟動一個容器
常用選項:
-d: 後臺執行容器,並返回容器ID;
-i: 以互動模式執行容器,通常與 -t 同時使用;
-t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
-P: 隨機埠對映,容器內部埠隨機對映到主機的高階口
-p: 指定埠對映,格式為:主機(宿主)埠:容器埠

docker logs container:獲取容器的日誌資訊

docker attach container:進入容器

exit:退出容器

docker exec container command:在執行的容器中執行命令

docker stop container:停止容器

docker rm container:刪除容器

docker save -o image_name.tar image_name:匯出映象

docker ps:檢視正在執行的容器

docker ps -a:檢視系統中容器列表

docker top container:檢視容器內的程式

docker stop daemon_dave:停止守護容器

Docker構建映象

如何構建映象?

構建一個自己的映象需要兩步:

  1. 編寫Dockerfile。Dockerfile 告訴Docker如何製作映象以及每一步是怎樣的。
    Docker執行Dockerfile中的指令的流程是這樣的:
    • Docker從基礎映象執行一個容器
    • 執行一條指令,對容器進行修改
    • 提交到一個新的映象層
    • Docker再基於剛才提交的映象執行一個新容器
    • 執行Dockerfile中的下一條指令,知道所有指令執行完畢。
  2. 使用docker build命令構建。

編寫Dockerfile

每個Dockerfile的第一條命令必須是FROM。FROM指令指定一個已經存在的映象,告訴Docker後續的指令都是在這個基礎上進行的。例如:FROM java:8

MAINTAINER 指令用來標誌該映象所有者和聯絡方式。例如:MAINTAINER James "×××@example.com"

VOLUME 指令用來向基於映象建立的容器新增捲。一個卷可以是存在一個或者多個容器內的特定的目錄,這個目錄可以繞過聯合檔案系統,並提供共享資料和資料持久化的功能。

CMD 指令用來指定一個容器啟動時要執行的命令。

ENTRYPOINT指令與CMD指令很相似。

WORKDIR 指令用來從映象建立一個新容器的時候,在容器內部設定一個工作命令,ENTRYPOINT或CMD指令指定的程式會在這個目錄下執行。

ENV 指令用來在在映象構建過程中設定環境變數。例如:ENV TEST_PATH /home/test

RUN 指令用來在當前映象中執行指定的命令。例如:RUN apt-get install -y nginx

EXPOSE 指令用來告訴Docker該容器內的應用程式將使用容器的指定埠。例如:EXPOSE 80

ADD 指令用來將構建環境下的檔案和目錄複製到映象中。 例如:ADD docker-0.0.1-SNAPSHOT.jar app.jar

COPY 指令與ADD 類似,不同點在與COPY只關心在構建上下文中複製本地檔案,而不會提取和解壓。

LABEL 指令用於為Docker映象新增後設資料。例如:LABEL name=test description="a container is used to test"

Dockerfile例項:

FROM java:8
MAINTAINER James "×××@example.com"
VOLUME /tmp
ADD docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

執行docker build

執行docker build命令後看到“BUILD SUCCESS”表明構建成功,可以使用docker run命令來執行了。

總結

本文介紹了Docker是什麼、Docker思想、Docker核心概念、Docker安裝等內容,看完本文,Docker算是入門了,但是萬里長征只走完了第一步,學無止境,共勉。

相關文章