Docker基礎修煉3--Docker容器及常用命令

来源:https://www.cnblogs.com/heimatengyun/archive/2020/05/14/12886651.html
-Advertisement-
Play Games

前文講解了Docker鏡像的原理和常用命令,本文繼續通過官方的Apache鏡像演示Docker容器相關的常用操作及命令。 ...


前文講解了Docker鏡像的原理和常用命令,本文繼續通過官方的Apache鏡像演示Docker容器相關的常用操作及命令。

我之前的Linux入門系列文章中“linux入門系列18--web服務之apache服務1”,演示了在CentOS7下安裝和使用Apache服務,本次我們仍然採用官方的Apache鏡像來進行演示,通過這個案例,大家自行對比這兩種方式的不同,從而更加深刻理解Docke能幹什麼,以及Docker帶來的好處。

接下來我們就來演示下容器如何創建、如何停止、如何刪除等操作。

一、Docker容器簡介

容器是Docker中的另外一個核心概念,容器是鏡像的一個運行實例。

Docker鏡像是靜態的,只有從Docker鏡像創建容器並運行起來,容器內的程式會運行,從而完成特定的功能。

我們要完成業務功能的程式就是在容器中運行。鏡像本身是靜態的只讀文件,而容器帶有運行時所需的可寫文件層,同時容器內的應用進程處於運行狀態。

通過下邊的演示,將會理解的更加深刻。

二、Docker容器常用命令

2.1 apache鏡像準備

我們後續的演示是基於Docker Hub上官方提供的apache鏡像進行。

鏡像名稱為httpd,該鏡像並不包含php的環境只能運行靜態的HTML頁面,因此如果你是想運行php的動態網站則需要選擇PHP鏡像,而本文只是為了演示容器的相關操作,因此採用靜態頁面即可。

[root@docker ~]# docker pull httpd:2.4
2.4: Pulling from library/httpd
68ced04f60ab: Pull complete 
35d35f1e0dc9: Pull complete 
8a918bf0ae55: Pull complete 
d7b9f2dbc195: Pull complete 
d56c468bde81: Pull complete 
Digest: sha256:946c54069130dbf136903fe658fe7d113bd8db8004de31282e20b262a3e106fb
Status: Downloaded newer image for httpd:2.4
docker.io/library/httpd:2.4
[root@docker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               2.4                 c5a012f9cf45        2 days ago          165MB

下載完成後我們可以看到httpd鏡像大小為165M,裡邊究竟包含了什麼內容呢?文章最後我們再來仔細分析一下。

2.2 創建容器並後臺運行

鏡像下載完成後,就需要通過docker run命令創建容器。

語法:

docker run [選項] 鏡像名稱 [命令] [參數]

選項很多,可以執行通過幫助命令進行查看,以下列出最常用的幾個選項

選項 作用
--name 指定容器的名稱
-d 容器後臺運行,不在控制台列印消息
-i 即--interactive,互動式運行
-t 分配偽終端
-p 指定宿主機與容器埠的映射,宿主機埠:容器內埠
-P 指定宿主機與容器埠映射,宿主機埠隨機指定

其中-it參數和-d參數一般不同時使用,並且代表了兩種啟動容器的不同方式:互動式啟動容器守護式啟動容器

所謂互動式啟動就是在容器啟動後直接進入容器,並會自動分配一個偽終端,可以在容器內執行各種命令;而守護式啟動容器則是容器啟動後無需進入容器,容器在後臺運行,默默的提供服務。

至於如何選擇使用哪一種方式就看是否需要進入容器,如果要進入就選擇互動式,如果只是希望容器後臺運行提供服務那就選擇守護式

接下來通過-d參數,以守護進程方式創建基於httpd鏡像的容器並後臺運行

[root@docker ~]# docker run -d --name mywebsit -p 8888:80 httpd:2.4
783b46f5cddcc3ea919329a99f83a783da98bce4abce05ccc9b3f27fda859b09
[root@docker ~]# docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED   STATUS   PORTS   NAMES
783b46f5cddc  httpd:2.4   "httpd-foreground"  6 seconds ago   Up 4 seconds        0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]

只需要做這一步操作,基於Apache的web環境就搭建好了,此時在CentOS7上就可以通過瀏覽器訪問剛纔搭建的基於apahce的網站了。

在這裡插入圖片描述

如果配置了防火牆,也可以在宿主機進行訪問。

在這裡插入圖片描述

接下來就可以修改容器內網站目錄里的數據,替換為自己的web頁面即可。輕輕鬆松就搭建了一個apache的web靜態網站,這是不是很方便呢?甚至都無須配置任何環境。遷移也非常方便,比如想換到另外一臺主機運行該網站,也只需要下載該鏡像,然後run起來即可。

這就是docker的強大之處,還有很多更強大的功能,後續慢慢演示。

在這裡插入圖片描述

說明一下我本地的環境,大家一定要理清楚物理機、虛擬機、容器之間的關係。我本地物理機系統是win10,在其上裝了VMware虛擬機,在虛擬機中創建了一個Centos7的實例,然後在其中安裝Docker,並運行mywebsite容器。因為我本地沒有裝Centos7,所以在虛擬機中虛擬一個來進行演示,當然你也可以直接在windows上裝docker或直接在本地的centos上安裝docker。

外部訪問是訪問在run容器是指定映射到的Centos7的宿主機埠8888,而非mywebsite容器的80埠。

特別註意:此處之所以採用-d在後臺以守護進程的方式運行容器,原因就是當一個容器沒有前臺進程執行的時候,創建容器後立馬就會停止。所以你可以用互動式的方式創建一個容器試試,docker run -it --name mywebsit1 -p 8888:80 httpd:2.4 ,創建後你用docker ps命令查看根本看不到容器,用docker ps -a命令查看,你就會發現容器創建後,短暫啟動後立馬就停止了,就是這個原因。

2.3 查看容器命令

查看本地有哪些正在運行的容器,或者是曾經創建過的容器可以通過docker ps命令

語法

docker ps [選項]

常用參數

參數 作用
-a --all,查看所有容器,預設情況下只顯示正在運行的容器
-l --latest,查看最近創建的容器
-n 顯示最後創建的n個容器
--no-trunc 不截斷顯示

案例:

(1)查看正在運行的容器

[root@docker ~]# docker ps
CONTAINER ID    IMAGE     COMMAND     CREATED  STATUS   PORTS    NAMES
783b46f5cddc        httpd:2.4           "httpd-foreground"   4 hours ago         Up 4 hours          0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]# 

可以看到只有剛纔創建的mywebsit容器在運行。

2.4 在容器外部查看容器信息

2.4.1 查看容器日誌命令

語法

docker logs [選項] 容器名或id

常用參數

參數 作用
-f 動態跟蹤列印日誌信息,一旦有新日誌會繼續列印
-t 在每行日誌前面列印出時間
--tail 指定顯示的行數

案例

(1)查看mywebsit的日誌,只顯示2行

[root@docker ~]# docker logs -t --tail 2 mywebsit
2020-02-29T03:09:57.654372509Z 192.168.78.1 - - [29/Feb/2020:03:09:57 +0000] "-" 408 -
2020-02-29T03:09:57.854284777Z 192.168.78.1 - - [29/Feb/2020:03:09:57 +0000] "-" 408 -
[root@docker ~]# 
2.4.2 查看容器內進程命令

語法

docker top

案例

(1)查看mywebsit內部的進程

[root@docker ~]# docker top mywebsit
UID      PID     PPID    C     STIME     TTY       TIME      CMD
root     3673    3655    0     10:29     pts/0     00:00:01  httpd -DFOREGROUND
bin      3708    3673    0     10:29     pts/0     00:00:00  httpd -DFOREGROUND
...省略部分輸出

此命令類似於Linux下的top命令。

2.4.3 查看容器內部細節

語法

docker inspect 容器名稱或id

案例

(1)查看mywebsit容器內部信息

[root@docker ~]# docker inspect mywebsit
...省略輸出

由於輸出內容太多就不粘貼了。

執行命令後將得到一個詳細描述容器信息的JSON字元串對象,該對象中包含了容器的詳細信息,包含容器埠映射、掛載信息、捲信息、網路ip等信息。

2.5 退出容器命令

如果進入了容器,退出方式有如下兩種:

exit命令

按快捷鍵:ctrl+p+q

2.6 進入容器內部與之交互

進入正在運行的容器並以命令行交互

2.6.1 docker exec命令

採用docker exec命令可以進入容器或不進入容器直接執行命令

語法

docker exec [選項] 容器名或id 命令 [參數...]

選項與docker run命令類似,也有-itd等參數。

用此命令進入容器後,用exit命令或快捷鍵退出容器後,容器不會停止。

案例

(1)不進入容器直接執行命令

[root@docker ~]# docker exec -it mywebsit pwd
/usr/local/apache2
[root@docker ~]# 

該命令的含義查看mywebsit容器內的當前目錄,可以看到命令執行結束後我們沒沒有進入到容器內部。

pwd是linux的命令,但此處為何能執行呢?原因是httpd鏡像是由debian基鏡像繼承而來,大家知道debian也是linux的一個發行版本,因此該容器就有debian的功能。簡單說就是你可以認為mywebsit容器就是跑在docker上的一個小linux系統。

(2)進入容器執行命令

[root@docker ~]# docker exec -it mywebsit /bin/bash
root@783b46f5cddc:/usr/local/apache2# pwd
/usr/local/apache2
root@783b46f5cddc:/usr/local/apache2# exit
exit
[root@docker ~]# 

這個過程的作用給前面的案例是一樣的,只不過這裡是進入到容器內部,然後列印當前目錄,然後在退出容器,返回到centos7宿主機。

通過這兩個案例的對比,應該很清楚他們的區別了吧。

2.6.2 docker attach命令

語法

docker attach [選項] 容器名或id

用此命令重新進入容器,進入容器後如果用exit命令退出,則容器會停止。

2.7 容器與宿主機之間數據拷貝

docker cp命令可以實現宿主機與主機之間的數據拷貝,即使是容器停止的情況下也可以執行拷貝操作。

語法

docker cp 容器id:容器內路徑 宿主機路徑

案例

(1)修改容器內的首頁內容

首先:httpd鏡像網站的目錄為:/usr/local/apache2/htdocs/index.html

其次:由於httpd鏡像基於debian製作,內部並沒有包含vi/vim等工具。

再次:正好可以用docker cp演示宿主機與容器之間文件的相互拷貝。

因此我們將網頁文件拷貝到宿主機然後修改後在拷貝回容器網站目錄下,已達到修改首頁的目的。(在後續的講解中也可以通過數據捲的方式將網站目錄映射到宿主機上實現共用和修改)

[root@docker ~]# docker cp mywebsit:/usr/local/apache2/htdocs/index.html /
[root@docker ~]# ll /index.html 
-rw-r--r-- 1 root root 45 Jun 12  2007 /index.html
[root@docker ~]# echo "my websit is updating">/index.html
[root@docker ~]# cat /index.html 
my websit is updating
[root@docker ~]# docker cp /index.html mywebsit:/usr/local/apache2/htdocs/index.html
[root@docker ~]# 

再次在瀏覽器中查看網頁,就會發現已經被修改過了。

2.8 停止容器命令

停止容器可以通過stop和kill兩個命令

kill是強制停止容器,stop會稍微過一小會停止容器,二者都可以指定容器停止前等待的時間。

docker stop|kill 容器id或容器名

案例

(1)停止容器

[root@docker ~]# docker ps
CONTAINER ID   IMAGE   COMMAND   CREATED   STATUS  PORTS   NAMES
783b46f5cddc   httpd:2.4    "httpd-foreground"   6 hours ago  Up 21 minutes  0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]# docker stop mywebsit 
mywebsit
[root@docker ~]# docker ps
CONTAINER ID  IMAGE   COMMAND   CREATED   STATUS   PORTS  NAMES
[root@docker ~]# 

2.9 啟動容器命令

可以通過start或restart啟動或重啟容器

語法

docker start|restart 容器id或容器名

案例

(1)啟動停止的容器

[root@docker ~]# docker ps -a
CONTAINER ID  IMAGE  COMMAND   CREATED    STATUS   PORTS    NAMES
783b46f5cddc        httpd:2.4           "httpd-foreground"   6 hours ago         Exited (0) 2 minutes ago                       mywebsit
[root@docker ~]# docker start mywebsit 
mywebsit
[root@docker ~]# docker ps
CONTAINER ID    IMAGE   COMMAND   CREATED    STATUS   PORTS   NAMES
783b46f5cddc        httpd:2.4           "httpd-foreground"   6 hours ago         Up 1 second         0.0.0.0:8888->80/tcp   mywebsit
[root@docker ~]#  

可以看到剛停止的mywebsit容器為exited狀態,重啟後又重新運行起來。

2.10 刪除容器命令

語法

docker rm [選項] 容器名或id

常用選項

選項 作用
-f --forece,強制刪除,當容器在運行時只能強制刪除
-v --vomumes,刪除數據捲

案例

(1)刪除正在運行容器

[root@docker ~]# docker rm mywebsit
Error response from daemon: You cannot remove a running container 783b46f5cddcc3ea919329a99f83a783da98bce4abce05ccc9b3f27fda859b09. Stop the container before attempting removal or force remove
[root@docker ~]# docker rm -f mywebsit
mywebsit
[root@docker ~]# docker ps
CONTAINER ID   IMAGE   COMMAND   CREATED  STATUS   PORTS  NAMES
[root@docker ~]# 

可以看到當容器運行時不能刪除,需要添加-f參數強制刪除。

(2)強制刪除所有容器

慎用,僅供演示,他會刪除所有的容器,包括正在運行的和已經停止的。

[root@docker ~]# docker rm -f $(docker ps -aq) 
3d228a470c53
[root@docker ~]# docker ps 
CONTAINER ID   IMAGE    COMMAND    CREATED    STATUS   PORTS   NAMES
[root@docker ~]#

上邊這個刪除語句也可以寫為:docker ps -a -q | xargs docker rm

三、容器內部窺探

以上基於httpd鏡像創建了容器進行各種容器操作的演示,接下來我們在通過centos鏡像,研究下鏡像內部的結構和原理

[root@docker ~]# docker images
REPOSITORY    TAG       IMAGE ID        CREATED           SIZE
centos        latest    470671670cac    6 weeks ago       237MB

如果你本地還沒有centos進行,先用docker pull命令下載到本地,接下來我們用它來創建一個名為mycentos的容器,然後進入容器查看結構

[root@docker ~]# docker run -it --name mycentos centos
[root@bda9ff3abfd9 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@bda9ff3abfd9 /]# pwd
/
[root@bda9ff3abfd9 /]# cat /etc/redhat-release 
CentOS Linux release 8.1.1911 (Core) 
[root@bda9ff3abfd9 /]# 

進入容器後,我們可以看到,其實它就是運行著的一個centos系統,裡邊可以執行各種centos命令,也可以查看到內核版本。

如果你想象力在擴展一下,那很容易想到,鏡像其實就是把各種操作系統環境以及我們運行所需要的軟體包打包在一起,然後上傳到倉庫中,需要的時候直接pull下來,在運行run命令創建容器即可。這也正是我們前二篇文章反覆提到的內容,如果現在在返回去看之前的文章,應該會有更深刻的理解。

本文演示完容器相關操作命令後,docker三要素就還差倉庫了,下一篇講解倉庫相關理論和操作,敬請期待。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 K3S概述 1.1 K3S介紹 K3S是一個輕量級Kubernetes發行版。易於安裝,記憶體消耗低,所有二進位文件不到40mb。 適用於: 邊緣計算-Edge 物聯網-IoT CI ARM 1.2 K3S特點 k3s是完全相容的Kubernetes發行版,有以下更改: 移除過時的功能、Alpha ...
  • Zabbix監控TCP連接狀態(命令實現)適用centos7 1.添加自定義key配置文件 cat /etc/zabbix/zabbix_agentd.d/tcp_status.conf UserParameter=tcp_status[*],ss -ant |grep -c $1 ss直接讀/pr ...
  • 一 Helm概述 1.1 Helm介紹 Helm 是 Kubernetes 的軟體包管理工具。包管理器類似 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一樣,能快速查找、下載和安裝軟體包。通常每個包稱為一個Chart,一個Chart是一個目錄(一般情況下會 ...
  • 前面我們看了Redis用到的主要數據結構,如簡單動態字元串(SDS)、雙向鏈表、字典、壓縮列表、整數集合等。 但是Redis並沒有直接使用這些數據結構來實現鍵值對,而是基於這些數據結構創建了一個對象系統,這個系統包括字元串對象、列表對象、哈希對象、集合對象、有序集合對象,除此之外,redis的對象系 ...
  • 1146 Table 'performance_schema.session_variables' doesn't exist 一 問題出現場景 1 在Flask使用SQLAlchemy操作mysql的時候會出現 2 使用Navicat連接資料庫會出現 附:連接Navicat成功的要點 (1) 需要 ...
  • 記憶體的讀寫速度遠大於磁碟的讀寫速度,減少磁碟讀寫,可以作為重點優化方向。 資料庫內部最重要的就是存儲結構,存儲結構必然涉及到數據結構知識。比如用到了常用的哈希圖、樹。 MYSQL資料庫常用兩種引擎,InnoDB、MyISAM,可以直接對錶指定資料庫引擎。 MYSQL索引是一種數據結構,幫助更快的查詢 ...
  • MySQL面試題-基礎 1、SQL中文全稱 結構化查詢語言2、SQL語句分類 (1)數據查詢語言DQL包括select欄位名from表名where條件 (2)數據操縱語言DML包括Insertupdatedelete (3)數據定義語言DDL包括createalterdroptruncate (4) ...
  • 大概兩年前寫過同樣標題的一篇文章,對於這個問題感興趣的人不少,後臺收到不少同學的提問,所以準備細緻地解答一下這些問題,希望能解決掉大家90%的疑問。下次再看到相關的提問我會理直氣壯地把這篇文章的鏈接甩你臉上。但是可能又會有同學有疑問了,那剩下10%的疑問怎麼辦?可以關註我的公眾號【老蒙大數據】。 開 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...