第八章 Docker容器的使用
阿新 • • 發佈:2021-09-13
一、容器的建立
容器是指Docker對外提供服務的一個例項。
#1.建立容器的格式:
docker run [option] image [cmd]
#2.示例
[root@m01 ~]# docker run -d --name nginx -p 80:80 nginx
87594f40bacdc4f94bee5186740a3eae9c179634a58cf7c77b4e16ef984d24e4
二、容器啟動引數
-d | 以守護程序方式執行 |
---|---|
-p | 指定對映埠 |
-P | 隨機對映埠 |
-i | 保持標準輸入開啟 |
-t | 分配一個偽終端 |
-v | 設定掛載檔案到主機上 |
--rm | 當容器關閉時自動刪除 |
--name | 為啟動的容器設定一個名字 |
--network | 指定使用哪個網路 |
-e | 設定容器中的環境變數 |
--link | 連結到另一個容器 |
-h | 指定容器內的主機名 |
1.格式
docker run [引數] [映象名稱|ID] [指定的容器執行命令(如果不設定則使用預設命令)]
2.容器啟動流程
1、執行一個docker run
2、檢查本地是否存在所需映象,如果沒有則去遠端映象倉庫下載。
3、按照映象和引數啟動一個容器
3.示例
#1.-d : 只以守護程序的模式執行一個容器 [root@docker100 ~]# docker run -d nginx aeda72468e4eef99bc648c4f05166d8282c21977afb6d80445c77f612dd6c65b #2.-i:開啟標準輸出,-t:建立一個視窗(偽終端) [root@docker100 ~]# docker exec -it aeda72468e4e bash root@aeda72468e4e:/# #3.-p(小寫的p字母):指定對映埠 [root@m01 ~]# docker run -d -p 30080:80 nginx;docker ps #3.-P(大寫的P字母) : 隨機對映埠 [root@docker100 ~]# docker run -d -P nginx 9ee77ffb1e5d1a6b37b689b8e030560652c70af20153f0d537ded89a97e3ecef [root@docker100 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ee77ffb1e5d nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp naughty_ishizaka #4.-v : 指定掛載卷(將本機的目錄對映到容器內部) 作用: 1、將本機目錄"軟連結"容器內部 2、可以持久化容器內部資料 示例: [root@m01 ~]# docker run -d -P -v /root/test:/usr/share/nginx/html nginx:latest #5.--name : 指定容器的名稱 作用: 1、指定容器名稱 2、將名稱解析到docker dns上 示例: [root@m01 ~]# docker run -d --name nginx nginx #6.--link : 將一個容器的網路連線到另外一個容器 格式: --link 容器名稱:連線別名 示例: [root@m01 ~]# docker run -d --name test_nginx nginx [root@m01 ~]# docker run -it --link test_nginx:test_nginx centos #7.--rm : 當容器的生命週期結束時,自動刪除容器 示例: [root@m01 ~]# docker run -d --rm centos sleep 10 #8.--network : 連線網橋(同一個網橋內的所有容器網路互通) 示例: [root@m01 ~]# docker network create chenyang [root@m01 ~]# docker run -d --network chenyang nginx
三、停止容器
docker終止容器是首先向容器傳送SIGTERM訊號,等待一段時間超時後(預設10秒),再發送SIGKILL訊號來終止容器。
停止容器,並沒有刪除容器。
1.檢視容器程序數
#1.檢視啟動的容器程序數 [root@m01 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 87594f40bacd nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp nginx 1e54552dfbde nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:49153->80/tcp wizardly_carson 引數: -a : 查詢本機上所有的容器(包括已經停止了的) -q : 只顯示容器ID 列表引數: CONTAINER ID:容器ID IMAGE :映象ID COMMAND :啟動容器執行的命令 CREATED :容器建立的時間 STATUS :狀態(Up:啟動狀態 Exitd:停止狀態) PORTS :埠對映 NAMES :容器名稱
2.停止nginx容器
#1.格式:
docker stop [容器ID及名稱]
#2.示例:
[root@m01 ~]# docker stop nginx
nginx
3.再次檢視容器程序數
#3.再次檢視容器程序數
[root@m01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e54552dfbde nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:49153->80/tcp wizardly_carson
可見,NGINX容器已經被我們終止了,這個時候我們也可以重新啟動這個容器。
4.啟動nginx容器
#1.格式:
docker start [容器ID及名稱]
#2.示例:
[root@m01 ~]# docker start nginx
nginx
[root@m01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87594f40bacd nginx "/docker-entrypoint.…" 6 minutes ago Up 7 seconds 0.0.0.0:80->80/tcp nginx
四、進入容器
在使用容器的過程中,我們難免需要進入容器進行排查問題。下面我們就來介紹進入容器的集中方式。
1.attach
attach是最早docker官方推出的進入容器的命令了,不過使用該命令有一個問題。當多個視窗同時使用該命令進入該容器時,所有的視窗都會同步顯示。如果有一個視窗阻塞了,那麼其他視窗也無法再進行操作,當所有視窗退出時,容器結束。
#1.解釋:
進入容器。通過一個管道連線到容器的頂級程序。
缺點:當attach退出是,順帶把頂級程序也帶走了。
#2.格式:
docker attach [容器ID或名稱]
#3.示例:
[root@m01 ~]# docker attach nginx
10.0.0.61 - - [11/Jan/2021:13:03:55 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
2. exec(推薦)
既attach之後,exec是官方推出的有一個新的進入容器的命令,這個命令相當於在容器中執行一個命令。
#1.解釋:
exec不是進入容器的命令,而是碰巧有這種功能。其功能是在容器外向容器內執行一條命令的命令。
#2.格式:
docker exec [引數] [容器的ID或名稱] [命令]
#3.示例:
[root@docker ~]# docker exec -i -t ead6cdefcd01 bash
root@ead6cdefcd01:/#
[root@m01 ~]# docker exec -it nginx /bin/bash
root@87594f40bacd:/#
3.nsenter
需要配合docker inspect來使用(早期沒有exec命令時,企業當中最長用的方式之一),Docker是用golang語言開發,所以它也支援go語言的摸版語法。
#1.解釋:
建立兩個程序之間的互通管道
#2.格式:
nsenter --target $( docker inspect -f {{.State.Pid}} nginxv1 ) --mount --uts --ipc --net --pid
#3.示例:
[root@m01 ~]# nsenter --target $( docker inspect -f {{.State.Pid}} nginx ) --mount --uts --ipc --net --pid
mesg: ttyname failed: No such device
root@87594f40bacd:/#
root@87594f40bacd:/#
4. ssh
在生產環境中排除了使用docker attach命令進入容器之後,相信大家第一個想到的就是ssh。在映象(或容器)中安裝SSH Server,這樣就能保證多人進入容器且相互之間不受干擾了,相信大家在當前的生產環境中(沒有使用Docker的情況)也是這樣做的。但是使用了Docker容器之後不建議使用ssh進入到Docker容器內。
#1.解釋:
通過ssh隧道連線
#2.格式:
ssh [email protected]
5.總結·
進入docker container中一般情況下有4種方式,最常用的是exec和nsenter這兩種。
Nsenter和exec之間的區別?
1)Exec是docker自帶的命令,Nsenter是Linux提供的命令。
2)Exec相當於在容器內執行一個命令,而Nsenter是僅僅進入容器之中而已。
五、刪除容器
可以使用 docker rm 命令來刪除處於終止或退出狀態的容器.
命令格式為:
docker rm container。
[root@m01 ~]# docker rm nginx
# 強制刪除一個正在執行的容器。
[root@m01 ~]# docker rm -f nginx
nginx
# 強制刪除所有的容器。
[root@m01 /docker]# docker container rm $(docker container ls -aq) -f
六、匯入與匯出容器
某些時候,需要將容器從一個系統遷移到另外一個系統,此時可以使用 Docker 的導人和匯出功能,這也是 Docker 自身提供的一個重要特性。
1. 匯出容器
匯出容器是指,匯出一個已經建立的容器到一個檔案,不管此時這個容器是否處於執行狀態 可以使用 docker [container] export 令,該命令格式為:
[root@m01 ~]# docker export daf9c3656be3 > nginx.tar
[root@m01 ~]# ll | grep nginx.tar
2.匯入容器
匯出的檔案又可以使用 docker [ container] import 命令導人變成映象,該命令格式為:
[root@m01 ~]# docker import nginx.tar test/nginx:v1
sha256:02107323de1b074c5d2034b01eff855fec5922b45776c2721882d100ba6dd15b
[root@m01 ~]# docker images | grep test
test/nginx v1 02107323de1b 22 seconds ago 131MB
實際上,既可以使用 docker load 命令來匯入映象儲存檔案到本地映象庫,也可以使docker [container] import 命令來匯入一個容器快照到本地映象庫 這兩者的區別在於 容器快照檔案將丟棄所有的歷史記錄和元資料資訊(即僅儲存容器當時的快照狀態),而映象儲存檔案將儲存完整記錄,體積更大 此外,從容器快照檔案導人時可以重新指定標籤等元資料資訊。
七、 檢視容器
檢視容器詳情可以使用 docker container inspect [OPTIONS] CONTAINER [CONTAINER . .. ]子命令。
#1.格式:
docker inspect [容器ID或名稱]
#2.示例:
[root@m01 ~]# docker inspect 22b601ab6f9f
[
{
"Id": "22b601ab6f9f7010221440f1158e0ece348768e4df1b133690f1c503ed012e4d",
"Created": "2021-01-12T09:29:07.881750107Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
...
#3.引數:
-f : 指定使用golang語言模板
[root@m01 ~]# docker inspect -f '{{ .State.Status }}' d4b2a919cb7f
running
八、容器複製命令詳解
複製命令類似於Linux系統中的scp命令,是將宿主主機上的內容上傳到容器中,也可能是將容器中的檔案下載到宿主主機中。
#1.格式:
第一種:複製到容器內
docker cp [宿主主機的路徑] [容器ID]:[容器內的路徑]
第二種:複製到容器外
docker cp [容器ID]:[容器內的路徑] [宿主主機的路徑]
#2.示例:
$將宿主主機中的檔案複製到容器中
[root@m01 ~]# docker cp start 726b695a337c:/root
[root@m01 ~]# docker exec 726b695a337c ls /root
start
$將容器中的內容複製到宿主主機
[root@m01 ~]# docker cp 726b695a337c:/opt/start .
[root@m01 ~]# ls | grep start
Start