Docker基本操作

hx_ky36發表於2024-07-31

一、容器

1.Docker 和虛擬機器,物理主機

作業系統的的組成

  • Bootloader:它負責裝置的啟動過程。

  • Shell:Shell是一種程式語言,它可以控制其他檔案,程序以及所有其他程式。

  • Kernel:它是作業系統的主要元件,管理記憶體,CPU和其他相關元件。

  • Desktop Environment:這是使用者通常與之互動的環境。

  • Graphical server(圖形伺服器):它是作業系統的子系統,用於在螢幕上顯示圖形

  • Applications: 這些是執行不同使用者任務(例如word,excel等)的程式集。

  • Daemons : 後臺服務提供商。

什麼是核心kernel

核心是作業系統的關鍵元件。 它藉助程序間通訊和系統呼叫,在硬體級別上充當應用程式和資料處理之間的橋樑。

每當將作業系統載入到記憶體中時,首先,將載入核心並將其保留在那裡,直到作業系統關閉。 核心負責處理低階任務,例如任務管理,記憶體管理,風險管理等。

核心的任務

  • 用於應用程式執行的流程管理。

  • 記憶體和I / O(輸入/輸出)管理。

  • 系統呼叫控制(核心的核心行為)。

  • 藉助裝置驅動程式進行裝置管理。

核心空間

核心處於提升的系統狀態,其中包括受保護的記憶體空間以及對裝置硬體的完全訪問許可權。 此係統狀態和記憶體空間統稱為核心空間。 在核心空間內,對硬體和系統服務的核心訪問進行管理,並作為服務提供給系統的其餘部分。

使用者空間

使用者空間或使用者域是在作業系統核心環境之外執行的程式碼,使用者空間定義為作業系統用來與核心連線的各種應用程式或程式或庫。

使用者的應用程式是在使用者空間中執行的,它們可以透過核心系統呼叫訪問計算機可用資源的一部分。 透過使用核心提供的核心服務,可以建立使用者級別的應用程式,例如遊戲或辦公軟體。

  • 傳統虛擬機器是虛擬出一個主機硬體,並且執行一個完整的作業系統 ,然後在這個系統上安裝和執行軟體

  • 容器內的應用直接執行在宿主機的核心之上,容器並沒有自己的核心,也不需要虛擬硬體,相當輕量化

  • 每個容器間是互相隔離,每個容器內都有一個屬於自己的獨立檔案系統,獨立的程序空間,網路空間,使用者空間等,所以在同一個宿主機上的多個容器之間彼此不會相互影響

二、Docker

1.什麼是docker

Docker是一個開源的應用容器引擎,基於go語言開發,用於執行容器裡的應用。

Docker也可以作為管理容器和映象的一種工具。

2.Docker和虛擬機器的區別

Docker容器 虛擬機器
特性 所有容器共享宿主機核心 每個虛擬機器都有獨立的作業系統和核心
隔離性 透過namespace實現資源隔離,透過cgroup實現限制資源的最大使用量 完全隔離,每個虛擬機器都有獨立的硬體資源
啟動速度 秒級啟動速度 分鐘級啟動速度
效能損耗 容器相當於宿主機的程序,效能幾乎沒有損耗 需要透過hypervisor虛擬機器管理程式對宿主機資源虛擬訪問,至少有20%~50%的效能損耗
系統支援量(單機) 單機容量能夠支援成百上千個容器 單機容量最多支援幾十個虛擬機器

3.Docker核心概念

Docker有三個核心概念:映象、容器和倉庫。

映象

映象是建立容器的基礎

映象是一個只讀的模板檔案,裡面包含執行容器中的應用程式所有需要的所有內容(應用程式檔案、配置檔案、執行庫檔案、依賴包等)

容器

容器是用映象執行的例項

容器可以被建立、啟動、停止、刪除,每個容器之間預設是相互隔離的。

倉庫

倉庫是用來儲存映象的地方

倉庫有公有倉庫和私有倉庫之分。

4.Linux中的namespace( 名稱空間)

六個名稱空間和隔離內容

namespace系統呼叫引數隔離內容
UTS CLONE_NEWUTS 主機名與域名
IPC CLONE_NEWWIPC 訊號量、訊息佇列和共享記憶體
PID CLONE_NEWPID 程序編號
NETWORK CLONE_NEWNET 網路裝置、網路棧、埠等
MOUNT CLONE_NEWNS 掛載點(檔案系統)
USER CLONE_NEWUSER 使用者和使用者組(3.8以後的核心才支援)

