一. 實驗目的:
- 熟悉鏡像的基本工作原理;
- 掌握鏡像操作的常用命令;
- 用兩種不同的方法創建一個新的鏡像;
二. 實驗環境:
Ubuntu16.04+Docker
三. 實驗內容:
- 練習使用鏡像操作的常用命令;
- 熟練掌握創建新鏡像的不同方法。
四、 實驗練習:
1.拉取鏡像
拉取鏡像的命令如下:
docker pull [倉庫地址:端口] NAME[:TAG|@DIGEST]
問題:
(1)從官方鏡像上拉取一個14.04標籤的鏡像ubuntu。
(2)如何從私有倉庫quay.io上拉取一個latest標籤的鏡像flannel
從私有倉庫上拉取鏡像:
docker pull <私有庫ip>:<端口>/ < 鏡像repository> :<鏡像tag>
sudo docker pull quay.io/coreos/flannel:y0.10.0-amd64
docker pull quay.io/username/flannel:tag
2.搜索鏡像
採用不同的兩種方式進行鏡像的搜索:
(1)在docker hub網站上搜索https://hub.docker.com,搜索鏡像名爲ubuntu的所有鏡像
此時就可在這個網站上註冊一個賬號,之後也可在終端登錄
(2)在終端下,通過docker命令行方式搜索
docker search [OPTIONS] TERM
OPTIONS說明:
--no-trunc=false 是否截斷
--limit int 搜索的最多結果數,最多25個
--filters=stars=最低收藏數 限定顯示結果的最低收藏數
如何從Docker Hub查找所有鏡像名包含ubuntu,並且收藏數大於20的鏡像?
3.查看鏡像
常見有兩種查看鏡像的方法:
(1)docker images,查看本地存儲的鏡像的倉庫名稱、標籤、ID號、創建時間和大小等簡單信息。命令格式如下:
docker images [options] [REPOSITORY]
-a, --all=fase 顯示所有鏡像
-f,--filter=[ ]過濾參數
--no-trunc=false 是否截斷
-q, --quiet=false 顯示鏡像的唯一ID
要求:
- 列出包含中間層的所有鏡像
- 列出所有的鏡像,並且可以看到完整的ID
(2)docker inspect,查看鏡像的詳細信息,包含製作者、適應架構和各層的數字摘要等。
要求:
- 查看ubuntu鏡像的詳細信息
- 通過-f參數可以快速定位,查看ubuntu鏡像的創建時間:
4導出和導入鏡像
舉例說明,如何把鏡像ubuntu:14.04從電腦A傳輸到電腦B?
- A先使用導出鏡像(save)操作將鏡像保存在本地
- B用導入鏡像(load)操作,將鏡像包加載到本地倉庫中
5.發佈鏡像
(1)如何把一個鏡像發佈到docker hub中?請舉例說明。
登錄docker hub
#docker login
使用docker tag 命令爲本地鏡像添加新的標籤
再使用docker push 命令將新添加的鏡像上傳到docker hub
(2)假如在docker hub上,現有用戶名爲username,但是想要推送一個叫做user/image的鏡像到docker hub上,怎麼辦?
使用docker tag 命令爲本地鏡像添加新的標籤
6刪除鏡像
分別用兩種不同的方法刪除本地鏡像?說明兩種方法的不同之處!
(1)第一種刪除鏡像的方法是docker rmi不加-f,只能刪除無tag的鏡像,被曾經打過多處tag就無法直接刪除,需要先刪除tag,刪除曾經啓動過的容器,最後才能刪除鏡像。此時,tag可比作引用,image爲tag指向的對象。
加-f可以刪除正在使用的鏡像。
如何刪除本地的所有鏡像?
刪除全部容器:docker rm $(docker ps -aq)
一條命令實現停用並刪除容器:docker stop $(docker ps -q)& docker rm $(docker ps -aq)
如果想要刪除一個鏡像,但是有容器正在使用它,該如何處理?
刪除docker中的鏡像,我們可以使用如下命令:docker rmi 鏡像id
刪除docker中的容器可以使用如下命令:docker rm 容器id
7.查看鏡像歷史
請查看一下ubuntu:14.04鏡像的歷史?並描述一下
鏡像 創建時間 創建者 大小
8通過已有鏡像ubuntu:14.04啓動一個容器,在容器中安裝nginx,用docker commit命令提交新容器爲鏡像。相關命令如下:
Docker commit [options] container [REPOSITORY[:TAG]]
-a ,--author作者
-m, --message 鏡像信息
-p, --pause 提交時候暫停容器的運行
過程:
(1)使用鏡像ubuntu:14.04來啓動一個交互式容器commit_test
docker run -it -p 80 --name commit_test ubuntu:14.04 /bin/bash
(2)在容器內更新apt庫,並且安裝nginx
apt-get update
apt-get install -y nginx
然後exit退出容器
(3)輸入命令docker ps -l看到剛剛創建的容器
(4)把容器commit_test提交爲鏡像catherine2005/commit_image1,設置鏡像作者爲catherine,提交修改的內容爲nginx
docker commit -a ‘catherine’ -m ‘nginx’ commit_test catherine2005/commit_image1
(5)查看剛剛創建的鏡像信息
docker images
(6)使用剛剛創建的鏡像catherine2005/commit_image1啓動一個容器nginx_web1
docker run -d --name nginx_web1 catherine2005/commit_image nginx -g “daemon off;”
(7)查看新創建的容器
docker ps
發現沒有映射端口,不可用
(8)使用剛剛創建的鏡像catherine2005/commit_image1啓動一個容器nginx_web2
docker run -d –name nginx_web2 -p 80 catherine2005/commit_image1 nginx -g “daemon off;”
(9)再次查看容器
docker ps
此時應該可以看到端口映射出49155->80
(10)使用命令來查看index.html網站
或者在瀏覽器上直接輸入http://127.0.0.1:49155 就可以看到index.html網站
9如何通過新建一個Dockerfile文件來構建一個和題目8一樣的新鏡像?
主要分爲兩步
(1)創建一個dockerfile文件
(2)使用docker build命令來構建
請寫出詳細的實驗步驟,以及貼出相應的截圖。
docker build [options] path |URL| -
--build-arg=[] :設置鏡像創建時的變量;
--cpu-shares :設置 cpu 使用權重;
--cpu-period :限制 CPU CFS週期;
--cpu-quota :限制 CPU CFS配額;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的內存 id;
--disable-content-trust :忽略校驗,默認開啓;
-f :指定要使用的Dockerfile路徑;
--force-rm :設置鏡像過程中刪除中間容器;
--isolation :使用容器隔離技術;
--label=[] :設置鏡像使用的元數據;
-m :設置內存最大值;
--memory-swap :設置Swap的最大值爲內存+swap,"-1"表示不限swap;
--no-cache :創建鏡像的過程不使用緩存;
--pull :嘗試去更新鏡像的新版本;
--quiet, -q :安靜模式,成功後只輸出鏡像 ID;
--rm :設置鏡像成功後刪除中間容器;
--shm-size :設置/dev/shm的大小,默認值是64M;
--ulimit :Ulimit配置。
--tag, -t: 鏡像的名字及標籤,通常 name:tag 或者 name 格式;可以在一次構建中爲一個鏡像設置多個標籤。
--network: 默認 default。在構建期間設置RUN指令的網絡模式
使用當前目錄的 Dockerfile 創建鏡像,標籤爲 runoob/ubuntu:v1
docker build -t runoob/ubuntu:v1 .
使用URL github.com/creack/docker-firefox 的 Dockerfile 創建鏡像。
docker build github.com/creack/docker-firefox
也可以通過 -f Dockerfile 文件的位置:
$ docker build -f /path/to/a/Dockerfile .
在 Docker 守護進程執行 Dockerfile 中的指令前,首先會對 Dockerfile 進行語法檢查,有語法錯誤時會返回:
$ docker build -t test/myapp .Sending build context to Docker daemon 2.048 kBError response from daemon: Unknown instruction: RUNCMD