Docker基礎(2) 實踐篇

Docker基礎(2) 實踐篇

  • Docker的指令系統
  • 全局指令
  • Docker倉庫管理
  • Docker鏡像管理
    • Dockerfile
  • Docker容器管理
    • Docker Compose
  • 命令的嵌套

Docker的指令系統

Docker指令的操作對象主要針對四個方面:

  • 針對守護進程的系統資源設置和全局信息的獲取。比如:docker info、docker deamon等。
  • 針對Docker倉庫的查詢、下載操作。比如:docker search、docker pull等。
  • 針對Docker鏡像的查詢、創建、刪除操作。比如:docker images、docker build等。
  • 針對Docker容器的查詢、創建、開啓、停止操作。比如:docker ps、docker run、docker start等。

具體信息可以通過在終端輸入docker可以查看,使用docker COMMAND --help還可以進一步查看某條指令的使用方式。
接下來學習一些常用的基本指令。

守護進程的系統資源設置和全局信息的獲取

查看Docker版本信息:

$ docker version
Client:
 Version:           18.09.7
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        2d0083d
 Built:             Fri Aug 16 14:19:38 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.09.7
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       2d0083d
  Built:            Thu Aug 15 15:12:41 2019
  OS/Arch:          linux/amd64
  Experimental:     false

查看設備信息,比如服務器版本、存儲驅動程序、內核版本、操作系統、總內存等:

$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 14
Server Version: 18.09.7
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
...

Docker倉庫管理

Docker hub是Docker的公有倉庫,一般需要的鏡像都可以從這裏下載。用戶還也可以上傳自制的鏡像。

查找鏡像,下面這條命令將搜索與centos相關的鏡像:

$ docker search centos

下載鏡像,冒號可以指定版本號,如果省略,默認下載最新版本,相當於:latest

$ docker pull imageA:1.0

上傳鏡像,前提要註冊Docker Hub賬號,並使用docker login登錄

$ docker pull imageA:1.1

Docker鏡像管理

查看所有本地鏡像

$ docker images 

或者

$ docker image ls

每個鏡像都有一個唯一的ImageID,全長128位,默認只顯示12位縮寫,加上-a還可以看到build命令生成的中間鏡像。

Docker鏡像具有分層的結構,使用docker history可以查詢一個鏡像分了多少層,以及每一層所作的變更

