前言
本文解決的問題:
- 入門 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
檢視具體用法。
現在我們有了tag
是3.0
的redis
映象,接下來以此來建立並執行容器。
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 命令列工具。詳細用法在此過多解釋。
容器是一個輕量級的程序隔離環境,依賴主機作業系統的核心來執行。容器更像是被隔離的程序,包含應用程式及其所有依賴項,但沒有完整的作業系統例項。每個容器看起來像是一個獨立的系統,但實際上它只是主機作業系統上的一個隔離環境。這裡不做過多解釋,有興趣可自行了解。 ↩︎
從Docker Hub或其他映象倉庫拉取映象,也可以自己建立。 ↩︎