docker-鏡像管理
2.4:Docker 鏡像管理
Docker 鏡像含有啟動容器所需要的文件系統(tǒng)及所需要的內(nèi)容,因此鏡像主要用于創(chuàng)建并啟動docker容器。


docker 鏡像直接調(diào)用宿主機的內(nèi)核,鏡像中只提供 rootfs,也就是只需要包括最基本的命令、工具和程序庫就可以了。不同的鏡像在一個宿主機內(nèi)核上實現(xiàn)不同的 rootfs。
演示Union FS(聯(lián)合文件系統(tǒng))原理
root@ubuntu:/opt# mkdir a b system root@ubuntu:/opt# ll total 24 drwxr-xr-x 6 root root 4096 Feb 18 10:18 ./ drwxr-xr-x 23 root root 4096 Jan 30 01:30 ../ drwxr-xr-x 2 root root 4096 Feb 18 10:18 a/ drwxr-xr-x 2 root root 4096 Feb 18 10:18 b/ drwxr-xr-x 2 root root 4096 Feb 18 10:18 system/ root@ubuntu:/opt# cd a root@ubuntu:/opt/a# touch a.txt root@ubuntu:/opt/a# cd .. root@ubuntu:/opt# cd b root@ubuntu:/opt/b# touch b.txt root@ubuntu:/opt# mount -t aufs -o dirs=./a:./b none ./system/ #多個文件同時掛載到一個掛載點 root@ubuntu:/opt# tree system/ system/ ├── a.txt └── b.txt
鏡像命令
搜索鏡像 docker search centos:7.2.1511 #帶指定版本號 docker search centos #不帶版本號默認 latest 下載鏡像: 從 docker 倉庫將鏡像下載到本地,命令格式如下: docker pull 倉庫服務(wù)器:端口/項目名稱/鏡像名稱:tag(版本)號 docker info 中的Registry信息 查看本地鏡像: docker images REPOSITORY #鏡像所屬的倉庫名稱 TAG #鏡像版本號(標識符),默認為 latest IMAGE ID #鏡像唯一 ID 標示 CREATED #鏡像創(chuàng)建時間 VIRTUAL SIZE #鏡像的大小 鏡像導出: 可以將鏡像從本地導出問為一個壓縮文件,然后復制到其他服務(wù)器進行導入使用 1、 docker save centos -o /opt/centos.tar.gz 2、 docker save centos > /opt/centos-1.tar.gz 查看鏡像內(nèi)容: cat manifest.json #包含了鏡像的相關(guān)配置,配置文件、 分層 鏡像導入: docker load -i centos.tar.gz docker load < /opt/centos.tar.gz 刪除鏡像: docker rmi 鏡像 ID/鏡像名 ,通過鏡像啟動容器的時 候鏡像不能被刪除,除非將容器全部關(guān)閉 docker rmi centos
Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
Remove one or more images
Options:
-f, --force Force removal of the image
--no-prune Do not delete untagged parents
2.5:容器操作基礎(chǔ)命令
命令格式:
# docker run [選項] [鏡像名] [shell 命令] [參數(shù)]
# docker run [參數(shù)選項] [鏡像名稱,必須在所有選項的后面] [/bin/echo 'hello wold'] #單次執(zhí)行,沒有自定義容器名稱
# docker run centos /bin/echo 'hello wold' #啟動的容器在執(zhí)行完 shell命令就退出了
常見命令
從鏡像啟動一個容器 會直接進入到容器,并隨機生成容器 ID 和名稱 [root@docker-server1 ~]# docker run -it docker.io/centos bash #單次測試命令運行完即退出 [root@11445b3a84d3 /] #退出容器不注銷 ctrl+p+q 顯示正在運行的容器 docker ps 顯示所有容器: 包括當前正在運行以及已經(jīng)關(guān)閉的所有容器: docker ps -a 刪除運行中的容器:即使容正在運行當中,也會被強制刪除掉 docker rm -fv 容器ID Options: -f, --force Force the removal of a running container (uses SIGKILL) -l, --link Remove the specified link -v, --volumes Remove the volumes associated with the container 容器狀態(tài): created: 被創(chuàng)建之后由于啟動參數(shù)錯誤而沒有啟動成功的 up:正在運行的容器 exited:已經(jīng)退出或者注銷的 指定端口映射: 方式 1:本地端口 81 映射到容器 80 端口: root@ubuntu:~# docker run -it --name web1 -p 8000:80 55c440ba1ecb root@ubuntu:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ac11d44f5539 55c440ba1ecb "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 0.0.0.0:8000->80/tcp web1 方式 2:本地 IP:本地端口:容器端口 root@ubuntu:~# docker run -it -d --name web2 -p 192.168.134.182:9000:80 nginx root@ubuntu:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c493bc2b09c5 nginx "nginx -g 'daemon of…" 10 seconds ago Up 9 seconds 192.168.134.182:9000->80/tcp web2 方式 3:本機 ip:本地端口:容器端口/協(xié)議,默認為 tcp 協(xié)議 root@ubuntu:~# docker run -it -d -p 8001:80/udp --name web3 nginx:1.16.1 d2a5897fc888b94ba2790a761e3f1ac004b333ba672c9ed01d4be7551d792727 root@ubuntu:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2a5897fc888 nginx:1.16.1 "nginx -g 'daemon of…" 7 seconds ago Up 7 seconds 80/tcp, 0.0.0.0:8001->80/udp web3 方式 4:一次性映射多個端口+協(xié)議: root@ubuntu:~# docker run -it -d -p 86:80/tcp -p 443:443/tcp --name web5 nginx:1.16.1 f8ef7471fd639eb3a226e441f288803a58f72f25582ef5d71fd13559499102fa root@ubuntu:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8ef7471fd63 nginx:1.16.1 "nginx -g 'daemon of…" 7 seconds ago Up 6 seconds 0.0.0.0:443->443/tcp, 0.0.0.0:86->80/tcp web5 #查看 Nginx 容器訪問日志 root@ubuntu:~# docker logs b0d688e137c4 #一次查看 root@ubuntu:~# docker logs -f b0d688e137c4 #持續(xù)查看 查看容器已經(jīng)映射的端口: root@ubuntu:~# docker port d2a5897fc888 80/udp -> 0.0.0.0:8001 后臺啟動容器: 參數(shù)家上-d 創(chuàng)建并進入容器: root@ubuntu:~# docker run -it --name web10 nginx:1.16.1 bash root@50adcf8c2293:/#
傳遞運行命令 :
容器需要有一個前臺運行的進程才能保持容器的運行,通過傳遞運行參數(shù)是一 種方式,另外也可以在構(gòu)建鏡像的時候指定容器啟動時運行的前臺命令。這個進程被封裝為PID為1的守護進程,如nginx的master進程,shell命令。傳遞的命令優(yōu)先級高于鏡像內(nèi)置的啟動命令。

