docker 命令合集

image鏡像操做

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

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

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

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

刪除虛懸鏡像: docker image prunenginx

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

```中間層鏡像: 爲了加速鏡像構建、重複利用資源,Docker 會利用 中間層鏡像。因此在使用一段時間後,可能會看到一些依賴的中間層鏡像。中間層鏡像也是無標籤的鏡像,是其它鏡像所依賴的鏡像。這些無標籤鏡像不該該刪除,不然會致使上層鏡像由於依賴丟失而出錯。實際上,這些鏡像也不必刪除,由於以前說過,相同的層只會存一遍,而這些鏡像是別的鏡像的依賴,所以並不會由於它們被列出來而多存了一份,不管如何你也會須要它們。只要刪除那些依賴它們的鏡像後,這些依賴的中間層鏡像也會被連帶刪除。golang

```web

部分鏡像的查找:redis

  • 根據鏡像名查詢: 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

FROM 指定基礎鏡像: 必備的指令,而且必須是第一條指令:

Docker Hub 上有很是多的高質量的官方鏡像,有能夠直接拿來使用的服務類的鏡像,如 nginxredismongomysqlhttpdphptomcat 等;也有一些方便開發、構建、運行各類語言應用的鏡像,如 nodeopenjdkpythonrubygolang 等。能夠在其中尋找一個最符合咱們最終目標的鏡像爲基礎鏡像進行定製。

若是沒有找到對應服務的鏡像,官方鏡像中還提供了一些更爲基礎的操做系統鏡像,如 ubuntudebiancentosfedoraalpine 等,這些操做系統的軟件庫爲咱們提供了更廣闊的擴展空間。

除了選擇現有鏡像爲基礎鏡像外,Docker 還存在一個特殊的鏡像,名爲 scratch。這個鏡像是虛擬的概念,並不實際存在,它表示一個空白的鏡像。

FROM scratch
...

若是你以 scratch 爲基礎鏡像的話,意味着你不以任何鏡像爲基礎,接下來所寫的指令將做爲鏡像第一層開始存在。

RUN 執行命令:

  • shell 格式:RUN <命令>,就像直接在命令行中輸入的命令同樣

    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
  • exec 格式:RUN ["可執行文件", "參數1", "參數2"],這更像是函數調用中的格式。

構建鏡像:

...

鏡像構建上下文:

...

COPY 複製文件:

  • shell模式 COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
  • 函數調用式 COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]

COPY 指令將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置。

COPY package.json /usr/src/app/

<源路徑> 能夠是多個,甚至能夠是通配符,其通配符規則要知足 Go 的 filepath.Match 規則,如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<目標路徑> 能夠是容器內的絕對路徑,也能夠是相對於工做目錄的相對路徑(工做目錄能夠用 WORKDIR指令來指定)。目標路徑不須要事先建立,若是目錄不存在會在複製文件前先行建立缺失目錄。

此外,還須要注意一點,使用 COPY 指令,源文件的各類元數據都會保留。好比讀、寫、執行權限、文件變動時間等。這個特性對於鏡像定製頗有用。特別是構建相關文件都在使用 Git 進行管理的時候。

在使用該指令的時候還能夠加上 --chown=<user>:<group> 選項來改變文件的所屬用戶及所屬組。

COPY --chown=55:mygroup files* /mydir/
COPY --chown=bin files* /mydir/
COPY --chown=1 files* /mydir/
COPY --chown=10:11 files* /mydir/

ADD 更高級的複製文件:

CMD 容器啓動命令:

ENTRYPOINT 入口點:

ENV 設置環境變量:

ARG 構建參數:

VOLUME 定義匿名卷:

EXPOSE 暴露端口:

WORKDIR 指定工做目錄:

USER 指定當前用戶:

HEALTHCHECK 健康檢查:

ONBUILD 爲他人做嫁衣:

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"
  ]
}
相關文章
相關標籤/搜索