零基礎入門 Docker(上)

一、Docker 簡介、應用場景和優點

1.1 簡介

  • Docker 是開源應用容器引擎,輕量級容器技術。
  • 基於 Go 語言,並遵循 Apache2.0 協議開源。
  • Docker 可以讓開發者打包他們的應用、依賴包及配置文件打包到一個輕量級、可移植的容器中,然後發佈到任何流行的 Linux 系統上,也可以實現虛擬化。
  • 容器完全使用沙箱技術,相互之間不會有任何接口。
  • 類似於虛擬機技術(vmware、vitural),但 docker 直接運行在操作系統(Linux)上,而不是運行在虛擬機中,速度快,性能開銷極低。

白話文,簡介就是:

Docker 支持將軟件編譯成一個鏡像,然後在鏡像中各種軟件做好配置,將鏡像發佈出去,其他使用者可以直接使用這個鏡像。 運行中的這個鏡像稱為容器,容器啟動是非常快速的。類似 windows 裡面的 ghost 操 作系統,安裝好後什麼都有了。

1.2 Docker 應用場景

  • Web 應用的自動化打包和發佈。
  • 自動化測試和持續集成、發佈。
  • 在服務型環境中部署和調整數據庫或其他的後臺應用。
  • 從頭編譯或者擴展現有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環境。

1.3 Docker 優點

  • 簡化程序: Docker 讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的 Linux 機器上,便可以實現虛擬化。Docker 改變了虛擬化的方式,使開發者可以直接將自己的成果放入Docker 中進行管理。方便快捷已經是 Docker 的最大優勢,過去需要用數天乃至數週的任務,在 Docker 容器的處理下,只需要數秒就能完成。
  • 避免選擇恐懼症: 如果你有選擇恐懼症,還是資深患者。Docker 幫你打包你的糾結!比如 Docker 鏡像;Docker 鏡像中包含了運行環境和配置,所以 Docker 可以簡化部署多種應用實例工作。比如 Web 應用、後臺應用、數據庫應用、大數據應用比如 Hadoop 集群、消息隊列等等都可以打包成一個鏡像部署。
  • 節省開支: 一方面,雲計算時代到來,使開發者不必為了追求效果而配置高額的硬件,Docker 改變了高性能必然高價格的思維定勢。Docker 與雲的結合,讓雲空間得到更充分的利用。不僅解決了硬件管理的問題,也改變了虛擬化的方式。

三、Docker 核心概念

3.1 docker 鏡像(Images)

  • 一個只讀模板,可以用來創建容器,一個鏡像可以創建多個容器
  • Docker 提供了一個很簡單的機制來創建和更新現有的鏡像,甚至可以直接從其他人那裡獲取做好的鏡像直接使用
  • 可以理解為 Java 中的類