容器的啟動和關(guān)閉:
k8s環(huán)境禁止通過重啟服務(wù)或重啟容器來實現(xiàn)配置變更和代碼發(fā)布
root@ubuntu:~# docker start 50adcf8c2293 50adcf8c2293 root@ubuntu:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50adcf8c2293 nginx:1.16.1 "bash" 45 minutes ago Up 7 seconds 80/tcp web10 root@ubuntu:~# docker stop 50adcf8c2293 50adcf8c2293 root@ubuntu:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50adcf8c2293 nginx:1.16.1 "bash" About an hour ago Exited (0) 2 seconds ago
進入到正在運行的容器:
使用 exec 命令 執(zhí)行單次命令與進入容器,不是很推薦此方式,雖然 exit 退出容器還在運行 root@ubuntu:~# docker exec -it f8ef7471fd63 bash root@f8ef7471fd63:/# 使用 nsenter 命令 推薦使用此方式,nsenter 命令需要通過 PID 進入到容器內(nèi)部,不過可以使用 docker inspect 獲取到容器的 PID: docker inspect ID#獲取json格式的信息 root@ubuntu:~# docker inspect -f "{{.State.Pid}}" f8ef7471fd63 5215 ##獲取到某個docker 容器的 PID,可以通過 PID 進入到容器內(nèi) root@ubuntu:~# nsenter -t 5215 -m -u -i -n -p mesg: ttyname failed: No such device ping 容器 ID root@f8ef7471fd63:/# apt update apt install iputils-ping apt install net-tools root@f8ef7471fd63:/# ping f8ef7471fd63 PING f8ef7471fd63 (172.17.0.6) 56(84) bytes of data. 64 bytes from f8ef7471fd63 (172.17.0.6): icmp_seq=1 ttl=64 time=0.011 ms 64 bytes from f8ef7471fd63 (172.17.0.6): icmp_seq=2 ttl=64 time=0.023 ms
批量關(guān)閉正在運行的容器:
root@ubuntu:~# docker ps -a -q #查看container ID 50adcf8c2293 f8ef7471fd63 d2a5897fc888 c493bc2b09c5 ac11d44f5539 b0d688e137c4 root@ubuntu:~# docker stop $(docker ps -a -q) root@ubuntu:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50adcf8c2293 nginx:1.16.1 "bash" About an hour ago Exited (0) 38 minutes ago web10 f8ef7471fd63 nginx:1.16.1 "nginx -g 'daemon of…" 2 hours ago Exited (0) 5 seconds ago web5 d2a5897fc888 nginx:1.16.1 "nginx -g 'daemon of…" 2 hours ago Exited (0) 5 seconds ago web3 docker kill $(docker ps -a -q) #批量強制關(guān)閉正在運行的容器 root@ubuntu:~# docker rm -f `docker ps -aq -f status=exited` #批量刪除已退出容器 docker rm -f $(docker ps -a -q) #批量刪除所有容器:
指定容器 DNS:
dns 服務(wù),默認采用宿主機的 dns 地址
一是將 dns 地址配置在宿主機
二是將參數(shù)配置在 docker 啟動腳本里面 –dns=1.1.1.1
root@ubuntu:~# docker run -it -d --dns 223.6.6.6 nginx:1.16.1 root@ubuntu:~# docker exec -it b1c0a49c6eaf bash root@b1c0a49c6eaf:/# cat /etc/resolv.conf nameserver 223.6.6.6
浙公網(wǎng)安備 33010602011771號