5.Namespace

一個宿主機執行了N個容器,多個容器共用一個 OS,必然帶來的以下問題:

  • 怎麼樣保證每個容器都有不同的檔案系統並且能互不影響?

  • 一個docker主程序內的各個容器都是其子程序,那麼如果實現同一個主程序下不同型別的子程序?各個容器子程序間能相互通訊(記憶體資料)嗎?

  • 每個容器怎麼解決IP及埠分配的問題?

  • 多個容器的主機名能一樣嗎?

  • 每個容器都要不要有root使用者?怎麼解決賬戶重名問題

namespace是Linux系統的底層概念,在核心層實現,即有一些不同型別的名稱空間被部署在核內,各個docker容器執行在同一個docker主程序並且共用同一個宿主機系統核心,各docker容器執行在宿主機的使用者空間,每個容器都要有類似於虛擬機器一樣的相互隔離的執行空間,但是容器技術是在一個程序內實現執行指定服務的執行環境,並且還可以保護宿主機核心不受其他程序的干擾和影響,如檔案系統空間、網路空間、程序空間等,目前主要透過以下技術實現容器執行空間的相互隔離:

隔離型別功能系統呼叫引數核心版本
MNT Namespace(mount) 提供磁碟掛載點和檔案系統的隔離能力 CLONE_NEWNS 2.4.19
IPC Namespace(Inter-Process Communication) 提供程序間通訊的隔離能力,包括訊號量,訊息佇列和共享記憶體 CLONE_NEWIPC 2.6.19
UTS Namespace(UNIXTimesharing System) 提供核心,主機名和域名隔離能力 CLONE_NEWUTS 2.6.19
PID Namespace(ProcessIdentification) 提供程序隔離能力 CLONE_NEWPID 2.6.24
Net Namespace(network) 提供網路隔離能力,包括網路裝置,網路棧,埠等 CLONE_NEWNET 2.6.29
User Namespace(user) 提供使用者隔離能力,包括使用者和組 CLONE_NEWUSER 3.8
TimeNamespace 提供時間隔離能力 CLONE_NEWTIME 5.6
syslogNamespace 提供syslog隔離能力 syslognamespace是由華為工程師RuiXiang(瑞翔)提出的,但沒有合併到linux核心中,後systemd在2020年2在2020年2 月實現了一個名為“journalnamespace”的類似功能
Controlgroup(cgroup)Namespace 提供程序所屬的控制組的身份隔離 Linux4.6

6.Control groups

如果不對一個容器做任何資源限制,則宿主機會允許其佔用無限大的記憶體空間,有時候會因為程式碼bug程式會一直申請記憶體,直到把宿主機記憶體佔完,為了避免此類的問題出現,宿主機有必要對容器進行資源分配限制,比如CPU、記憶體等

Cgroups 最主要的作用,就是限制一個程序組能夠使用的資源上限,包括CPU、記憶體、磁碟、網路頻寬等等。此外,還能夠對程序進行優先順序設定,資源的計量以及資源的控制(比如:將程序掛起和恢復等操作)

cgroups 具體實現

  • blkio: 塊裝置IO限制

  • cpu: 使用排程程式為 cgroup 任務提供 cpu 的訪問

  • cpuacct: 產生 cgroup 任務的 cpu 資源報告

  • cpuset: 如果是多核心的 cpu,這個子系統會為 cgroup 任務分配單獨的 cpu 和記憶體

  • devices: 允許或拒絕 cgroup 任務對裝置的訪問

  • freezer: 暫停和恢復 cgroup 任務

  • memory: 設定每個 cgroup 的記憶體限制以及產生記憶體資源報告

  • net_cls: 標記每個網路包以供 cgroup 方便使用

  • ns: 名稱空間子系統

  • perf_event: 增加了對每 group 的監測跟蹤的能力,可以監測屬於某個特定的 group 的所有執行緒以及執行在特定CPU上的執行緒

容器管理工具

Docker

相當於增強版的LXC,功能更為強大和易用,也是當前最主流的容器前端管理工具Docker 先啟動一個容器也需要一個外部模板,也稱為映象,docke的映象可以儲存在一個公共的地方共享使用,只要把映象下載下來就可以使用,最主要的是可以在映象基礎之上做自定義配置並且可以再把其提交為一個映象,一個映象可以被啟動為多個容器。

pouch

