Docker命令詳解(一)

Docker 的三要素:

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

鏡像(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)版本的命令炫加,從返回的結果可以看到容器內(nèi)是 Ubuntu 18.04.1 LTS 系統(tǒng)瑰煎。

列出鏡像

要想列出已經(jī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é)已經(jīng)介紹過了柬甥。鏡像 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?

####過濾出已經(jīng)退出的容器,再全部刪除:

[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? 容器外端口:容器內(nèi)端口

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

? ?docker run -v 容器外目錄:容器內(nèi)目錄

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

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

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

? 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.容器內(nèi)安裝軟件:

[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?

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚊惯,一起剝皮案震驚了整個濱河市愿卸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌截型,老刑警劉巖趴荸,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宦焦,居然都是意外死亡发钝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門波闹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酝豪,“玉大人,你說我怎么就攤上這事精堕》跆裕” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵歹篓,是天一觀的道長瘫证。 經(jīng)常有香客問我,道長滋捶,這世上最難降的妖魔是什么痛悯? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮重窟,結果婚禮上载萌,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好扭仁,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布垮衷。 她就那樣靜靜地躺著,像睡著了一般乖坠。 火紅的嫁衣襯著肌膚如雪搀突。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天熊泵,我揣著相機與錄音仰迁,去河邊找鬼。 笑死顽分,一個胖子當著我的面吹牛徐许,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卒蘸,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼雌隅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缸沃?” 一聲冷哼從身側響起恰起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎趾牧,沒想到半個月后检盼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡武氓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年梯皿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片县恕。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剂桥,靈堂內(nèi)的尸體忽然破棺而出忠烛,到底是詐尸還是另有隱情,我是刑警寧澤权逗,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布美尸,位于F島的核電站,受9級特大地震影響斟薇,放射性物質發(fā)生泄漏师坎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一堪滨、第九天 我趴在偏房一處隱蔽的房頂上張望胯陋。 院中可真熱鬧,春花似錦、人聲如沸遏乔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盟萨。三九已至凉翻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捻激,已是汗流浹背制轰。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓吃度,卻偏偏與公主長得像归形,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翘县,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351