一. 實驗目的:
- 熟悉容器的基本工作原理;
- 掌握容器操作的常用命令;
二. 實驗環境:
Ubuntu16.04+Docker
三. 實驗內容:
- 練習使用容器操作的常用命令;
四、 實驗練習:
(一)創建容器
創建容器命令格式:
Usage: docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
問題:
-
如何以ubuntu:14.04作爲基礎鏡像,創建一個容器test1?
2.請使用docker ps -l命令查看,test1的狀態?
(二)啓動容器
有兩種情況:
1.原來沒有這個容器,需要基於一個鏡像啓動新的容器;
命令:Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
2.宿主機本來有一個容器,但是容器處於一個非運行的狀態,需要把這個非運行狀態的容器啓動起來。
命令:docker start container_ID
實際上docker run命令相當於docker create+start兩個命令
問題:
(1)如何以ubuntu:14.04作爲基礎鏡像,啓動一個容器test2?
請使用docker ps -l命令查看,test2的狀態?
(2)如何以ubuntu:14.04作爲基礎鏡像,啓動一個容器test3, 並安裝新的程序nginx?
- 可以使用編寫dockerfile文件,然後進行構建,再然後進行啓動
- 直接以Ubuntu:14.04爲基礎鏡像創建並啓動一個名爲test3的容器,再進行安裝nginx(apt-get update ,apt-get install nginx)
(3)如何以ubuntu:14.04作爲基礎鏡像,以交互方式啓動容器test4?
進入容器中,在/root目錄下新建一個文件1.txt,後點擊ctrl+p+q來退出但是不結束交互式容器。然後使用docker ps -l命令來查看test4的狀態?
(4)如何以ubuntu:14.04作爲基礎鏡像,啓動守護式容器test5,讓其在後臺一直輸出hello docker?如何查看容器的日誌,看看hello docker 是否正常輸出?
輸入命令docker run -d -p 120 --name test5 ubuntu:14.04 /bin/sh -c "while true;do echo hello docker;done",再使用docker logs test5查看
直接清屏了
注意:
這裏使用了while true那麼之後使用後會發生一些問題,下一節有問題解決方式,詳解。
這裏簡略說一下,這是後臺掛起式打印hellodocker ,那麼會使磁盤空間一直在使用直至磁盤滿,所以
要去學會關閉或者停止這個容器的運行,而且還要去清理日誌和容器,釋放空間。
(5)使用start命令來啓動剛剛創建的test1,並且用docker ps -l命令來查看容器狀態有什麼變化?
docker start test1
(三)查看本地容器信息
(1)可使用docker ps命令查看本地的容器。語法如下:
docker ps [OPTIONS]
OPTIONS說明:
-a :顯示所有的容器,包括未運行的。
-f :根據條件過濾顯示的內容。
-l :顯示最近創建的容器。
-n :列出最近創建的n個容器。
- 列出當前所有正在運行的container?
- 列出所有的container?
- 列出最近一次啓動的container?
- 列出最近創建的5個容器信息?
(2)可使用docker inspect命令查看容器的所有信息,包含運行情況,存儲位置,配置參數和網絡配置等。
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
OPTIONS說明:
-f :指定返回值的模板文件。
-s :顯示總的文件大小。
--type :爲指定類型返回JSON。
- 如何查看容器test5中的詳細信息?
- 如何查看容器test5的Ip地址?
(四)停止、殺死、重啓某個docker 容器
(1)請試着殺死,停止,重啓某個docker容器?
殺死容器: exit 停止容器:docker stop test2 重啓容器:docker restart test2
(2)如何強制停止一個容器?
(五)查看指定容器的日誌記錄
docker logs –f –t [--tail] 容器
-f:--follow=true/false,一直跟蹤日誌變化並且返回結果
-t:--timestamps=true/false,在返回結果上加上時間戳
--tail string 從日誌末尾顯示多少行日誌, 默認是all
--since string 顯示自某個timestamp之後的日誌,或相對時間,如42m(即42分鐘)
(1)請一直跟蹤容器test5的日誌變化,並且在返回結果上加上時間戳?
docker logs -ft test5
(2)查看容器test5最近30分鐘的日誌?
docker logs --since=30m test5
(3)查看容器test5的日誌最後10行,並且在返回結果上加上時間戳?
docker logs -ft --since=”2020” --tail=10 test5
(六)刪除容器
當刪除容器時,若正在運行,需要先停止刪除。
docker rm [OPTIONS] CONTAINER
OPTIONS說明:
-f :通過SIGKILL信號強制刪除一個運行中的容器
-l :移除容器間的網絡連接,而非容器本身
-v :刪除與容器關聯的卷
- 如何刪除所有容器? docker rm $(docker ps –a -q)
- 如果有容器無法刪除,應該怎麼辦? docker rm –f 容器ID或容器名
- 請查看是否所有容器都被刪除? docker ps –a
- 以ubuntu:14.04作爲基礎鏡像,啓動一個容器test6, 並掛載數據卷/home, 刪除容器nginx01,並刪除容器掛載的數據卷
docker volume create myvolume
docker run -it --name test6 -v myvolume:/home ubuntu:14.04
(七)進入容器
進入容器有三種不同的方法:
1.docker attach可以attach到一個已經運行的容器的stdin,然後進行命令執行的動作。 請嘗試用docker attach進入一個已經運行的容器?
2.docker exec 也可以進入一個已經運行的容器,然後進行命令執行的動作。就像使用SSH登錄服務器一樣來操作容器。請嘗試用docker exec進入一個已經運行的容器?
3.使用nsenter工具進入
如何使用nsenter工具來進入容器呢?
一般來說,需要首先下載nsenter這個工具,它包含在util-linux軟件包版本。
(1)首先訪問該網址找到nsenter工具
https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.32/
(2)下載nsenter工具的源碼到我們的主機上
#wget https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.32/util-linux-2.32.tar.gz
(3)解壓.tar.gz包
# tar -xzvf util-linux-2.32.tar.gz
(4)進入util-linux-2.32的目錄
# cd util-linux-2.32/
(5)輸入./configure --without-ncurses命令進行配置
(6)輸入命令make nsenter來編譯nsenter
(7)複製nsenter到/usr/local/bin路徑下
# cp nsenter /usr/local/bin
(8)運行一個容器,並且找到找到容器的進程PID號(.state.Pid)
docker run -itd --name test7 ubuntu:14.04
docker inspect test7
(9)通過得到的這個PID,就可以連接到這個容器:
nsenter --target $PID --mount --uts --ipc --net --pid
(10)在容器中可以查看用戶和進程的相關信息
ps -ef
(八)導入容器和導出容器
(1)導出容器是指導出一個已經創建的容器到一個文件,不管此時這個容器是否處於運行狀態,可以使用docker export命令。請把test7容器導出到1.tar中。
(2)導入容器是指文件可以使用docker import命令導入到本地倉庫成爲鏡像。請把1.tar導入,並在在導入時候其打上標籤test8:latest