1. 程式人生 > 其它 >第八章 Docker容器的使用

第八章 Docker容器的使用

一、容器的建立

容器是指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