容器是docker的核心概念,容器是獨立運行的一個或一組應用,以及他們的運行狀態環境。
Docker容器的狀態轉換和相關各場景命令
1、列出所有運行中的容器
命令格式語法:docker ps [OPTIONS]
參數選項:
-a 列出所有運行中的容器
-q 僅列出容器ID
-s 顯示容器大小
-n=1 列出最近創建的n個容器
[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES001bf3cf82d6 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 80/tcp web1[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES001bf3cf82d6 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 80/tcp web1[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker ps -sCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE001bf3cf82d6 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 80/tcp web1 2B (virtual 109MB)[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker ps -q001bf3cf82d62、創建啟動容器
2.1、啟動容器的兩種方式
2.1.1、新建容器並啟動
這種啟動方式為基於鏡像新建一個容器並啟動,所需要的命令主要為docker run,相當於先執行docker create命令在執行docker start命令進行啟動容器
2.1.2、終止狀態的容器並啟動
這一種啟動方式為容器在停止狀態(stopped)的容器使用docker start命令進行重新啟動
2.2、新建容器
2.2.1、新建並啟動容器
新建容器並啟動容器的命令主要為docker run命令
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
選項:
-i選項讓容器的標準輸入保持打開,以交互模式運行容器,通常與-t同時使用
-t 選項讓Docker分配一個偽終端(pseudo-tty)並綁定到容器的標準輸入上通常與-i同時使用
-d或者-d=true選項則是讓docker容器以守護狀態在後臺運行而不是直接把執行命令的結果輸出在當前的宿主機下並返回容器ID
--namenginx 指定容器名稱,如果沒有指定則會自動生成一個隨機字符串UUID
-hhostname 指定容器的hostname
-P(大P)映射到主機的隨機埠
-p(小p) 將容器的埠映射到主機埠 如: –p 80:80將容器的80埠映射到主機80埠
-v 將主機的目錄映射到容器的目錄 如:-v/data:/data將主機的data目錄映射到容器的data目錄
--dns強制容器使用dns伺服器,例如docker –d --dns 8.8.8.8
2.2.2、創建並啟動容器時的執行過程
當利用docker run來創建並啟動容器時,docker在後臺運行的標準操作包括:
1、 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
2、 利用鏡像創建並啟動一個鏡像
3、 分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
4、 從宿主機配置的網橋接口中橋接一個虛擬接口到容器中
5、 從地址池配置一個ip地址給容器
6、 執行用戶指定的應用程式
7、 執行完畢後容器被終止
2.3、運行容器
2.3.1、新建一個容器並啟動,允許用戶進行交互
[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker run --name bus -it busybox:latestUnable to find image 'busybox:latest' locallylatest: Pulling from library/busybox697743189b6d: Pull complete Digest: sha256:061ca9704a714ee3e8b80523ec720c64f6209ad3f97c0ff7cb9ec7d19f15149fStatus: Downloaded newer image for busybox:latest/ # lsbin dev etc home proc root sys tmp usr var/ # ls /var/spool www/ # ls /var/www// #另啟動一個ssh工具使用docker ps 命令查看剛新建的busybox容器是否在運行[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESc10b43fc1e90 busybox:latest "sh" 5 minutes ago Up 5 minutes bus001bf3cf82d6 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 80/tcp web1使用exit退出容器
/ / [root@iz2ze3umvnbux0g6f9b9kuz ~][root@iz2ze3umvnbux0g6f9b9kuz ~][root@iz2ze3umvnbux0g6f9b9kuz ~]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES001bf3cf82d6 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 80/tcp web1[root@iz2ze3umvnbux0g6f9b9kuz ~]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESc10b43fc1e90 busybox:latest "sh" 8 minutes ago Exited (0) 9 seconds ago bus835a0eeb5159 mysql "docker-entrypoint.s…" 2 hours ago Exited (1) 2 hours ago mysql001bf3cf82d6 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 80/tcp web1對於創建的bash容器,當使用命令exit退出容器時,該容器就自動處於終止狀態了,這是因為對於docker容器來說,當運行的應用退出後,容器也就沒有繼續運行的必要了。(如上)
2.3.2、創建nginx容器並在後臺運行
在後臺運行容器時使用docker rum -d選項
[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker run --name Nginx_Web -d nginx4bce4a95adbb2417045423a485fa752705ae9e62ce19a7b2efb6782673b0c584[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4bce4a95adbb nginx "nginx -g 'daemon of…" 10 seconds ago Up 9 seconds 80/tcp Nginx_Web[root@iz2ze3umvnbux0g6f9b9kuz ~]#使用docker inspect 容器名稱命令進行查看當前容器的IP位址
[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker inspect Nginx_Web[ { "Id": "4bce4a95adbb2417045423a485fa752705ae9e62ce19a7b2efb6782673b0c584", "Created": "2019-03-07T08:50:41.630306814Z", "Path": "nginx", 。。。。。。。略 。。。。。。。略 " IPAddress": "172.18.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:12:00:02", "DriverOpts": null } } } }]其中IPAddress": "172.18.0.2"為當前容器的IP位址,使用curl訪問次ip地址進行訪問。
[root@iz2ze3umvnbux0g6f9b9kuz ~]# curl 172.18.0.2<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p>
<p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p></body></html>[root@iz2ze3umvnbux0g6f9b9kuz ~]#由此可見,此容器是可以被訪問的。
2.4、暫停終止容器
停止上面創建的nginx容器
使用命令docker stop 容器名稱
[root@iz2ze3umvnbux0g6f9b9kuz ~]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4bce4a95adbb nginx "nginx -g 'daemon of…" 11 minutes ago Up 11 minutes 80/tcp Nginx_Web[root@iz2ze3umvnbux0g6f9b9kuz ~]Nginx_Web[root@iz2ze3umvnbux0g6f9b9kuz ~]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@iz2ze3umvnbux0g6f9b9kuz ~]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4bce4a95adbb nginx "nginx -g 'daemon of…" 12 minutes ago Exited (0) 16 seconds ago Nginx_Webc10b43fc1e90 busybox:latest "sh" 27 minutes ago Exited (0) 19 minutes ago bus835a0eeb5159 mysql "docker-entrypoint.s…" 2 hours ago Exited (1) 2 hours ago mysql由返回結果可看status狀態已經為exited,所以nginx容器已經停止。
2.5、重啟暫停的容器
使用docker restart 命令會將一個運行狀態為終止的容器進行重新啟動。
[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker restart Nginx_WebNginx_Web[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4bce4a95adbb nginx "nginx -g 'daemon of…" 15 minutes ago Up 4 seconds 80/tcp Nginx_Web由上面的status狀態為up,可見已經啟動成功。
2.6、刪除容器
可以使用docker rm命令刪除處於終止狀態的容器,
其格式為docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS選項:
-f 強行終止並刪除一個運行中的容器
-l 刪除容器的連接,但保留容器
-v刪除容器掛載的數據卷
刪除容器中的mysql容器[root@iz2ze3umvnbux0g6f9b9kuz ~]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4bce4a95adbb nginx "nginx -g 'daemon of…" 18 minutes ago Up 3 minutes 80/tcp Nginx_Webc10b43fc1e90 busybox:latest "sh" 33 minutes ago Exited (0) 25 minutes ago bus835a0eeb5159 mysql "docker-entrypoint.s…" 3 hours ago Exited (1) 3 hours ago mysql[root@iz2ze3umvnbux0g6f9b9kuz ~]mysql[root@iz2ze3umvnbux0g6f9b9kuz ~]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4bce4a95adbb nginx "nginx -g 'daemon of…" 21 minutes ago Up 6 minutes 80/tcp Nginx_Webc10b43fc1e90 busybox:latest "sh" 36 minutes ago Exited (0) 28 minutes ago bus[root@iz2ze3umvnbux0g6f9b9kuz ~]由結果可看mysql容器已經被刪除。
2.7、獲取容器日誌
使用命令docker logs 容器名稱進行獲取容器日誌
[root@iz2ze3umvnbux0g6f9b9kuz ~]# docker logs Nginx_Web172.18.0.1 - - [07/Mar/2019:08:57:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"[root@iz2ze3umvnbux0g6f9b9kuz ~]#2.8、停止狀態下啟動容器
這一種啟動方式為容器在停止狀態(stopped)的容器使用docker start命令進行重新啟動
命令格式:
dockerstart [OPTIONS] CONTAINER [CONTAINER...]
Options:
-a, --attach Attach STDOUT/STDERR and forwardsignals
--detach-keysstring Override the key sequence fordetaching a container
-i, --interactive 進入交互接口並附加到終端上
[root@iz2ze3umvnbux0g6f9b9kuz ~]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4bce4a95adbb nginx "nginx -g 'daemon of…" 41 minutes ago Up 26 minutes 80/tcp Nginx_Webc10b43fc1e90 busybox:latest "sh" About an hour ago Exited (0) About an hour ago bus[root@iz2ze3umvnbux0g6f9b9kuz ~]/ bin dev etc home proc root sys tmp usr var/ spool www/ [root@iz2ze3umvnbux0g6f9b9kuz ~]CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4bce4a95adbb nginx "nginx -g 'daemon of…" 42 minutes ago Up 27 minutes 80/tcp Nginx_Webc10b43fc1e90 busybox:latest "sh" About an hour ago Up 41 seconds bus2.9、進入容器
在使用-d參數時,容器啟動後會進入後臺,用戶無法查看到容器中的信息,有些時候如果需要進入容器進行操作時,可以進入到容器進行操作,有很多方法包括docker attach命令,docker exec命令以及nsenter工具等。
- MORE | 往期Docker系列精彩文章 -
Docker系列文章--基本概念
Docker系列文章--什麼是Docker
Docker系列文章--幾張圖幫你理解 docker 基本原理
Docker系列文章--安裝Docker CE
Docker系列文章--配置加速器
Docker系列文章--鏡像的使用(一)
Docker系列文章--鏡像的使用(二)