docker 命令集合

[TOC]

image鏡像操作

列出已經下載下來的鏡像: docker image ls

查看鏡像、容器、數據卷所占用的空間: docker system df

查看虛懸鏡像: docker image ls -f dangling=true

虛懸鏡像已經失去了存在的價值,是可以隨意刪除的

刪除虛懸鏡像: docker image prune

查看中間層鏡像: docker image ls -a


部分鏡像的查找:

  • 根據鏡像名查詢: docker image ls 鏡像名
  • 過濾器filter查詢: docker image ls -f since=mongo:3.2

根據特定的方式顯示查找結果:

  • -q : 只顯示 ID; ep:docker image ls -q

    --filter 配合 -q 產生出指定范圍的 ID 列表,然后送給另一個 docker 命令作為參數,從而針對這組實體成批的進行某種操作的做法在 Docker 命令行使用過程中非常常見,不僅僅是鏡像,將來我們會在各個命令中看到這類搭配以完成很強大的功能。

  • 自定義展示結果 --format : Go 的模板語法

    # 只包含鏡像ID和倉庫名:
    $ docker image ls --format "{{.ID}}: {{.Repository}}"
    5f515359c7f8: redis
    05a60462f8ba: nginx
    fe9198c04d62: mongo
    00285df0df87: <none>
    f753707788c5: ubuntu
    f753707788c5: ubuntu
    1e0c3dd64ccd: ubuntu
    
    # 以表格等距顯示,并且有標題行,和默認一樣
    $ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
    IMAGE ID            REPOSITORY          TAG
    5f515359c7f8        redis               latest
    05a60462f8ba        nginx               latest
    fe9198c04d62        mongo               3.2
    00285df0df87        <none>              <none>
    f753707788c5        ubuntu              18.04
    f753707788c5        ubuntu              latest
    

刪除本地鏡像: docker image rm

  • 根據ID、鏡像名、摘要刪除鏡像:

    # 根據ID
    $ docker image rm 501
    
    # 根據鏡像名
    $ docker image rm centos
    
    # 根據鏡像摘要; 先查到摘要再進行刪除
    $ docker image ls --digests
    REPOSITORY                  TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
    node                        slim                sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228   6e0c4c8e3913        3 weeks ago         214 MB
    
    $ docker image rm node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228
    
  • 用 docker image ls 命令來配合:

    # 刪除所有倉庫名為 redis 的鏡像
    $ docker image rm $(docker image ls -q redis)
    
    # 刪除所有在 mongo:3.2 之前的鏡像:
    $ docker image rm $(docker image ls -q -f before=mongo:3.2)
    

使用 DockerFile 定制鏡像

總結見另一篇文章

詳情:https://yeasy.gitbooks.io/docker_practice/content/image/build.html

Dockerfile 多階段構建:

...

其他制作鏡像的方式:

...

container 容器操作

新建并啟動容器: 命令主要為 docker run

# 依靠ubuntu鏡像生成容器后 命令輸出一個 “Hello World”,之后終止容器。
$ docker run ubuntu:18.04 /bin/echo 'Hello world'
Hello world

# 啟動一個 bash 終端,允許用戶進行交互
# -t 選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上
# -i 讓容器的標準輸入保持打開
$ docker run -t -i ubuntu:18.04 /bin/bash
root@af8bae53bdd3:/#
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

利用 docker run 來創建容器時,Docker 在后臺運行的標準操作包括:

  • 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
  • 利用鏡像創建并啟動一個容器
  • 分配一個文件系統,并在只讀的鏡像層外面掛載一層可讀寫層
  • 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
  • 從地址池配置一個 ip 地址給容器
  • 執行用戶指定的應用程序
  • 執行完畢后容器被終止

啟動已終止的容器: docker container start

后臺運行: -d

# 容器會在后臺運行并不會把輸出的結果 (STDOUT) 打印到宿主機上面
docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

# 查看后臺運行的程序的結果 docker logs [container ID or NAMES] 
docker container logs a211      # a211 為短ID

終止容器: docker container stop [container ID]

查看終止狀態的容器: docker container ls -a (Exited (0))

重新啟動終止狀態的容器: docker container start [container ID]

將一個運行態的容器終止,然后再重新啟動: docker container restart

進入在后臺運行的容器中:

  • docker attach 命令: ( 不推薦使用 )

    $ docker run -dit ubuntu
    243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
    
    $ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia
    
    $ docker attach 243c
    root@243c32535da7:/#
    
    ####### 注意 #######
    # 如果從這個 stdin 中 exit,會導致容器的停止
    
  • docker exec 命令: ( 推薦使用 )

    # 執行 -d 后臺 i 持續 t 終端輸出 的容器
    $ docker run -dit ubuntu
    69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6
    
    $ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    69d137adef7a        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           zealous_swirles
    
    # -i 界面沒有 Linux 命令提示符,但命令執行結果仍然可以返回。
    $ docker exec -i 69d1 bash
    ls
    bin
    boot
    dev
    ...
    
    # 當 -i -t 參數一起使用時,則可以看到 Linux 命令提示符
    $ docker exec -it 69d1 bash
    root@69d137adef7a:/#
    root@69d137adef7a:/# exit
    # 從這個 stdin 中 exit,不會導致容器的停止
    