Pouch (小袋子)起源於 2011 年,並於2017年11月19日上午,在中國開源年會現場,阿里巴巴正式開源了基於 Apache 2.0 協議的容器技術 Pouch。Pouch 是一款輕量級的容器技術,擁有快速高效、可移植性高、資源佔用少等特性,主要幫助阿里更快的做到內部業務的交付,同時提高超大規模下資料中心的物理資源利用率

7.容器 runtime

runtime是真正執行容器的地方,因此為了執行不同的容器runtime需要和作業系統核心緊密合作相互在支援,以便為容器提供相應的執行環境

runtime 型別:

  • runc: 早期libcontainer是Docker公司控制的一個開源專案,OCI的成立後,Docker把libcontainer專案移交給了OCI組織,runC就是在libcontainer的基礎上進化而來,目前Docker預設的runtime,runc遵守OCI規範

低階容器執行時與高階容器執行時

  • High-Level:高階執行時提供基於API的遠端管理操作,客戶端可以透過高階別執行時管理容器的整個生命週期(建立、刪除、重啟、停止),高階別執行時並不真正直接執行容器,而是呼叫低階別執行時執行,比如dockerd、containerd都是高階別執行時。

  • Low-Level:接受高階別執行時的指令,按照相應的指令執行容器,因此低階別執行時真是執行容器的地方,例如runc

三、安裝Docker

1.安裝依賴包

yum install -y yum-utils device-mapper-persistent-data lvm2 
軟體作用
yum-utils: 提供了 yum-config-manager 工具
device mapper: 是Linux核心中支援邏輯卷管理的通用裝置對映機制,它為實現用於儲存資源管理的塊裝置驅動提供了一個高度模組化的核心架構。
device mapper 儲存驅動程式需要 device-mapper-persistent-data 和 lvm2。

2.設定阿里雲映象源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#下載yum倉庫

3.安裝docker

yum install -y docker-ce docker-ce-cli containerd.io
#  此處安裝最新版   如果不想安裝最新版


yum list --help
#可以使用幫助檢視
yum list --showduplicates docker-ce
#檢視所有的可用版本
yum -y install docker-ce-19.03.15-3.el7    docker-ce-cli-19.03.15-3.el7  containerd.io
軟體作用
docker-ce(Docker Community Edition) 這是 Docker 的社群版。Docker 社群版是免費的, 面向開發者、小型團隊和個人使用。它包含了 Docker Engine, 這是一個用於構建和執行容器的開源容器執行時。
docker-ce-cli(Docker Command Line Interface) 這是 Docker 的命令列工具, 它允許使用者與 Docker Engine 互動,執行容器相關的操作。 透過 Docker CLI,使用者可以構建、執行、管理和釋出容器。
containerd.io 它負責管理容器的生命週期,包括容器的建立、執行、暫停、繼續和銷燬等

四、docker操作

1.docker程式環境

環境配置檔案

/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker

Unit File

/usr/lib/systemd/system/docker.service

docker-ce 配置檔案

/etc/docker/daemon.json

Docker Registry配置檔案

/etc/containers/registries.conf

2.基礎操作

檢視docker 版本

docker version
Client: Docker Engine - Community
 Version:           26.1.4
 API version:       1.45
 Go version:        go1.21.11
 Git commit:        5650f9b
 Built:             Wed Jun  5 11:32:04 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.1.4
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       de5c9cf
  Built:            Wed Jun  5 11:31:02 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.33
  GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

檢視docker資訊

docker info 
Client: Docker Engine - Community
 Version:    26.1.4
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.14.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.27.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 2                     # 容器數量           
  Running: 0
  Paused: 0
  Stopped: 2
 Images: 4                       # 映象數量          
 Server Version: 26.1.4          # server 版本
 Storage Driver: overlay2        #docker 使用的是 overlay2 檔案驅動  
  Backing Filesystem: xfs        ## 宿主機上的底層檔案系統
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs          # Cgroups 驅動
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-693.el7.x86_64             # 宿主機的相關資訊
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 1.781GiB
 Name: localhost.localdomain
 ID: 39eee203-7863-4c80-a955-9aef575138c1
 Docker Root Dir: /var/lib/docker                    # docker 資料儲存目錄
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://6ijb8ubo.mirror.aliyuncs.com/                   # registry 地址
 Live Restore Enabled: false

docker 配置檔案

位置:/etc/docker/daemon.json

映象倉庫加速

#映象加速下載
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://n8lnq9bb.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

