linwebs

林林.台灣 | Linwebs - 課程

Docker容器虛擬化介紹 - Docker 常用指令

本文章為嘉大資工讀書會第二期課程內容
場次 5-2 【雲端系統佈署】 Docker 容器虛擬化介紹

以下為一些基本的 docker 常用指令,僅映像檔與容器的部份。

本頁目錄

 

映像檔 (image)

docker 的映像檔就像是一個模板(template),提供建立容器的一個範本,擁有映像檔就可快速的建立容器。


列出所有映像檔

指令: images
(完整指令: docker image ls)

$ docker images
REPOSITORY        TAG          IMAGE ID       CREATED         SIZE
php               8.0-apache   aa79271a3ea6   7 days ago      472MB
httpd             latest       c8ca530172a8   8 days ago      138MB
mariadb           latest       45eaeedf03de   2 weeks ago     409MB
ubuntu            21.10        f2ecd4f42215   4 weeks ago     79.6MB
hello-world       <none>       bf756fb1ae65   20 months ago   13.3kB

取得映像檔

從 docker hub 取得 hello-world 映像檔。

指令: pull <映像檔名稱[:標籤名稱]>
(完整指令: docker image pull)

  • 取得 hello-world 映像檔
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
  • 取得特定標籤(tag)的映像檔版本

取得 php 映像檔,標籤為 8.0-apache 的版本

$ docker pull php:8.0-apache

8.0-apache: Pulling from library/php
99046ad9247f: Pull complete

... 中間省略 ...

ae373b9fffe8: Pull complete
Digest: sha256:be7c3c1cef182a0f8dfeaf2208a5ce39649d6efc9ebbf5a325a4d6291e00defe
Status: Downloaded newer image for php:8.0-apache
docker.io/library/php:8.0-apache

刪除映像檔

指令: rmi <映像檔名稱[:標籤名稱]>
(完整指令: docker image rm)

$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd

刪除映像檔前須先確認沒有任何容器使用此映像檔,否則會顯示以下錯誤:

$ docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "<映像檔名稱>" (must force) - container <容器ID> is using its referenced image <映像檔ID>

 

容器 (container)

docker 的容器就是由映像檔建立的執行個體,一個容器執行一種應用程式。


列出所有容器

指令: ps
(完整指令: docker container ls)

  • 列出所有執行中的容器
$ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED        STATUS          PORTS                               NAMES
eb6ff9333def   php:8.0-apache   "docker-php-entrypoi…"   24 hours ago   Up 13 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   php80
  • 列出所有容器(包含未執行的容器)
$ docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS                      PORTS                               NAMES
144b93a47796   hello-world           "/hello"                 6 minutes ago    Exited (0) 6 minutes ago                                        test-docker
eb6ff9333def   php:8.0-apache        "docker-php-entrypoi…"   24 hours ago     Up 2 minutes                0.0.0.0:80->80/tcp, :::80->80/tcp   php80

建立新容器並啟動與執行

此指令會從映像檔建立一個新的容器,若映像檔不存在,會自動從 docker hub 取得映像檔。

映像檔名稱後面可用 : 指定映像檔的標籤。 

指令: run [-d] [--rm] [--name <新容器名稱>] <映像檔名稱[:標籤名稱]> [程式執行指令] 
(完整指令: docker container run)

其他參數:

-d 讓容器在背景執行

--rm 容器停止時一併刪除容器

--name 指定新容器的名稱

-p 連接埠轉送 <外部>:<內部>

--network 指定此容器要使用的 docker 網路

-v 掛載檔案卷 <外部>:<內部>

 

  • 執行 hello-world 容器

hello-world 此容器最普遍用於檢測 docker 是否正確安裝,執行結果如下。

$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
   (amd64)
3. The Docker daemon created a new container from that image which runs the
  executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
  to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/
  • 執行 alpine 容器輸出文字 (當映像檔不存在)

建立一個映像檔為 alpine 的新容器,若此映像檔不存在,則會自動從 docker hub 取得。
取得映像檔後,會建立一個新容器。
容器建立完畢後,會執行 echo 'hello Linwebs!' 的指令。
可看到畫面中顯示 hello Linwebs!

$ docker run alpine echo 'hello Linwebs!'
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
29291e31a76a: Pull complete
Digest: sha256:eb3e4e175ba6d212ba1d6e04fc0782916c08e1c9d7b45892e9796141b1d379ae
Status: Downloaded newer image for alpine:latest
hello Linwebs!
  • 執行 hello-world 容器並指定容器名稱

在此指定新建立容器的名字為 test-docker,若不指定容器的名字,則 docker 會自動命名。

$ docker run --name test-docker hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

... 以下省略 ...

停止 stop

指令: stop <容器名稱/容器ID> 
(完整指令: docker container stop)

  • 停止ID為 7a17ca2c2c5f 的容器
$ docker stop 7a17ca2c2c5f
7a17ca2c2c5f
  • 停止名稱為 php80 的容器
$ docker stop php80
php80

再次啟動 start

指令: start <容器名稱/容器ID]>
(完整指令: docker container start)

  • 再次啟動名稱為 php80 的容器
$ docker start php80
php80

刪除 rm

指令: rm <容器名稱/容器ID>
(完整指令: docker container rm)

  • 移除名稱為 test-docker 的容器
$ docker rm test-docker
test-docker

操作 exec

執行容器內的指令。

指令: exec <容器名稱/容器ID> [程式執行指令] 
(完整指令: docker container exec)

  • 執行容器的 shell 操控容器

在容器開啟虛擬終端裝置(TTY),並啟動互動模式,執行容器內的 shell,如同進入容器內進行操作。

以下為進入名稱為 php80 的容器,執行 bash 操控容器。

$ docker exec -it php80 bash
root@eb6ff9333def:/var/www/html#

參考資料: Docker — 從入門到實踐

建立時間:2021/8/25 PM 11:54
修改時間:2021/9/1 PM 2:49
作者: Linwebs

bookmark標籤