導出本地容器快照到本地: docker export

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
7691a814370e        ubuntu:18.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
$ docker export 7691a814370e > ubuntu.tar

從容器快照文件中再導入為鏡像: docker import

$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB

# 通過指定 URL 或者某個目錄來導入
$ docker import http://example.com/exampleimage.tgz example/imagerepo

刪除容器: docker container rm

# 刪除已終止的容器
$ docker container rm  trusting_newton
trusting_newton

# 刪除正在運行的容器,需要添加參數 -f 
$ docker container rm -f trusting_newton
trusting_newton

# 清理所有處于終止狀態的容器
$ docker container prune

訪問倉庫 Repository

登陸: docker login

退出登錄: docker logout

拉取鏡像:

  • docker search 查找官方的鏡像

  • docker pull 下載到本地

    $ docker search centos
    NAME                                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    centos                                          The official build of CentOS.                   465       [OK]
    tianon/centos                                   CentOS 5 and 6, created using rinse instea...   28
    blalor/centos                                   Bare-bones base CentOS 6.5 image                6                    [OK]
    saltstack/centos-6-minimal                                                                      6                    [OK]
    tutum/centos-6.4                                DEPRECATED. Use tutum/centos:6.4 instead. ...   5                    [OK]
    # DESCRIPTION 描述; STARS 收藏數; OFFICIAL 是否官方創建; AUTOMATED 是否自動創建
    
    $ docker pull centos
    

推送鏡像:

# 使用鏡像源創建一個指定鏡像的標簽
$ docker tag ubuntu:18.04 username/ubuntu:18.04

$ docker image ls

REPOSITORY                                               TAG                    IMAGE ID            CREATED             SIZE
ubuntu                                                   18.04                  275d79972a86        6 days ago          94.6MB
username/ubuntu                                          18.04                  275d79972a86        6 days ago          94.6MB

# 推送到 hub 上
$ docker push username/ubuntu:18.04

# 查詢剛剛推上去的鏡像
$ docker search username

NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
username/ubuntu

自動創建:

  • 創建并登錄 Docker Hub,以及目標網站;
  • 在目標網站中連接帳戶到 Docker Hub;
  • 在 Docker Hub 中 配置一個自動創建
  • 選取一個目標網站中的項目(需要含 Dockerfile)和分支;
  • 指定 Dockerfile 的位置,并提交創建。

私有倉庫的構建

...

數據管理

...

使用網絡

外部訪問容器: 通過 -P-p 參數來指定端口映射。

# -P Docker 會隨機映射一個 `49000~49900` 的端口到內部容器開放的網絡端口
$ docker run -d -P training/webapp python app.py

# 查看映射關系
$ docker container ls -l
CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse
# 本地主機的 49155 被映射到了容器的 5000 端口

# 查看應用的信息
$ docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -

-p 則可以指定要映射的端口,并且,在一個指定端口上只可以綁定一個容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

  • **映射所有接口地址: ** hostPort:containerPort

    # 將本地的 5000 端口映射到容器的 5000 端口
    $ docker run -d -p 5000:5000 training/webapp python app.py
    
  • 映射到指定地址的指定端口: ip:hostPort:containerPort

    # 指定映射使用一個特定地址,比如 localhost 地址 127.0.0.1
    $ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
    
  • 映射到指定地址的任意端口: ip::containerPort

    # 綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口。
    $ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
    
    # 使用 udp 標記來指定 udp 端口
    $ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
    

查看映射端口的配置: docker port

$ docker port nostalgic_morse 5000
127.0.0.1:49155.

# 注意: 容器有自己的內部網絡和 ip 地址(使用 docker inspect 可以獲取所有的變量,Docker 還可以有一個可變的網絡配置。)

# -p 可以多次使用來綁定多個端口
$ docker run -d \
    -p 5000:5000 \
    -p 3000:80 \
    training/webapp \
    python app.py

容器互聯:

新建網絡:

$ docker network create -d bridge my-net
# -d 參數指定 Docker 網絡類型,有 bridge overlay; overlay 網絡類型用于 Swarm mode

**連接容器: **

# 運行一個容器并連接到新建的 `my-net` 網絡
$ docker run -it --rm --name busybox1 --network my-net busybox sh

# 打開新的終端,再運行一個容器并加入到 my-net 網絡
$ docker run -it --rm --name busybox2 --network my-net busybox sh

# 再打開一個新的終端查看容器信息
$ docker container ls

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b47060aca56b        busybox             "sh"                11 minutes ago      Up 11 minutes                           busybox2
8720575823ec        busybox             "sh"                16 minutes ago      Up 16 minutes                           busybox1

# 通過 ping 來證明 busybox1 容器和 busybox2 容器建立了互聯關系。
# 在 busybox1 容器輸入以下命令
/ # ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms

# 用 ping 來測試連接 busybox2 容器,它會解析成 172.19.0.3。
# 在 busybox2 容器執行 ping busybox1,也會成功連接到
/ # ping busybox1
PING busybox1 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms

配置DNS: 配置全部容器的 DNS ,可以在 /etc/docker/daemon.json 文件中增加以下內容來設置

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

參考https://legacy.gitbook.com/book/yeasy/docker_practice/details
Docker —— 從入門到實踐 學習筆記

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容