五、映象管理

命令含義例子
docker --help 檢視幫助
docker image --help 檢視映象幫助 docker image --help
docker search 映象名稱 搜尋相關映象 docker search nginx
docker pull 映象名稱:標籤 下載映象(不加標籤預設使用latest) docker pull nginx
docker images 檢視所有已有映象 docker images
docker images 映象名稱 檢視單個映象 docker images nginx
docker inspect 映象ID 檢視映象的詳細資訊 docker inspect 56b21e040954
docker tag 舊名稱 新名稱 修改映象的 標籤 docker tag nginx:latest lucky/nginx:1.25

搜尋映象

官方網站進行映象的搜尋

官網: http://hub.docker.com

1.搜尋映象

#格式
docker search 關鍵字
docker search nginx

#NAME: 列出了搜尋結果中各個映象的名稱。
#DESCRIPTION: 描述了每個映象的簡要說明或介紹。
#STARS: 顯示了每個映象的星級評分或受歡迎程度。星級數量越高表示該映象的受歡迎程度越高。
#OFFICIAL: 表示是否是官方構建的映象,OK表示是官方構建的。
#AUTOMATED: 表示是否是自動構建的映象,這個欄位沒有值表示不是自動構建的。

2.獲取映象

#格式
docker pull 倉庫名稱[:標籤]
#如果下載映象時不指定標籤,則預設會下載倉庫中最新版本的映象,即選擇標籤為 latest 標籤。

3.檢視映象資訊

映象下載後存放在 /var/lib/docker
Docker 相關的本地資源存放在 /var/lib/docker/ 目錄下,其中 containers 目錄存放容器資訊,image 目錄存放映象資訊,overlay2 目錄下存放具體的映象底層檔案。

檢視下載的映象檔案資訊

cat /var/lib/docker/image/overlay2/repositories.json

檢視下載到本地的所有映象

docker images

獲取映象詳細資訊

根據映象的唯一標識 ID 號(IMAGE ID)獲取。

#格式
docker inspect 映象ID號

●lowerdir是映象層,目錄或者檔案是隻讀的,其實就是rootfs,image layer可以分很多層,所以對應的lowerdir是可以有多個目錄

●upperdir是在lowerdir之上的容器層,這層是可讀可寫的,在啟動一個容器時候會進行建立,所有的對容器資料更改都發生在這裡層

●MergedDir是表現層,是容器的掛載點

為本地的映象新增新的標籤

#格式
docker tag 名稱:[標籤] 新名稱:[新標籤]

刪除映象

注意:如果該映象已經被容器使用,正確的做法是先刪除依賴該映象的所有容器,再去刪除映象

#格式

#方式一
docker rmi 倉庫名稱:標籤            #當一個映象有多個標籤時,只是刪除其中指定的標籤

#方式二
docker rmi 映象ID號              #會徹底刪除該映象
#舉個例子,刪除標籤web
docker rmi nginx:latest

4.存出和載入映象

儲存映象

將映象儲存為本地檔案

#格式
docker save -o 儲存檔名 儲存的映象
docker save -o /data/nginx nginx:latest            #存出映象命名為nginx存在當前目錄下

載入映象

將映象檔案匯入到映象庫中

#格式
#方式一
docker load < 存出的檔案

#方式二
docker load -i 存出的檔案
docker load < /data/nginx

上傳映象

將映象上傳到阿里倉庫,需要註冊賬號

https://cr.console.aliyun.com/cn-hangzhou/instances

六、Docker 容器操作

1.建立並啟動容器 -----docker run命令

幫助: man docker-run

可以直接執行 docker run 命令, 等同於先執行 docker create 命令,再執行 docker start 命令。
注意:容器是一個與其中執行的 shell 命令/程序共存亡的終端,命令/程序執行容器執行, 命令/程序結束容器退出。

#基本格式
docker run -d [選項] 映象名:標籤 [容器啟動命令]
              
#常用選項
-d:以後臺模式執行容器。
-i:--interactive: 這個選項使得容器的標準輸入保持開啟狀態
-t:--tty: 這個選項分配一個偽終端(pseudo-TTY)給容器。
-h:設定容器內的名稱
--name:為容器指定一個名稱。 -p:將容器的埠對映到主機上的特定埠。 -P:隨機埠對映 -v:將主機上的目錄或檔案掛載到容器中。 -e:設定容器的環境變數。 --rm:容器停止後自動刪除。 --network:指定容器要使用的網路。 --link:將容器連結到另一個容器。
同時按三個鍵,ctrl+p+q  容器後臺執行