3.2 docker 容器(Container)

  • 容器是從鏡像創建的運行實例,也就是鏡像啟動後的一個實例稱為容器,是獨立運行的一個或一組應用。
  • docker 利用容器來運行應用,他可以被啟動、開始、停止、刪除,每個容器都是相互隔離的、保證安全的平臺。
  • 可以把容器看做是一個簡易版的 Linux(包括 root 用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
  • 可以理解為 Java 中通過類創建的實例。

3.3 docker 倉庫(Resoisitory)

  • 倉庫是集中存放鏡像文件的場所,類似 git 代碼倉庫等。
  • 倉庫(Respository)和倉庫註冊服務器(Registry)是有區別的。倉庫註冊服務器一般存放多個倉庫,每個倉庫又有多個鏡像,每個鏡像又有不同的標籤(tag)。
  • 倉庫分為公開倉庫(public)和私有倉庫(private)兩種形式。
  • 最大的公開倉庫是 Docker Hub,國內的公開倉庫有阿里雲等。
  • 可以在本地網絡創建一個私有倉庫。
  • 當創建好自己的鏡像後,可以通過 push 命令把它上傳到公開或私有倉庫。
  • 倉庫的概念類似 Git,倉庫註冊服務器可以理解為 GitHub 這種託管服務。

3.4 docker 主機(Host)

  • 一個物理或虛擬的機器用來執行 Docker 守護進程和容器。

3.5 docker客戶端(Client)

  • 客戶端通過命令行或其他工具使用 Docker。

API 與 Docker 的守護進程進行通信

四、Docker 安裝及啟停

4.1 查看 centos 版本(以 centos7.4 為例)

Docker 要求 CentOS 系統的內核版本高於 3.10。

通過命令:

uname -r

查看當前 centos 版本,如版本不符,需升級系統版本。

4.2 升級軟件包及內核(可選)

yum update

4.3 安裝 docker

yum install docker

4.4 啟動 docker

systemctl start docker

4.5 將 docker 服務設為開機啟動

systemtctl enable docker

4.6 停止 docker

systemtctl stop docker 

五、Docker 鏡像常用操作命令

通常情況下,Docker 的鏡像都放在 Docker 的官網 Docker Hub 上,點此前往官網

5.1 鏡像檢索

除了可以在 Docker Hub 上搜索鏡像外,還可以通過命令 docker search xxx 進行搜索,下面以 mysql 為例:

docker search mysql

結果如下:

零基礎入門 Docker(上)


  • OFFICAL:是否是官方鏡像
  • AUTOMATED:是否是自動構建的

另,docker search -參數 含義:

  • -s 30:列出收藏數不小於指定值(此處為 30)的鏡像;
  • --no-trunc:顯示鏡像完整描述信息(eg. DESCRIPTION 字段完整展示);
  • --automated:只列出 automated build 類型的鏡像(利用 dockerhub 提供的自動化構建技術在服務端直接構建鏡像會被標記為 AUTOMATED);

5.2 鏡像下載

下載命名為:docker pull 鏡像名:tag;

其中,

  • tag 多為系統的版本,可選的,默認為 least;

eg.

docker pull mysql

5.3 鏡像列表

獲取已下載鏡像列表命令:docker images

零基礎入門 Docker(上)


其中,

  • RESPOSITORY 為鏡像名;
  • TAG 為鏡像版本;
  • least 代表最新版;
  • IMAGE_ID 為該鏡像唯一 ID;
  • CREATED 為該鏡像創建時間;
  • SIZE 為該鏡像大小。

docker images -參數 含義:

  • -a:列出本地所有鏡像,含中間鏡像層;
  • -q:只顯示鏡像 ID;
  • --digests:顯示鏡像摘要信息;
  • --no-trunc:顯示完整的鏡像信息(eg. 顯示完整的IMAGE_ID信息)。

5.4 鏡像刪除

刪除指定鏡像:

docker rmi image-id

刪除多個鏡像:

docker rmi mysql tomcat

刪除所有鏡像:

docker rmi $(docker images -q)

強制刪除鏡像:

docker rmi -f image-id:強制刪除(當前鏡像啟動的容器正在運行中,是無法正常刪除的,可以通過 -f 強制刪除)

如果刪除時不指定 TAG,默認為最新版 Least。

六、Docker 容器常用操作命令

鏡像運行起來後,稱為容器。 可以理解為軟件下載(下載 QQ)--> 安裝(QQ)--> 運行(QQ)的過程。 下面以 Tomcat 為例

6.1 搜索鏡像

docker search tomcat

6.2 下載鏡像

docker pull tomcat

6.3 根據鏡像新建並啟動容器

最簡單的根據鏡像新建並啟動容器的命令如下:

docker run --name container-name -d image-name 

運行一個容器,使用 docker run 命令即可。 另,docker run -參數 含義:

  • -- name:為容器起一個名稱;
  • -d:detached,執行完這句命令後,控制檯將不會阻塞,可以繼續輸入命令操作,不會阻塞,也就是啟動守護式容器,如果執行 docker run --name mycentos -it centos會進入啟動容器的命令控制檯,也就是啟動交互式容器;
  • -i:以交互方式運行容器,通常與 -t 搭配使用;
  • -t:為容器重新分配一個偽輸入終端,通常與 -i 搭配使用;
  • -P:隨機端口映射;
  • -p:指定端口映射,後面會有端口映射詳細講解;
  • image-name:要運行的鏡像名稱;

如果以守護式方式啟動 centos 容器,執行如下命令:docker run --name mycentos -d centos,會正常返回 container-id,但是通過 docker ps 查看,卻發現沒有在運行,通過 docker ps -a 發現,原來已經停止了,這是為什麼呢?

原因及解決方案詳見:點我直達

6.4 查看容器

可通過如下命令,查看運行中的容器列表:

docker ps


零基礎入門 Docker(上)


  • CONTAINER ID:啟動時生成的 ID;
  • IMAGE:該容器使用的鏡像;
  • COMMAND:容器啟動時執行的命令;
  • CREATED:容器創建時間;
  • STATUS:當前容器狀態;
  • PORTS:當前容器所使用的默認端口號;
  • NAMES:啟動時給容器設置的名稱。

另,docker ps -參數含義:

-a:查看所有容器,包括已停止運行的; -q:靜默模式,只顯示容器編號; -l:顯示最近創建的容器; -n 3:顯示最近創建的 num(此處為 3)個容器; --no-trunc:不截斷輸出,顯示完整信息。

6.5 停止容器

通過以下命令來停止運行中的容器:

docker stop container-name/container-id

強制停止容器(類似強制關機):

docker kill container-name/container-id

6.6 啟動容器

通過以下命令啟動容器:

docker start container-name/container-id

6.7 重啟容器

通過以下命令啟動容器:

docker restart container-name/container-id

6.8 刪除容器

刪除單個容器:

docker rm container-id

刪除多個容器:

docker rm container-id container-id 

刪除所有容器:

docker rm $(docker ps -a -q )

另,docker rm -參數含義:

-f:強制刪除,如果在運行中,先停止,再刪除

6.8 查看容器日誌

查看當前容器日誌,可通過如下命令:

docker logs container-id/container-name

另,docker logs -參數含義:

  • -t:加入時間戳;
  • -f:跟隨最新的日誌打印;
  • --tail:顯示最後多少條。

6.9 連接到正在運行容器

docker attach container-id:連接到正在運行的容器;

要attach上去的容器必須正在運行,可以同時連接上同一個container來共享屏幕(與screen命令的attach類似)。

官方文檔中說 attach 後可以通過 CTRL-C 來 detach,但實際上經過我的測試,如果 container 當前在運行 bash,CTRL-C 自然是當前行的輸入,沒有退出;如果 container 當前正在前臺運行進程,如輸出 nginx 的 access.log 日誌,CTRL-C 不僅會導致退出容器,而且還 stop 了。

這不是我們想要的,detach 的意思按理應該是脫離容器終端,但容器依然運行。好在 attach 是可以帶上 --sig-proxy=false 來確保 CTRL-D 或 CTRL-C 不會關閉容器。

eg.

docker attach --sig-proxy=false 7f237caad43b

6.10 在運行的容器中執行命令

運行中的容器其實是一個功能完備的簡易版 Linux 操作系統,所以我們可以像常規系統一樣進行登陸及退出操作。

命令為:

docker exec -it container-id/container-name bash

退出命令為:

exit

exec 和 attach 區別:

  • attach:直接進入容器啟動命令的終端,不會啟動新的進程;
  • exec:在容器中打開新的終端,並且可以啟動新的進程,可在宿主機中直接執行操作容器的命令,eg. docker exec -it 7f237caad43b ls /tmp。

6.11 查看容器中正在運行進程

可用通過如下命令查看容器中正在運行進程:

docker top container-id/container-top

6.12 查看容器內部細節

可用通過如下命令查看容器內部細節,返回為 json:

docker insepct container-id

6.13 容器和宿主機互相拷貝文件

宿主機拷貝文件到容器:

docker cp 文件 container-id:目標文件/文件夾
eg.
docker cp /tmp/suzhuji.txt 7f237caad43b:/tmp
將宿主機tem文件夾下suzhujia.txt文件拷貝到容器7f237caad43b中tmp目錄中

從容器拷貝文件到宿主機:

docker cp container-id:目標文件/文件夾 宿主機目標文件/文件夾
eg.
docker cp 7f237caad43b:/tmp/yum.log /tmp
將容器7f237caad43b中tmp目錄下yum.log拷貝到宿主機/tmp目錄下

6.14 更多操作命令

更多命令可以參考:

https://docs.docker.com/engine/reference/commandline/docker/

七、Docker 端口映射

7.1 啟動做端口映射的容器

容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過 -P(大寫) 或 -p (小寫) 參數來指定端口映射。啟動容器的時候如果不指定對應參數,在容器外部是無法通過網絡來訪問容器內的網絡應用和服務的。

Docker 的端口映射通過 -p 或 -P 參數實現,命令如下:

docker run --name tomcat1 -d tomcat
docker run --name tomcat2 -d -p 8888:8080 tomcat

如上,就把主機端口 8888 請求映射到 Docker 容器內部端口 8080 了。

-p 和 -P 區別為:

-P : 隨機映射一個49000~49900的端口到內部容器開放的網絡端口
-p : 可以指定要映射的IP和端口,但是在一個指定端口上只可以綁定一個容器

執行完這兩條命令後,通過 docker ps 查看:

零基礎入門 Docker(上)


通過 PORTS 可以看出,tomcat2 是做了端口映射的,tomcat1 是沒進行映射過的。

分別通過瀏覽器訪問:

http://*.*.*.*:8080/ // tomcat1默認端口; http://*.*.*.*:8888/ // 做過端口映射的 Tomcat2,8888 會轉發請求到 tomcat2 的 8080。

結果如下:

第一個請求是無法請求到的,原因開篇處說過了。
第二個請求是可以正常進行請求的,會由 tomcat2 容器進行處理

7.2 端口映射格式

ip:hostport:containerport #指定ip、指定主機port、指定容器port
eg. docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
指定映射使用一個特定地址,比如 localhost地址 127.0.0.1
ip::containerport #指定ip、未指定主機port、指定容器port
eg. docker run -d -p 127.0.0.1::5000 training/webapp python app.py
綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口
還可以使用 udp 標記來指定 udp 端口
eg. docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
hostport:container #未指定ip port、指定主機port、指定容器port
eg. docker run -d -p 5000:5000 training/webapp python app.py
將本地的 5000 端口映射到容器的 5000 端口,默認會綁定本地所有接口上的所有地址

7.3 查看端口映射

可以通過如下命令查看容器映射了哪些端口及協議:

docker port container-id

示例:

[root@docker ~]#docker port 46114af6b44e
8080/tcp -> 0.0.0.0:8888
[root@docker ~]#docker port cea668ee4db0

如果返回空,則代表沒進行端口映射。

7.4 小結

  • 容器有自己的內部網絡和 ip 地址,可以使用 docker inspect container-id 可以獲取所有的變量
  • Docker 還可以有一個可變的網絡配置
  • -p 標記可以多次使用來綁定多個端口 eg. docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

八、總結與瞻望

8.1 總結

通過本篇,希望你可以清楚的瞭解

  • Docker 是什麼,具有什麼樣的優勢和應用場景;
  • Docker 的安裝及核心概念;
  • Docker 容器及鏡像常用命令;
  • Docker 端口映射的原因及操作。

在準備好這些枯燥的理論基礎和基本命令後,就可以進行對 Docker 的進階與實戰篇了。

8.2 瞻望

在進階與實戰篇,預計內容規劃如下(可能會不斷調整及優化):

1. Docker 鏡像原理及 commit

1.1 再看鏡像及基礎鏡像

1.1 UnionFS 聯合文件系統

1.2 鏡像分層原理及好處

1.4 特點 Copy-on-Write

2. Docker 容器數據卷

2.1 介紹

2.2 用 V 命令添加

2.3 用 DockerFile 添加

2.4 volumes-from

3. Dockerfile 介紹及實戰

3.1 概念

3.2 構建過程解析

3.3 保留字指令

3.4 自定義鏡像

3.5 發佈鏡像

4. Docker 實戰

4.1 安裝 MySQL

4.2 安裝 Redis

4.3 本地鏡像推送到阿里雲

有問題請大家不吝留言!咱們下期再見!


分享到:


相關文章: