1.鏡像管理
搜索鏡像:
? ? 這種方法只能用于官方鏡像庫
? ? 搜索基于 centos 操作系統的鏡像
? ? # docker search centos
? ? 按星級搜索鏡像: ? ? ? ?
? ? 查找 star 數至少為 100 的鏡像,默認不加 s 選項找出所有相關 ubuntu 鏡像: ? ? ? ??
? ? # docker search ubuntu -f stars=100 ? ?
拉取鏡像:
? ? # docker pull centos
查看本地鏡像: ?
? ? # docker image list
查看鏡像詳情:
? ? # docker image inspect 鏡像id
刪除鏡像:
? ? 刪除一個或多個,多個之間用空格隔開,可以使用鏡像名稱或id
? ? # docker rmi daocloud.io/library/mysql
? ? 強制刪除:--force
? ? 如果鏡像正在被使用中可以使用--force強制刪除 ? ?18.07后不支持強制刪除
? ? # docker rmi docker.io/ubuntu:latest --force
? ? 刪除所有鏡像:
? ? # docker rmi $(docker images -q)
只查看所有鏡像的id:
? ? # docker images -q?
查看鏡像制作的過程:
? ? 相當于dockfile
? ? # docker history daocloud.io/ubuntu
? ? dive docker_image_id/docker_image_name
2.容器管理
創建新容器但不啟動:
# docker create -it daocloud.io/library/centos:5 /bin/bash
創建并運行一個新Docker 容器:
? ? 同一個鏡像可以啟動多個容器,每次執行run子命令都會運行一個全新的容器
? ? # docker run -it --restart=always centos:7 /bin/bash
? ? 如果執行成功,說明CentOS 容器已經被啟動,并且應該已經得到了 bash 提示符。
? ? -i ??
? ? ? ? 捕獲標準輸入輸出
? ? -t ??
? ? ? ? 分配一個終端或控制臺
? ? --restart=always ??
? ? ? ? 容器隨docker engine自啟動,因為在重啟docker的時候默認容器都會被關閉 ??
? ? ? ? 也適用于create選項
? ? --rm
? ? ? ? 默認情況下,每個容器在退出時,它的文件系統也會保存下來,這樣一方面調試會方便些,因為你可以通過查看日志等方式來確定最終狀態。另一方面,也可以保存容器所產生的數據。但是當你僅僅需要短暫的運行一個容器,并且這些數據不需要保存,你可能就希望Docker能在容器結束時自動清理其所產生的數據。這個時候就需要--rm參數了。注意:--rm 和 -d不能共用
若要斷開與容器的連接,并且關閉容器:
? ?容器內部執行如下命令
? ? [root@d33c4e8c51f8 /]#exit
如果只想斷開和容器的連接而不關閉容器:
? ? 快捷鍵:ctrl+p+q
查看容器:
? ? 只查看運行狀態的容器:
? ? #docker ps
? ? #docker ps -a
? ? -a ?查看所有容器
? ? 只查看所有容器id:
? ? # docker ps -a -q
? ? 列出最近一次啟動的容器
? ? # docker ps -l ??
查看容器詳細信息:
inspect ? Return low-level information on a container or image
用于查看容器的配置信息,包含容器名、環境變量、運行命令、主機配置、網絡配置和數據卷配置等。
目標:
查找某一個運行中容器的id,然后使用docker inspect命令查看容器的信息。
提示:
可以使用鏡像id的前面部分,不需要完整的id。
[root@master ~]# docker inspect d95 ? ?//d95是我機器上運行的一個容器ID的前3個字符
[
? ? {
? ? ? ? "Id": "d95a220a498e352cbfbc098c949fc528dbf5a5c911710b108ea3a9b4aa3a4761",
? ? ? ? "Created": "2017-07-08T03:59:16.18225183Z",
? ? ? ? "Path": "bash",
? ? ? ? "Args": [],
? ? ? ? "State": {
? ? ? ? ? ? "Status": "exited",
? ? ? ? ? ? "Running": false,
? ? ? ? ? ? "Paused": false,
? ? ? ? ? ? "Restarting": false,
? ? ? ? ? ? "OOMKilled": false,
? ? ? ? ? ? "Dead": false,
? ? ? ? ? ? "Pid": 0,
容器信息很多,這里只粘貼了一部分
比如:容器里在安裝ip或ifconfig命令之前,查看網卡IP顯示容器IP地址和端口號,如果輸出是空的說明沒有配置IP地址(不同的Docker容器可以通過此IP地址互相訪問)
# docker inspect --format='{{.NetworkSettings.IPAddress}}' ?容器id
列出所有綁定的端口:
# docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} ->?
{{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID
# docker inspect --format='{{range $p,?
$conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}'?
b220fabf815a
22/tcp -> 20020
找出特殊的端口映射:
比如找出容器里22端口所映射的docker本機的端口:
# docker inspect --format='{{(index (index .NetworkSettings.Ports "22/tcp")?
0).HostPort}}' $INSTANCE_ID
[root@localhost ~]# docker inspect --format='{{(index (index .NetworkSettings.Ports "22/
tcp") 0).HostPort}}' b220fabf815a
20020
http://note.youdao.com/noteshare?id=4ee7884b3d25c16850d78cfdec276add
啟動容器:
# docker start ?name
關閉容器:
# docker stop ?name
# docker kill ? ?name ? ? ?--強制終止容器
殺死所有running狀態的容器
# docker kill $(docker ps ?-q) ?
stop和kill的區別:
? ? docker stop命令給容器中的進程發送SIGTERM信號,默認行為是會導致容器退出,當然,容器內程序可以捕獲該信號并自行處理,例如可以選擇忽略。而docker kill則是給容器的進程發送SIGKILL信號,該信號將會使容器必然退出。?
刪除容器:
? ? # docker rm 容器id或名稱
? ? 要刪除一個運行中的容器,添加 -f 參數
? ? 根據格式刪除所有容器:
? ? # docker rm $(docker ps -qf status=exited) ? ?
重啟容器:
#docker restart name
暫停容器:
pause ? --暫停容器內的所有進程,
? ? 通過docker stats可以觀察到此時的資源使用情況是固定不變的,通過docker logs -f也觀察不到日志的進一步輸出。
恢復容器:
unpause ?--恢復容器內暫停的進程,與pause參數相對應
# docker start infallible_ramanujan ?//這里的名字是狀態里面NAMES列列出的名字,這種方式同樣會讓容器運行在后臺
讓容器運行在后臺:
如果在docker run后面追加-d=true或者-d,那么容器將會運行在后臺模式。此時所有I/O數據只能通過網絡資源或者共享卷組來進行交互。因為容器不再監聽你執行docker run的這個終端命令行窗口。但你可以通過執行
docker attach來重新附著到該容器的回話中。注意,容器運行在后臺模式下,是不能使用--rm選項的
#docker run -d IMAGE[:TAG] 命令
#docker logs container_id ? #打印該容器的輸出
# docker run -it -d --name mytest docker.io/centos:7 /bin/sh -c "while true; do echo hello world; sleep 2; done"
37738fe3d6f9ef26152cb25018df9528a89e7a07355493020e72f147a291cd17
[root@localhost ~]# docker logs mytest
hello world
hello world
docker attach container_id #附加該容器的標準輸出到當前命令行
[root@localhost ~]# docker attach mytest
hello world
hello world
.......
此時,ctrl+d等同于exit命令,按ctrl+p+q可以退出到宿主機,而保持container仍然在運行
rename?
? ? Rename a container
stats ? ??
? ? Display a live stream of container(s) resource usage statistics ? ?
? ? --動態顯示容器的資源消耗情況,包括:CPU、內存、網絡I/O ??
port ? ?
? ? List port mappings or a specific mapping for the CONTAINER
? ? ?--輸出容器端口與宿主機端口的映射情況
? ? # docker port blog
? ? ? ? 80/tcp -> 0.0.0.0:80
? ? ?容器blog的內部端口80映射到宿主機的80端口,這樣可通過宿主機的80端口查看容器blog提供的服務
連接容器: ? ?
方法1.attach
# docker attach 容器id ? //前提是容器創建時必須指定了交互shell
方法2.exec ? ? ?
? ? 通過exec命令可以創建兩種任務:后臺型任務和交互型任務
? ? 交互型任務:
? ? ? ? # docker exec -it ?容器id ?/bin/bash
? ? ? ? root@68656158eb8e:/# ls ? ??
? ? 后臺型任務:
? ? ? ? # docker exec 容器id touch /testfile
監控容器的運行:
可以使用logs、top、events、wait這些子命令
? ? logs:
? ? ? ? 使用logs命令查看守護式容器
? ? ? ? 可以通過使用docker logs命令來查看容器的運行日志,其中--tail選項可以指定查看最后幾條日志,而-t選項則可以對日志條目附加時間戳。使用-f選項可以跟蹤日志的輸出,直到手動停止。
? ? ? ? # docker logs ? ?App_Container ? //不同終端操作
? ? ? ? # docker logs -f App_Container
? ? top:
? ? ? ? 顯示一個運行的容器里面的進程信息
? ? ? ? # docker top birdben/ubuntu:v1
? ? events ? ?
? ? ? ? Get real time events from the server
? ? ? ? 實時輸出Docker服務器端的事件,包括容器的創建,啟動,關閉等。
? ? ? ? # docker start loving_meninsky
? ? ? ? loving_meninsky
? ? ? ? # docker events ?//不同終端操作
? ? ? ? 2017-07-08T16:39:23.177664994+08:00 network connect ?
? ? ? ? df15746d60ffaad2d15db0854a696d6e49fdfcedc7cfd8504a8aac51a43de6d4?
? ? ? ? (container=50a0449d7729f94046baf0fe5a1ce2119742261bb3ce8c3c98f35c80458e3e7a,?
? ? ? ? name=bridge, type=bridge)
? ? ? ? 2017-07-08T16:39:23.356162529+08:00 container start?
? ? ? ? 50a0449d7729f94046baf0fe5a1ce2119742261bb3ce8c3c98f35c80458e3e7a (image=ubuntu,?
? ? ? ? name=loving_meninsky)
? ? wait ? ? ?
? ? ? ? Block until a container stops, then print its exit code ??
? ? ? ? --捕捉容器停止時的退出碼
? ? ? ? 執行此命令后,該命令會"hang"在當前終端,直到容器停止,此時,會打印出容器的退出碼
? ? ? ? # docker wait 01d8aa ?//不同終端操作
? ? ? ? ? ?137
? ? diff
? ? ? ? 查看容器內發生改變的文件,以elated_lovelace容器為例
? ? ? ? root@68656158eb8e:/# touch c.txt
? ? ? ? 用diff查看:
? ? ? ? 包括文件的創建、刪除和文件內容的改變都能看到?
? ? ? ? [root@master ~]# docker diff ?容器名稱
? ? ? ? A /c.txt
? ? ? ? C對應的文件內容的改變,A對應的均是文件或者目錄的創建刪除
? ? ? ? [root@docker ~]# docker diff 7287
? ? ? ? A /a.txt
? ? ? ? C /etc
? ? ? ? C /etc/passwd
? ? ? ? A /run
? ? ? ? A /run/secrets ?
宿主機和容器之間相互COPY文件
? ? cp的用法如下:
? ? Usage: ? ?docker cp [OPTIONS] CONTAINER:PATH LOCALPATH
? ? ? ? ? ? ? ? ? ?docker cp [OPTIONS] LOCALPATH CONTAINER:PATH
? ? 如:容器mysql中/usr/local/bin/存在docker-entrypoint.sh文件,可如下方式copy到宿主機
? ? # ?docker cp mysql:/usr/local/bin/docker-entrypoint.sh ? /root
? ? 修改完畢后,將該文件重新copy回容器
? ? # docker cp /root/docker-entrypoint.sh mysql:/usr/local/bin/ ??
?3.容器打包
將容器的文件系統打包成tar文件,也就是把正在運行的容器直接導出為tar包的鏡像文件
export ? ?
? ? Export a container's filesystem as a tar archive
有兩種方式(elated_lovelace為容器名):
第一種:
? ? [root@master ~]# docker export -o elated_lovelace.tar elated_lovelace第二種:
? ? [root@master ~]# docker export 容器名稱 > 鏡像.tar導入鏡像歸檔文件到其他宿主機:
import ? ?
? ? Import the contents from a tarball to create a filesystem image
? ? # docker import elated_lovelace.tar ?elated_lovelace:v1 ?
4.?鏡像遷移
保存一臺宿主機上的鏡像為tar文件,然后可以導入到其他的宿主機上:
save ? ? ?
? ? Save an image(s) to a tar archive
? ? 將鏡像打包,與下面的load命令相對應
? ? #docker save -o nginx.tar nginx:tagload ? ? ?
? ? Load an image from a tar archive or STDIN
? ? 與上面的save命令相對應,將上面sava命令打包的鏡像通過load命令導入
? ? #docker load < nginx.tar
? ??
容器的遷移 ?
docker export b25f3cb2bf1f ?| gzip > mynginx123.tar
zcat mynginx123.tar | docker import ?- mynginx123
5.?鏡像、容器深度操作
# 顯示鏡像摘要
docker images --digests?
# 過濾鏡像
docker images [-f|--filter] "key=value"
支持:
dangling:顯示標記為空的鏡像,值只有true和false
label:這個是根據標簽進行過濾,其中lable的值,是docker在編譯的時候配置的或者在Dockerfile中配置的
before:這個是根據時間來進行過濾,其中before的value表示某個鏡像構建時間之前的鏡像列表
since:跟before正好相反,表示的是在某個鏡像構建之后構建的鏡像
reference:添加正則進行匹配
# 鏡像格式化輸出
docker images --format "{{.ID}}\t{{.Repository}}"
.ID?? ?鏡像ID
.Repository?? ?鏡像倉庫
.Tag 鏡像標簽[版本]
.Digest?? ?鏡像hash值
.CreatedSince 創建鏡像后的時間
.CreatedAt?? ?創建鏡像的時間
.Size 鏡像大小
# 容器格式化輸出
docker ps --format "{{.ID}}\t{{.Command}}"
.ID?? ?容器ID
.Image?? ?鏡像ID
.Command?? ?執行的命令
.CreatedAt?? ?容器創建時間
.RunningFor?? ?運行時長
.Ports?? ?暴露的端口
.Status?? ?容器狀態
.Names?? ?容器名稱
.Label?? ?分配給容器的所有標簽
.Mounts?? ?容器掛載的卷
.Networks?? ?容器所用的網絡名稱
6.代碼演示?
#!/bin/bashsave(){if [ ! -d "./images" ]; thenmkdir imagesficd imagesdocker images --format "{{.ID}} {{.Repository}}:{{.Tag}} {{.Size}}" > images_pull.txtwhile read linedoimage_id=`echo $line | awk '{print $1}'`image_repository=`echo $line | awk '{print $2}'`image_size=`echo $line | awk '{print $3}'`docker save -o $image_id.tar $image_repository && \echo "Image $image_repository saved, size $image_size"done < images_pull.txt
}load(){cd imageswhile read linedoimage_id=`echo $line | awk '{print $1}'`image_repository=`echo $line | awk '{print $2}'`docker load -i $image_id.tar && \echo "Image $image_repository loaded"done < images_pull.txt
}
if [ -z "$1" ]; thenecho "Usage: image_operation.sh [save|load]"
fieval $1