2.設定容器退出後啟動規則

policy說明
no 預設的重啟策略,不管容器是正常退出還是異常退出,總是不重啟容器。
on-failure[:max-retries] 只在容器異常退出時重啟容器。可選的 max-retries 引數指定重試的最大次數。
always 不管容器是正常退出還是異常退出,總是重啟容器
unless-stopped 總是重啟容器,但不考慮docker服務端啟動時就已經退出的容器
docker run -d --restart always httpd

在使用 Docker 中的 --restart=always 選項時,容器將會在任何情況下都嘗試自動重啟,包括以下情況:

  1. 容器異常退出(非正常退出): 如果容器的主程序以非零狀態退出(即錯誤退出),Docker 將自動嘗試重新啟動容器。

  2. Docker 守護程序重啟: 當 Docker 守護程序重啟(例如伺服器重啟或 Docker 服務重新啟動),所有具有 --restart=always 選項的容器也將被重新啟動。

  3. 手動停止容器: 即使手動使用 docker stop 命令停止了容器,使用 --restart=always 的容器也會被 Docker 自動重新啟動。

雖然 --restart=always 選項會嘗試在大多數情況下重新啟動容器,但有一些特定情況下容器可能不會被重啟,例如:

  • 手動刪除容器: 如果你手動使用 docker rm 命令刪除了容器,那麼 --restart=always 選項將不再適用,因為容器已經從 Docker 中移除。

  • 宿主機系統重啟或關機: 當宿主機作業系統因為重啟或關機而停止時,Docker 服務及其管理的容器也會停止,此時 --restart=always 的設定無法保證容器能夠立即重啟,需要等待 Docker 服務重新啟動後才能生效。

3.啟動容器時指定名稱

容器在啟動的時候都會被分配到一個隨機id和一個隨機名字,也可以自定義設定名字

注意每個容器的名稱要唯一

docker  run -it --name hx httpd

4.設定容器內的名稱

docker  run -it -h 0730 centos:7 

5.測試容器,退出容器刪除

docker run --rm -it centos:7 bash 

6.檢視容器的狀態

命令作用
docker ps 檢視容器的狀態(看不到退出的,可以看到執行的)
docker ps -a 檢視容器的狀態 包括退出的 , 和執行的
docker ps -a -s 檢視容器的狀態 -s 檢視容器的大小
docker ps -l 檢視最近的一個容器狀態

顯示當前存在容器

docker ps [OPTIONS]
docker container ls [OPTIONS]
選項:  
-a, --all             Show all containers (default shows just running)
-q, --quiet           Only display numeric IDs
-s, --size            Display total file sizes
-f, --filter filter   Filter output based on conditions provided
-l, --latest          Show the latest created container (includes all states)
-n, --last int        Show n last created containers (includes all states) 
(default -1)
#顯示退出狀態的容器  #-f的大部分選項只能看啟動的容器
docker ps -f status=exited

檢視容器內的程序

docker top cb

檢視容器資源使用情況

docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Options:
-a, --all             Show all containers (default shows just running)
    --format string   Pretty-print images using a Go template
    --no-stream       Disable streaming stats and only pull the first result
    --no-trunc       Do not truncate output
#檢視單個容器
docker stats cbd84392fac4

#檢視所有容器,並且只執行一次
docker stats --no-stream

檢視容器的詳細資訊

#檢視容器
docker ps -q
#檢視映象
docker images 

檢視容器的日誌

docker logs [OPTIONS] CONTAINER
選項:
--details       Show extra details provided to logs
-f, --follow     Follow log output
--since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or 
relative (e.g. 42m for   42 minutes)
--tail string   Number of lines to show from the end of the logs (default 
"all")
-t, --timestamps     Show timestamps
--until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or 
relative (e.g. 42m     for2 minutes)

7.刪除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker container rm [OPTIONS] CONTAINER [CONTAINER...]

#選項:  
-f, --force     Force the removal of a running container (uses SIGKILL)

-v, --volumes   Remove the volumes associated with the container
#刪除停止的容器
docker container prune [OPTIONS]
Options:
      --filter filter   Provide filter values (e.g. 'until=<timestamp>')
  -f, --force           Do not prompt for confirmation

8.容器開啟停止

docker start|stop|restart|pause|unpause 容器ID

9.進入容器

attach

