Docker的通俗理解和透過宿主機埠訪問Redis容器的例項

aigsy發表於2024-06-14

前言

本文解決的問題:

  • 入門 docker
  • 理解映象與容器、宿主機的概念
  • 理解 Docker 的常用指令
  • 建立 redis 容器,並透過宿主機埠訪問

預設讀者的知識背景:

  • 使用過 git
  • 初次使用 Docker

本文不會對 Docker 的定義作出解釋,不會涉及 Docker 的實現原理,旨在幫助讀者快速入門 docker,理解一些常用命令,能夠建立並使用容器。

關鍵概念

如果想要更好地使用 Docker,就需要理解 “映象“、”容器”和“宿主機”的概念,以及它們之間的關係。

映象與容器|image & container

映象與容器的關係,就像類與例項的關係。類是用來建立物件的藍圖,映象說明如何建立一個容器。
如果使用過雲伺服器,你可能還記得在建立雲伺服器時,需要選擇系統映象。與之類似,Docker 在建立容器時也需要選擇映象。

宿主機|Host Machine

宿主機 ,指執行 Docker 的物理機器或虛擬伺服器。例如,我在mac上使用docker,mac就是宿主機;在另一臺雲伺服器上執行docker,雲伺服器就是宿主機。

容器與宿主機

容器是宿主機上的隔離環境。
每個容器看起來都像是一個獨立的系統[1]。可以將 Docker 類比為一個本地的“騰訊雲”,我們可以透過它在本地建立多臺“雲伺服器”的例項——也就是一個個容器。
如果在不討論實現原理情況下,單從表現上來看,容器和宿主機可以看作是相互獨立的系統。

透過宿主機埠訪問 redis 容器的操作例項

接下來,在每一步開始前,會先介紹需要的主要 Docker 命令。透過引用官方解釋,幫著讀者更好地理解 Docker 命令。

1. 從Docker Hub上拉取映象

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Download an image from a registry

使用 docker pull --help檢視具體用法。

我們建立容器需要映象[2],通常直接拉取映象(預設從Docker Hub上拉取)。

拉取 redis 3.0 版本的映象:docker pull redis:3.0
如果不加:tag,則預設 pull 最新版本。

如果要檢查是否下載成功,使用docker images,會列出本地的映象列表。

2. 建立並執行容器

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Create and run a new container from an image

使用 docker run --help檢視具體用法。

現在我們有了tag3.0redis映象,接下來以此來建立並執行容器。
docker run --name my-redis redis:3.0 : 建立並執行一個名字是my-redis,源自redis:3.0映象的容器。
但是這個命令會讓程序保持在終端執行,我們通常還有其他的任務,所以需要讓容器在後臺執行。
這時就需要加一個-d引數,即docker run --name my-redis -d redis:3.0

官方解釋

-d, --detach     Run container in background and print container ID

前文提到了宿主機與容器的關係,從表面上看,是相互獨立的。
因此,如果不配置埠對映,便無法透過宿主機的埠直接訪問容器的埠。
這也導致新手常遇到的問題,例如,在docker上建立好的mysql資料庫,執行專案時卻連線不上。不過,在理解原理之後,這些問題也迎刃而解。

“容器埠對映”指的是,將宿主機的某個埠(例如80)對映到容器的某個埠上(例如8080),

docker run -d -p 80:8080 my_web_app

-p : 配置埠對映,宿主機埠->容器埠

現在,放上最終的建立並執行 redis 的命令,

docker run -d --name my-redis -p 6379:6379 redis

3. 連線容器內終端

我們的最終目的是操作容器中的目標程式。本質上是讓容器執行相關命令。

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Execute a command in a running container

使用 docker exec --help檢視具體用法。

這個命令可以理解為“向容器傳送一個指令”。例如,下面的程式碼讓容器列出當前工作目錄

% docker exec my-redis pwd

/data

通常,我們需要互動式地執行命令,

% docker exec -it my-redis bash
Options:
  -i, --interactive          Keep STDIN open even if not attached
  -t, --tty                  Allocate a pseudo-TTY

兩個引數可以寫在一起,即-it。表示進行互動式會話,並分配一個終端。

這條指令可以實現訪問容器內的終端。

4. 訪問 redis 命令列工具

在容器的終端內,輸入 redis-cli 即可訪問 redis 命令列工具。詳細用法在此過多解釋。


  1. 容器是一個輕量級的程序隔離環境,依賴主機作業系統的核心來執行。容器更像是被隔離的程序,包含應用程式及其所有依賴項,但沒有完整的作業系統例項。每個容器看起來像是一個獨立的系統,但實際上它只是主機作業系統上的一個隔離環境。這裡不做過多解釋,有興趣可自行了解。 ↩︎

  2. 從Docker Hub或其他映象倉庫拉取映象,也可以自己建立。 ↩︎

相關文章