Docker命令詳解(一)

Docker 的三要素:

Docker 鏡像是一個特殊的文件系統(tǒng),除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動態(tài)數(shù)據(jù),其內容在構建之后也不會被改變。

鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的 類 和 實例 一樣,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等。

倉庫:鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發(fā)鏡像的服務,Docker Registry 就是這樣的服務。

一個 Docker Registry 中可以包含多個 倉庫(Repository);每個倉庫可以包含多個 標簽(Tag);每個標簽對應一個鏡像。

獲取鏡像:

從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull。其命令格式為:

docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標簽]

具體的選項可以通過 docker pull --help 命令看到,這里我們說一下鏡像名稱的格式。

Docker 鏡像倉庫地址:地址的格式一般是 <域名/IP>[:端口號]。默認地址是 Docker Hub。

倉庫名:如之前所說,這里的倉庫名是兩段式名稱,即 <用戶名>/<軟件名>。對于 Docker Hub,如果不給出用戶名,則默認為 library,也就是官方鏡像。

例子:

$ docker pull ubuntu:18.04

18.04: Pulling from library/ubuntu

bf5d46315322: Pull complete

9f13e0ac480c: Pull complete

e8988b5b3097: Pull complete

40af181810e7: Pull complete

e6f7c7e5c03e: Pull complete

Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b492983ae97c3d643fbbe

Status: Downloaded newer image for ubuntu:18.04

運行

有了鏡像后,我們就能夠以這個鏡像為基礎啟動并運行一個容器。以上面的 ubuntu:18.04 為例,如果我們打算啟動里面的 bash 并且進行交互式操作的話,可以執(zhí)行下面的命令。

$ docker run -it --rm \ ubuntu:18.04 \ bash

root@e7009c6ce357:/# cat /etc/os-release

NAME="Ubuntu"

VERSION="18.04.1 LTS (Bionic Beaver)"

ID=ubuntu

ID_LIKE=debian

PRETTY_NAME="Ubuntu 18.04.1 LTS"

VERSION_ID="18.04"

HOME_URL="https://www.ubuntu.com/"

SUPPORT_URL="https://help.ubuntu.com/"

BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"

PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"

VERSION_CODENAME=bionic

UBUNTU_CODENAME=bionic

docker run 就是運行容器的命令,具體格式我們會在 容器 一節(jié)進行詳細講解,我們這里簡要的說明一下上面用到的參數(shù)。

-it:這是兩個參數(shù),一個是 -i:交互式操作,一個是 -t 終端。我們這里打算進入 bash 執(zhí)行一些命令并查看返回結果,因此我們需要交互式終端。

--rm:這個參數(shù)是說容器退出后隨之將其刪除。默認情況下,為了排障需求,退出的容器并不會立即刪除,除非手動 docker rm。我們這里只是隨便執(zhí)行個命令,看看結果,不需要排障和保留結果,因此使用 --rm 可以避免浪費空間。

ubuntu:18.04:這是指用 ubuntu:18.04 鏡像為基礎來啟動容器。

bash:放在鏡像名后的是 命令,這里我們希望有個交互式 Shell,因此用的是 bash。

進入容器后,我們可以在 Shell 下操作,執(zhí)行任何所需的命令。這里,我們執(zhí)行了 cat /etc/os-release,這是 Linux 常用的查看當前系統(tǒng)版本的命令,從返回的結果可以看到容器內是 Ubuntu 18.04.1 LTS 系統(tǒng)。

列出鏡像

要想列出已經下載下來的鏡像,可以使用 docker image ls 命令。

$ docker image ls

REPOSITORY? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE

redis? ? ? ? ? ? ? ? latest? ? ? ? ? ? ? 5f515359c7f8? ? ? ? 5 days ago? ? ? ? ? 183 MB

nginx? ? ? ? ? ? ? ? latest? ? ? ? ? ? ? 05a60462f8ba? ? ? ? 5 days ago? ? ? ? ? 181 MB

mongo? ? ? ? ? ? ? ? 3.2? ? ? ? ? ? ? ? fe9198c04d62? ? ? ? 5 days ago? ? ? ? ? 342 MB

<none>? ? ? ? ? ? ? <none>? ? ? ? ? ? ? 00285df0df87? ? ? ? 5 days ago? ? ? ? ? 342 MB

