Docker 核心技術之容器

 什麼是容器

容器(Container)python

  容器是一種輕量級、可移植、並將應用程序進行的打包的技術,使應用程序能夠在幾乎任何地方以相同的方式運行 Docker將鏡像文件運行起來後,產生的對象就是容器。容器至關因而鏡像運行起來的一個實例。mysql

容器具有必定的生命週期。linux

另外,能夠藉助docker ps命令查看運行的容器,如同在linux上利用ps命令查看運行着的進程那樣。nginx

通俗的講 docker 運行一個鏡像,這個鏡像就會生成一個進程,這個進程就被成爲容器。(進程就是資源管理的集合)redis

 

容器和虛擬機對比

Docker 容器與虛擬機相同點sql

  • 容器和虛擬機同樣,都會對物理硬件資源進行共享使用。
  • 容器和虛擬機的生命週期比較類似(建立、運行、暫停、關閉等等)。
  • 容器中或虛擬機中均可以安裝各類應用,如redis、mysql、nginx等。
  • 也就是說,在容器中的操做,如同在一個虛擬機(操做系統)中操做同樣。
  • 同虛擬機同樣,容器建立後,會存儲在宿主機上:linux上位於/var/lib/docker/containers

 

運行一個鏡像docker

docker run --rm -dti ubuntu:16.04

cd /var/lib/docker/containers

docker ps

  

 

 Docker 容器與虛擬機不一樣點shell

注意:容器並非虛擬機,但它們有不少類似的地方json

  • 虛擬機的建立、啓動和關閉都是基於一個完整的操做系統。一個虛擬機就是一個完整的操做系統。而容器直接運行在宿主機的內核上,其本質上以一系列進程的結合。
  • 容器是輕量級的,虛擬機是重量級的。首先容器不須要額外的資源來管理(不須要Hypervisor、Guest OS),虛擬機額外更多的性能消耗;其次建立、啓動或關閉容器,如同建立、啓動或者關閉進程那麼輕鬆,而建立、啓動、關閉一個操做系統就沒那麼方便了。
  • 也所以,意味着在給定的硬件上能運行更多數量的容器,甚至能夠直接把Docker運行在虛擬機上。

 

                   

    docker                                                          虛擬機ubuntu

 

 

虛擬機和 docker 容器的生命週期

 

 

                       虛擬機的生命週期

 

 

 

                      docker 容器的生命週期

 

容器建立 – docker create

做用:

  • 利用鏡像建立出一個Created 狀態的待啓動容器

命令格式:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

命令參數(OPTIONS): 

  • -t, --tty 分配一個僞TTY,也就是分配虛擬終端
  • -i, --interactive 即便沒有鏈接,也要保持STDIN打開
  • --name 爲容器起名,若是沒有指定將會隨機產生一個名稱

查看更多

https://docs.docker.com/engine/reference/commandline/create/#options

 

命令參數(COMMAND\ARG):

  • COMMAND 表示容器啓動後,須要在容器中執行的命令,如ps、ls 等命令 ARG 表示執行 COMMAND 時須要提供的一些參數,如ps 命令的 aux、ls命令的-a等等

 

查看使用幫助

docker create --help

 

能夠看到必填的參數是 IMAGE ,假如 建立一個 centos 的容器 docker create centos

若是咱們不指定參數, 他就會使用 centos 默認的參數, 具體查看以下

docker inspect centos

 

 

 建立一個 centos 的鏡像

docker create centos ls -a
docker ps -a

 

容器刪除 – docker container rm

 

 查看使用幫助

docker rm -h

 

查看正在運行的容器

docker ps -a

 

根據 NAMES和 ID 進行刪除 一個或多個 , 加上參數 -f 表示強制刪除(針對正在運行的

docker rm zhang 0ac 1c1 ded

 

容器啓動 – docker start

 

做用:

  • 將一個或多個處於建立狀態或關閉狀態的容器啓動起來

 

命令格式:

  • docker start [OPTIONS] CONTAINER [CONTAINER...]

 

命令參數(OPTIONS):

  • -a, --attach 將當前shell的 STDOUT/STDERR鏈接到容器上
  • -i, --interactive 將當前shell的 STDIN鏈接到容器上

 

建立一個容器

docker create --name test-centos centos ls -a

docker ps -a

  

 

 啓動剛剛建立的容器

docker start 1dd

  

能夠看到這時容器的狀態是 Exited 並非咱們指望的 runing 狀態 這時由於咱們在建立容器的時候使用的命令參數是 ls -a ,這條命令是瞬間就執行完成,進程執行結束,因此容器退出了

 

 可是並無打印出 ls -a 的執行結果 ,查看 docker start 的用法

docker start -h

 

 

在上面咱們能夠看到 可選參數 -a 能夠把 標準的輸入和錯誤信息顯示出來,再次啓動一個容器

 docker start 1dd -a

 

 

 

建立一個容器執行 python 命令

docker create --name python centos python
docker start python -a

發現並無向咱們在終端上出現的以下交互

 

 出現以上的緣由是咱們在建立容器的時候,沒有爲其指定一個終端 -t 和 標準的輸入 -i

docker create --name python_new -ti centos python

docker start python_new -ai

這時就能夠輸入和輸出了

容器建立並啓動 – docker run

做用:

  • 利用鏡像建立並啓動一個容器

命令格式:

  • docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

命令參數(OPTIONS):

  •  -t, --tty 分配一個僞TTY,也就是分配虛擬終端
  • -i, --interactive 即便沒有鏈接,也要保持STDIN打開
  • --name 爲容器起名,若是沒有指定將會隨機產生一個名稱
  • -d, --detach 在後臺運行容器並打印出容器ID
  • --rm 當容器退出運行後,自動刪除容器

查看更多

https://docs.docker.com/engine/reference/commandline/run/#options

 

命令參數(COMMAND\ARG):

  • COMMAND 表示容器啓動後,須要在容器中執行的命令,如ps、ls 等命令
  • ARG 表示執行 COMMAND 時須要提供的一些參數,如ps 命令的 aux、ls命令的-a等等

 

運行一個容器

docker run centos ls -a

能夠看到 docker run 等價於 docker create + docker start -a

  

 須要提供終端和標準輸入加上 -ti 參數便可

docker run -ti centos python

 

docker run 與 docker create + docker start

  • docker run 至關於 docker create + docker start –a 前臺模式 
  • docker run -d 至關於 docker create + docker start 後臺模式
docker run -dti centos python

  

能夠看到加上 -d 後這個容器是在後臺掛起的

 

 

 容器關閉 – docker stop

 

做用:

  • 關閉一個或多個處於暫停狀態或者運行狀態的容器

命令格式:

  • docker stop [OPTIONS] CONTAINER [CONTAINER...]

命令參數(OPTIONS):

  • -t, --time int 關閉前,等待的時間,單位秒(默認 10s)

 

 命令演示

 

docker stop -h

  

 

 

 後臺運行一個 centos 的鏡像

docker run -dti centos python
docker ps -a

 

3s 後 關閉這個容器,不加 -t 參數默認是10 s

docker stop -t 3 342

 

容器終止 – docker kill

docker kill -h

 

做用:

  • 強制並當即關閉一個或多個處於暫停狀態或者運行狀態的容器

命令格式:

  • docker kill [OPTIONS] CONTAINER [CONTAINER...]

命令參數(OPTIONS):

  • -s, --signal string 指定發送給容器的關閉信號 (默認「KILL」信號)

命令演示

docker kill 342

  

                                                                                                         

                         docker stop和docker kill的區別

前提知識點:

Linux其中兩種終止進程的信號是:SIGTERM和SIGKILL

SIGKILL信號:無條件終止進程信號。進程接收到該信號會當即終止,不進行清理和暫存工做。該信號不能被忽略、處理和阻塞,它向系統管理員提供了能夠殺死任何進程的方法。

SIGTERM信號:程序終結信號,能夠由kill命令產生。與SIGKILL不一樣的是,SIGTERM信號能夠被阻塞和終止,以便程序在退出前能夠保存工做或清理臨時文件等。

docker stop 會先發出SIGTERM信號給進程,告訴進程即將會被關閉。在-t指定的等待時間過了以後,將會當即發出SIGKILL信號,直接關閉容器。

docker kill 直接發出SIGKILL信號關閉容器。但也能夠經過-s參數修改發出的信號。

所以會發如今docker stop的等過過程當中,若是終止docker stop的執行,容器最終沒有被關閉。而docker kill幾乎是馬上發生,沒法撤銷。

此外還有些異常緣由也會致使容器被關閉,好比docker daemon重啓、容器內部進程運行發生錯誤等等「異常緣由」。

容器暫停 – docker pause 和 取消暫停 – docker unpause

docker pause -h

 

做用:

  • 暫停一個或多個處於運行狀態的容器

 

命令格式:

  • docker pause CONTAINER [CONTAINER...]

 

命令參數(OPTIONS):

 

命令演示 

docker pause 342

 

 

docker unpause -h

做用:

  • 取消一個或多個處於暫停狀態的容器,恢復運行

命令格式:

  • docker unpause CONTAINER [CONTAINER...]

命令參數(OPTIONS):

 命令演示

docker unpause 342

  

 

 

 容器重啓 – docker restart

docker restart -h

做用:

  • 重啓一個或多個處於運行狀態、暫停狀態、關閉狀態或者新建狀態的容器,該命令至關於stop和start命令的結合

命令格式:

  • docker restart [OPTIONS] CONTAINER [CONTAINER...]

命令參數(OPTIONS):

  • -t, --time int 重啓前,等待的時間,單位秒(默認 10s),實則是關閉前等待的時間

 

命令演示

docker restart -t 1 342

容器信息查看

docker container inspect -h

做用:

  • 查看本地一個或多個容器的詳細信息

命令格式:

  • docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
  • 或者 docker inspect [OPTIONS] CONTAINER [CONTAINER...]

命令參數(OPTIONS):

  • -f, --format string 利用特定Go語言的format格式輸出結果
  • -s, --size 顯示總大小 

命令演示

docker container inspect -f "{{ json .NetworkSettings.Networks.bridge }}" 342

 

容器日誌信息 – docker logs  

docker logs -h

  

 

做用:

  • 查看容器的日誌信息

命令格式:

  • docker logs [OPTIONS] CONTAINER

命令參數(OPTIONS):

  • --details 顯示日誌的額外信息
  • -f, --follow 動態跟蹤顯示日誌信息
  • --since string 只顯示某事時間節點以後的
  • --tail string 顯示倒數的行數(默認所有)
  • -t, --timestamps 顯示timestamps時間
  • --until string 只顯示某事時間節點以前的

注意:

  • 容器日誌中記錄的是容器主進程的輸出STDOUT\STDERR

 docker logs 輸出的是COMMAND 中命令的執行信息

 命令演示

docker logs 342

 

容器重命名 – docker rename  

docker rename -h

 

做用:

  • 修改容器的名稱

命令格式:

  • docker rename CONTAINER NEW_NAME

命令參數(OPTIONS):

 

docker rename 342 centos

 

容器運行時操做

 容器鏈接 – docker attach

 

做用:

  • 將當前終端的STDIN、STDOUT、STDERR綁定到正在運行的容器的主進程上實現鏈接

命令格式:

  • docker attach [OPTIONS] CONTAINER

命令參數(OPTIONS):

  • --no-stdin 不綁定STDIN

退出後,當前的容器會變成 Exited 狀態 

 

命令演示

docker attach d77

 

 

 容器中執行新命令 – docker exec

 

docker exec -h

 

做用:

  • 在容器中運行一個命令

命令格式:

  • docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

命令參數(OPTIONS):

  • -d, --detach 後臺運行命令
  • -i, --interactive 即便沒鏈接容器,也將當前的STDIN綁定上
  • -t, --tty 分配一個虛擬終端
  • -w, --workdir string 指定在容器中的工做目錄
  • -e, --env list 設置容器中運行時的環境變量

 綁定的是容器中的子進程,因此執行完退出的是容器中的子進程,當前的容器並不會退出,這也是和 attach 的最主要的區別

 命令演示

 在後臺運行 一個命令,在把其給刪除

docker exec -dti 342 bash
docker exec  342 kill -9 100

 

 

 總結

 

相關文章
相關標籤/搜索