$ docker history dockerapitestimage:latest

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
0112b74edea7        2 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["dotnet" "Web…   0B
5185fbd03612        2 weeks ago         /bin/sh -c #(nop) COPY dir:9a2de08b90587d600…   294kB
d2f4b4e061f1        2 weeks ago         /bin/sh -c #(nop)  EXPOSE 5000                  0B
ca882651894c        2 weeks ago         /bin/sh -c #(nop) WORKDIR /app                  0B
e28362768eed        3 weeks ago         /bin/sh -c aspnetcore_version=3.1.1     && c…   17.8MB
<missing>           3 weeks ago         /bin/sh -c dotnet_version=3.1.1     && curl …   76.7MB
<missing>           3 weeks ago         /bin/sh -c apt-get update     && apt-get ins…   2.28MB
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV ASPNETCORE_URLS=http:…   0B
<missing>           3 weeks ago         /bin/sh -c apt-get update     && apt-get ins…   41.3MB
<missing>           3 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:ba0c39345ccc4a882…   69.2MB

刪除鏡像命令爲

$ docker image rm [Image Name]

Dockerfile

通過Dockerfile可以指定build鏡像的步驟、每一步所執行的操作,只需一次編寫,之後直接就可以方便地運行了。
下面便是一個最簡單的Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 5000
COPY . .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

Dockerfile的語法規則及常用的關鍵字爲:

  • 每行都以一個關鍵字爲行首,如果一行內容過長,可使用反斜槓’'換行
  • FROM關鍵字,指定了build所使用的基礎鏡像
  • MAINTAINER關鍵字:指定該鏡像創建者
  • ENV關鍵字:設置環境變量
  • RUN關鍵字:運行shell命令,如果有多條命令可以用“&&”連接
  • COPY關鍵字:將編譯機本地文件拷貝到鏡像文件系統中
  • EXPOSE關鍵字:指定監聽的端口
  • WORKDIR關鍵字:指定在創建容器後,終端默認登陸進來的工作目錄
  • ENTRYPOINT關鍵字:這個關鍵字和前面關鍵字的區別在於,之前的關鍵字都是在創建鏡像時執行,而ENTRYPOINT指定的內容在啓動容器時纔會執行

Dockerfile的執行

Dockerfile編寫好後,在它所在的目錄通過docker build就可以執行了,也可以通過-f指定Dockerfile所在的路徑,使用-t 可以爲要build的鏡像指定一個名稱。

$ docker build -t test:1.0

docker build會根據Dockerfile的內容,逐行根據關鍵字執行,每一步都會生成一個臨時的中間鏡像。這些中間鏡像可以使用docker image ls -a查看。

Docker容器管理

查看本機現有的容器,默認只顯示正在運行的,增加-a可顯示所有容器,包括停止的

$ docker ps -a

基於鏡像創建並啓動容器,-d 可以讓容器在後臺運行,–name可以指定容器名稱,通過–env傳遞環境變量,

$ docker run -d --name api1 [Image Name]

容器創建後,Docker會給它分配一個Container ID,也是128位,默認顯示前12位,通過Container ID或者創建容器時指定的name,就可以控制容器的啓動停止了。

$ docker stop <container id/name>
$ docker start <container id/name>

查看容器運行日誌可以使用:

$ docker logs <container id/name>

下面這條命令可以查詢容器的所有基本信息,包括運行情況、存儲位置、配置參數、網絡設置等

$ docker inspect <container id/name>

docker inspect以JSON格式展示全部信息,也可以通過"-f"使用Golang模板來提取指定的信息

$ docker inspect -f {{.NetworkSettings.Bridge}} <container id/name>

實時查看容器所佔用的系統資源,如CPU使用率、內存、網絡和磁盤開銷:

$ docker stats <container id/name>

在容器內部執行命令的方式

$ docker exec <container id/name> <cmd>

Docker Compose

稍微複雜的應用都會使用多個容器,如果要一個一個容器地啓動會非常麻煩,再加上集羣和容器間的依賴,將使應用的維護變得非常困難。Docker compose提供了一種最基本的多容器管理的方式。
比如,WordPress應用的創建需要下面兩條指令:

$ docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb
$ docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress

由於MyWordPress容器依賴其db容器,所以要先啓動db容器。
停止的時候先停止MuWordPress容器,再停止db。

而使用Docker Compose就可以方便的管理存在多容器依賴的應用了。
首先需要單獨安裝docker-compose。
並編寫docker-compose.yml文件,上面WordPress的命令改造爲docker-compose.yml後的內容如下,使用yml語法:

wordpress: 
  image:wordpress
  links:
    - db:mysql
  ports:
    - 8080:80
db:
  image:mariadb
  environment:
    MYSQL ROOT PASSWORD:example

然後在docker-compose.yml文件所在目錄執行

$ docker-compose up

就可以一次啓動WordPress所依賴的所有容器了。

之後應用的啓停也非常方便:

$ docker-compose stop
$ docker-compose start

docker-compose在啓停時,會自動識別容器間的依賴順序,根據依賴順序逐個啓停容器。

命令的嵌套

Docker還支持命令的嵌套執行,比如
根據容器ID查找:

$ docker ps -a |grep 0453e874jh93

只顯示容器相關的鏡像和容器名稱:

$ docker ps |awk '{pring $2,$NF}'

批量刪除已經停止運行的容器:

$ docker rm $(docker ps -a -q)

參考資料
李金榜 尹燁 劉天斯 陳純 著 《循序漸進學Docker》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章