ubuntu? ? ? ? ? ? ? 18.04? ? ? ? ? ? ? f753707788c5? ? ? ? 4 weeks ago? ? ? ? 127 MB

ubuntu? ? ? ? ? ? ? latest? ? ? ? ? ? ? f753707788c5? ? ? ? 4 weeks ago? ? ? ? 127 MB

列表包含了 倉庫名、標簽、鏡像 ID、創(chuàng)建時間 以及 所占用的空間。

其中倉庫名、標簽在之前的基礎概念章節(jié)已經介紹過了。鏡像 ID 則是鏡像的唯一標識,一個鏡像可以對應多個 標簽。因此,在上面的例子中,我們可以看到 ubuntu:18.04 和 ubuntu:latest 擁有相同的 ID,因為它們對應的是同一個鏡像。

docker image ls 會列出所有頂層鏡像,但是有時候我們只希望列出部分鏡像。

列出特定的某個鏡像,也就是說指定倉庫名和標簽

$ docker image ls ubuntu:18.04

REPOSITORY? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE

ubuntu? ? ? ? ? ? ? 18.04? ? ? ? ? ? ? f753707788c5? ? ? ? 4 weeks ago? ? ? ? 127 MB

刪除本地鏡像

如果要刪除本地的鏡像,可以使用 docker image rm 命令,其格式為:

$ docker image rm [選項] <鏡像1> [<鏡像2> ...]

用 ID、鏡像名、摘要刪除鏡像

其中,<鏡像> 可以是 鏡像短 ID、鏡像長 ID、鏡像名 或者 鏡像摘要。

用 docker image ls 命令來配合

像其它可以承接多個實體的命令一樣,可以使用 docker image ls -q 來配合使用 docker image rm,這樣可以成批的刪除希望刪除的鏡像。我們在“鏡像列表”章節(jié)介紹過很多過濾鏡像列表的方式都可以拿過來使用。

比如,我們需要刪除所有倉庫名為 redis 的鏡像:

$ docker image rm $(docker image ls -q redis)

或者刪除所有在 mongo:3.2 之前的鏡像:

$ docker image rm $(docker image ls -q -f before=mongo:3.2)

充分利用你的想象力和 Linux 命令行的強大,你可以完成很多非常贊的功能。

鏡像是多層存儲,每一層是在前一層的基礎上進行的修改;而容器同樣也是多層存儲,是在以鏡像為基礎層,在其基礎上加一層作為容器運行時的存儲層。下面是一個 Web 服務器為例子,來講解鏡像是如何構建的。

$ docker run --name webserver -d -p 80:80 nginx

這條命令會用 nginx 鏡像啟動一個容器,命名為 webserver,并且映射了 80 端口,這樣我們可以用瀏覽器去訪問這個 nginx 服務器。


docker commit 的語法格式為:

docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標簽>]]


關于Docker容器基本操作:

1.查看本地的容器進程:

[root@docker ~]# docker ps -a?

2.啟動容器(運行鏡像)

docker run 是日常的最頻繁用的命令之一,同樣也是較為復雜的命令之一

命令格式:docker run[OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS: 選項:

-i : 表示啟動一個可以互動的容器

-t: 表示使用終端關聯(lián)到容器的標準輸入輸出上

-d:表示將容器放置在后臺運行

-rm: 退出后即刪除容器

-name:表示要運行的鏡像

COMMAND:表示啟動容器時要運行的命令

3.交互式啟動一個容器:

[root@docker ~]#? docker run -ti stanleyws/alpine:v3.10.1 /bin/sh?

[root@docker ~]# docker images | grep alpine

4.非交互式啟動一個容器

[root@docker ~]#? docker run --rm stanleyws/alpine:v3.10.1 /bin/echo hello?

hello?

5.非交互式啟動一個后臺容器:

[root@docker ~]#? docker run -d --name myalpine stanleyws/alpine:v3.10.1 /bin/sleep 300?

6.查看宿主機進程:

[root@docker ~]#? ps aux | grep sleep | grep -v grep

root 49302 0.0 0.0 1540 244 ?Ss 16:45 0:00 sleep 300?

7.進入容器:

[root@docker ~]#? docker exec -ti myalpine /bin/sh?

/ # ps aux?

8.停止/啟動/重啟容器

1) 停止容器:

[root@docker ~]#? docker stop myalpine?