docker attach 容器名,attach 類似於vnc,操作會在同一個容器的多個會話介面同步顯示,所有使用此方式進入容器的操作都是同步顯示的,且使用exit退出後容器自動關閉不推薦使用,需要進入到有shell環境的容器

例子:

docker  attach   b92e987b5d15

exec

在執行中的容器啟動新程序,可以執行單次命令,以及進入容器測試環境使用此方式,使用exit退出,但容器還在執行此為推薦方式

格式:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常用選項:  
-d, --detach               Detached mode: run command in the background
-e, --env list             Set environment variables
-i, --interactive         Keep STDIN open even if not attached
-t, --tty                 Allocate a pseudo-TTY
#常見用法
docker exec -it 容器ID sh|bash

例子: 一次性操作

[root@ubuntu2204 ~]#docker run -idt  --name c7-1  centos:7 
4a965b518c1c64b2958fa574b48b39406e0cee808f171187a1a7a4b28b98c417

[root@ubuntu2204 ~]#docker exec c7-1 cat /etc/passwd
root:x:0:0:root:/root:/bin/bash

例子: 持久操作

[root@ubuntu2204 ~]#docker exec -it c7-1 sh
sh-4.2# 
sh-4.2# 
sh-4.2# 

10.暴露容器的埠

暴露隨機埠

容器啟動後,預設處於預定義的NAT網路中,所以外部網路的主機無法直接訪問容器中網路服務docker run -P 可以將事先容器預定義的所有埠對映宿主機的網路卡的隨機埠,預設從32768開始使用隨機埠 時,當停止容器後再啟動可能會導致埠發生變化

-P , --publish-all= true | false預設為false

#示例:
docker run -P nginx:latest  #對映容器所有暴露埠至隨機本地埠

docker port 可以檢視容器的埠對映關係

#格式
docker port CONTAINER [PRIVATE_PORT[/PROTO]]

指定埠對映

docker run -p 可以將容器的預定義的指定埠對映到宿主機的相應埠

注意: 多個容器對映到宿主機的埠不能衝突,但容器內使用的埠可以相同

方式1: 容器80埠對映宿主機本地隨機埠

docker run  -p 80 --name nginx-test-port1 nginx

方式2: 容器80埠對映到宿主機本地埠81

docker run  -p 81:80 --name nginx-test-port2 nginx

方式3: 宿主機本地IP:宿主機本地埠:容器埠

docker run  -p 10.0.0.100:82:80 --name nginx-test-port3 nginx

方式4: 宿主機本地IP:宿主機本地隨機埠:容器埠,預設從32768開始

docker run -p 10.0.0.100::80 --name nginx-test-port4 nginx

方式5: 宿主機本機ip:宿主機本地埠:容器埠/協議,預設為tcp協議

docker run  -p 10.0.0.100:83:80/udp --name nginx-test-port5 nginx

方式6: 一次性對映多個埠+協議

docker run  -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name nginx-test-port6 nginx

11.容器內部的hosts 檔案(域名解析)

容器會自動將容器的ID加入自已的/etc/hosts檔案中,並解析成容器的IP

例子: 一次性檢視主機名

docker run --rm alpine cat /etc/hosts

例子: 進入到容器中 檢視主機名

docker run -d alpine tail -f /etc/hosts
docker exec -it 1cb sh

/ # cat /etc/hosts

例子: 人為的修改 hosts 檔案 --add-host 新增指定資訊

docker run -it --rm --name a1 --add-host www.hx.com:6.6.6.6 --add-host www.ky36.com:9.9.9.9 alpine

12.指定DNS(伺服器)

容器的dns伺服器,預設採用宿主機的dns 地址,可以用下面方式指定其它的DNS地址

將dns地址配置在宿主機

  • 在容器啟動時加選項 --dns=x.x.x.x

  • 在/etc/docker/daemon.json 檔案中指定

例子: 指定容器的dns

docker run -it --rm  --dns 1.1.1.1 --dns 2.2.2.2 centos bash

例子: 配置檔案指定DNS和搜尋domain名

vim /etc/docker/daemon.json 

{
        "registry-mirrors": ["https://n8lnq9bb.mirror.aliyuncs.com"],
        "dns" : [ "114.114.114.114", "1.1.1.1" ],
        "dns-search": [ "kcg.com" , "kgc.org"  ]
}
systemctl restart  docker
docker run -it --rm  centos:7 bash
cat /etc/resolv.conf 

相關文章