docker 实践
1.? 基本概念
Docker 包括三個基本概念
-
鏡像(Image)
-
Docker 鏡像 是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像 不包含 任何動態數據,其內容在構建之后也不會被改變。
-
-
容器(Container)
-
鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的 類 和 實例 一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
-
-
倉庫(Repository)
-
鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。
一個 Docker Registry 中可以包含多個 倉庫(Repository);每個倉庫可以包含多個 標簽(Tag);每個標簽對應一個鏡像。
通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用于對應該軟件的各個版本。我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽。
以 Ubuntu 鏡像 為例,ubuntu 是倉庫的名字,其內包含有不同的版本標簽,如,16.04, 18.04。我們可以通過 ubuntu:16.04,或者 ubuntu:18.04 來具體指定所需哪個版本的鏡像。如果忽略了標簽,比如 ubuntu,那將視為 ubuntu:latest。
倉庫名經常以 兩段式路徑 形式出現,比如 jwilder/nginx-proxy,前者往往意味著 Docker Registry 多用戶環境下的用戶名,后者則往往是對應的軟件名。但這并非絕對,取決于所使用的具體 Docker Registry 的軟件或服務。
-
2. 獲取鏡像
? ? 從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull。其命令格式為:
docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]?
具體的選項可以通過 docker pull --help 命令看到,這里我們說一下鏡像名稱的格式。
-
Docker 鏡像倉庫地址:地址的格式一般是 <域名/IP>[:端口號]。默認地址是 Docker Hub(docker.io)。
-
倉庫名:如之前所說,這里的倉庫名是兩段式名稱,即 <用戶名>/<軟件名>。對于 Docker Hub,如果不給出用戶名,則默認為 library,也就是官方鏡像。
例如:
[root@localhost ~]# 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 Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c Status: Image is up to date for docker.io/hello-world:latest?
3. 運行鏡像
有了鏡像后,我們就能夠以這個鏡像為基礎啟動并運行一個容器
$ docker run -it --rm ubuntu bashroot@11626e421dd2:/# cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS" root@11626e421dd2:/# exit exit [root@localhost ~]#docker run 就是運行容器的命令,具體格式我們會在 容器 一節進行詳細講解,我們這里簡要的說明一下上面用到的參數。
-
-it:這是兩個參數,一個是 -i:交互式操作,一個是 -t 終端。我們這里打算進入 bash 執行一些命令并查看返回結果,因此我們需要交互式終端。
-
--rm:這個參數是說容器退出后隨之將其刪除。默認情況下,為了排障需求,退出的容器并不會立即刪除,除非手動 docker rm。我們這里只是隨便執行個命令,看看結果,不需要排障和保留結果,因此使用 --rm 可以避免浪費空間。
-
ubuntu:18.04:這是指用 ubuntu:18.04 鏡像為基礎來啟動容器。
-
bash:放在鏡像名后的是 命令,這里我們希望有個交互式 Shell,因此用的是 bash。
進入容器后,我們可以在 Shell 下操作,執行任何所需的命令
通過 exit 退出這個容器。
4. 列出鏡像
docker image ls [root@localhost ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE xxx/myun/yyy l.0 a44423f447a3 2 weeks ago 497 MB docker.io/ubuntu latest 7e0aa2d69a15 4 weeks ago 72.7 MB docker.io/hello-world latest d1165f221234 2 months ago 13.3 kB xxx/myun/zzz 4f475c1f 77a7d51744ef 5 months ago 648 MB列表包含了 倉庫名、標簽、鏡像 ID、創建時間 以及 所占用的空間。
其中倉庫名、標簽在之前的基礎概念章節已經介紹過了。鏡像 ID 則是鏡像的唯一標識,一個鏡像可以對應多個 標簽。因此,在上面的例子中,我們可以看到 ubuntu:18.04 和 ubuntu:bionic 擁有相同的 ID,因為它們對應的是同一個鏡像。
一般來說,虛懸鏡像已經失去了存在的價值,是可以隨意刪除的,可以用下面的命令刪除
docker image prune5. 刪除本地鏡像
如果要刪除本地的鏡像,可以使用 docker image rm 命令,其格式為:
$ docker image rm [選項] <鏡像1> [<鏡像2> ...]?
用 ID、鏡像名、摘要刪除鏡像
其中,<鏡像> 可以是 鏡像短 ID、鏡像長 ID、鏡像名 或者 鏡像摘要。
也可以用鏡像名,也就是 <倉庫名>:<標簽>,來刪除鏡像。
?
6.?使用 Dockerfile 定制鏡像
Dockerfile 是一個文本文件,其內包含了一條條的 指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
- FROM 指定基礎鏡像
- 所謂定制鏡像,那一定是以一個鏡像為基礎,在其上進行定制。就像我們之前運行了一個 nginx 鏡像的容器,再進行修改一樣,基礎鏡像是必須指定的。而 FROM 就是指定 基礎鏡像,因此一個 Dockerfile 中 FROM 是必備的指令,并且必須是第一條指令。
- RUN執行命令
-
RUN 指令是用來執行命令行命令的。由于命令行的強大能力,RUN 指令在定制鏡像時是最常用的指令之一。其格式有兩種:
-
shell 格式:RUN <命令>,就像直接在命令行中輸入的命令一樣。剛才寫的 Dockerfile 中的 RUN 指令就是這種格式
-
exec 格式:RUN ["可執行文件", "參數1", "參數2"],這更像是函數調用中的格式。
-
Dockerfile 支持 Shell 類的行尾添加 \ 的命令換行方式,以及行首 # 進行注釋的格式
-
-
-
docker build 命令進行鏡像構建
- docker build [選項] <上下文路徑/URL/->
?
- docker build [選項] <上下文路徑/URL/->
?
?
?
3. docker 命令
在https://hub.docker.com/repository/docker/xxx/rt_prj?中創建一個repository:rt_prj, 選擇private,xxx 默認為username,
上傳repository命令為:
docker push xxx/rt_prj:tagname?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
- 上一篇: WebRTC 那些常用的缩略词以及部分知
- 下一篇: 使用GitLab CI和Docker进行