myalpine?

[root@docker ~]#? docker ps -a?

[root@docker ~]#? docker start/stop/restart enb098dhs348

[root@docker ~]#? docker rm -f myalpine1?

####過濾出已經退出的容器,再全部刪除:

[root@docker ~]#? for i in 'docker ps -a|grep -i exit | awk '{print $1}'';do docker rm -f $i;done?

9.導出/導入鏡像:

1)導出鏡像

[root@docker ~]#? docker images?

[root@docker ~]# docker save 097834c4dr > alpine_with_1.txt.tar?

[root@docker ~]#? ls?

alpine_with_1.txt.tar?

2) 查看容器的日志:

[root@docker ~]#? docker rm 83h56jsnsv90

[root@docker ~]# docker run hello-world 2>&1 >>/dev/null?

[root@docker ~]#? docker ps -a | grep hello?

[root@docker ~]# docker logs -f 42bd19eys56g?

--------------------------------------------------------------------------------------------

[root@docker ~]#? docker start/stop/restart?

[root@docker ~]#? docker rm (-f)

[root@docker ~]# docker exec/commit?

[root@docker ~]# docker logs(-f)

==============================================

10. Docker容器的高級操作:

1)映射端口:

? ?docker run? -p? 容器外端口:容器內端口

2)掛載數(shù)據(jù)卷

? ?docker run -v 容器外目錄:容器內目錄

3)傳遞環(huán)境變量

? docker run -e 環(huán)境變量key=環(huán)境變量value

4)容器內安裝軟件(工具)

? yum /apt-get/apt 等

==============================================

11.下載nginx鏡像

[root@docker ~]#? docker pull nginx:1.12.2?

1.12.2:Pulling from library/nginx?

[root@docker ~]#? docker images | grep nginx?

nginx? ?1.12.2? ? ?4037a883b034? 15 months ago 108MB?


[root@docker ~]#? docker tag?4037a883b034? stanleyws/nginx:v1.12.2?

[root@docker ~]# docker images | grep nginx?

nginx? ? ? ? ? ? ? ? ? ? ? ? ? 1.12.2? ? ?4037a883b034? 15 months ago 108MB?

stanleyws/nginx? ? ? ? ?v1.12.2? ??4037a883b034??15 months ago 108MB?

==================================================

12.映射端口:

[root@docker ~]# docker run -d -p81:80 stanleyws/nginx:v1.12.2?

cf47229ea987bbe0e6e456695kzjnahaj8992jyzag902

[root@docker ~]# netstat -luntp | grep 81?

tcp6? ?0? ? ?0? ?:::81? ? ? ? :::*? ? LISTEN 52802/docker?

13.掛載數(shù)據(jù)卷:

[root@docker ~]# mkdir html?

[root@docker ~]# cd html/

[root@docker html]#? wget www.baidu.com -O index.html?

[root@docker ~]#? docker run -d --rm --name nginx_with_baidu -d -p82:80 -v/root/html:/usr/share/nginx/html oldboy1103/nginx:v1.12.2?

8c440besccs2f2ekzhi8uhgbz92nxysuajgz907hgz8qxua7?

[root@docker ~]# docker ps -a?

[root@docker ~]# docker exec -ti nginx_with_baidu /bin/bash?

root@8c440bescc:/#? cd? /usr/share/nginx/html?

root@8c440bescc: /usr/share/nginx/html#? ls

root@8c440bescc: /usr/share/nginx/html# cat indes.html?

==================================================

14. 給容器傳遞環(huán)境變量

[root@docker ~]# docker run --rm -e E_OPTS=abcdefg stanleyws/nginx:v1.12.2 printenv?

PATH=/usr/local/sbin:/usr/local/bin/:/usr/sbin:/usr/bin:/sbin/bin

15.容器內安裝軟件:

[root@docker ~]# docker run -ti --rm stanleyws/nginx:v1.12.2 bash?

root@b5ff598aeee7:/ curl?

bash: curl : command not found?

root@b5ff598aeee7:/#? tee /etc/apt/sources.list << EOF?

> deb http://mirrors.163.com/debian/ jessie main non-free contrib?

> deb?http://mirrors.163.com/debian/ jessie-updates main non-free contrib?

> EOF?

root@b5ff598aeee7:/ apt-get update && apt-get install curl -y?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容