Docker 實踐及命令梳理

AaronLin發表於2021-08-11

文件

Docker Reference Documentation

Docker 從入門到實踐 【中文】

安裝

安裝 Docker,設定開機啟動,然後配置阿里雲映象加速

1. 安裝 Docker

Docker 官方安裝

CentOS 官方安裝教程,直接安裝速度相對慢,推薦使用 使用指令碼自動安裝 Docker

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
# 開機啟動 docker
sudo systemctl enable docker
# 啟動 docker
sudo systemctl start docker

2. 阿里雲映象加速

注意!registry-mirrors 需要替換成自己的 阿里雲映象加速器地址,通過點選地址獲取

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["這裡替換成自己的阿里雲映象加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker CLI

CLI 是 Command-Line Interface (命令列介面)的縮寫
命令詳情可以參考官方文件:Docker Reference Documentation

這裡通過幾個場景,把 Docker 先用起來

場景0:Tomcat

# 輸入 docker 回車,docker 的命令會被羅列出來,便於查詢
docker

# 查詢有那些 MySQL 映象
docker search tomcat

相對於直接search,使用搜尋 Docker Hub 更方便

搜尋 Tomcat

可以看到相關的映象介紹、使用幫助、歷史版本:Tomcat

可以按照文件中的 "How to use this image" 的提示來執行映象

# 拉取 tomcat 映象
docker pull tomcat:8.0-jre8

# 檢視映象列表,可以看到 tomcat 映象,該命令等特於:docker image ls
docker images

# 執行tomcat 映象
docker run tomcat:8.0-jre8

# 前臺執行,會輸出 tomcat 日誌
# 按 Ctrl + C 停止


# 新增 -d 後臺執行引數
docker run -d tomcat:8.0-jre8
# 檢視容器列表,可以檢視到容器的id、映象(IMAGE)、狀態(STATUS)、網路埠(PROT)、容器名稱(NAME)等資訊
docker ps
# 檢視 tomcat 日誌,這裡的 `clever_swanson` 為容器id或名稱
docker logs clever_swanson
# 檢視容器內部程式資訊
docker top clever_swanson

# 進入容器
# i 和 t 引數可以讓我們以偽終端的方式進入容器
# bash 是所使用 shell
docker exec -it clever_swanson bash
# 在容器內可以使用 Linux 命令

# 退出容器,回到宿主機(宿主機就是安裝 Docker 的這臺機器)
exit

# 不需要容器了,可以停止容器
docker stop clever_swanson
# 檢視容器列表,tomcat 就隱藏了
docker ps
# -a 引數檢視全部所有容器的列表(包括停止的 tomcat)
docker ps -a

# 啟動已經停止的容器
docker start clever_swanson

# 刪除容器,如果容器還在執行需要加 -f 引數
docker rm clever_swanson
docker rm -f clever_swanson

# 刪除了容器,就可以把映象也刪除了,如果有容器還是該映象需要加 -f 引數
docker rmi tomcat:8.0-jre8
docker rmi -f tomcat:8.0-jre8

場景1:Tomcat

只是將 Tomcat 容器 run 起來,還是無法滿足使用
還需要將容器網路埠對映到宿主機才可以使得外部可以訪問容器內部服務
為了方便還需要把 Tomcat 的資料目錄和配置目錄掛載到宿主機,方便直接進行編輯

可參考官方文件:Tomcat

# 部署 Tomcat
# run 容器時,本地不存在對應映象,會自動 pull
# -p 將容器內的網路埠對映到宿主機 ,8080:8080 前面為宿主機,後面為容器
# --name 指定容器名稱
docker run -p 8080:8080 -d --name mytomcat tomcat:8.0-jre8

# 可以通過 docker 的子命令對 容器進行操作,比如:ps,exec,top,stop

# 這個容器已經佔用了宿主機的 8080 埠,為了後續的 Tomcat 可以繫結到宿主機的 8080 埠,所以將 這個容器 stop
docker stop mytomcat

# 通過資料卷的方式 將容器內的資料對映到宿主機
# 語法:- v 資料卷名稱:容器內目錄
# Tomcat 部署的 web應用目錄:/usr/local/tomcat/webapps
# 配置檔案:/usr/local/tomcat/conf
docker run -p 8080:8080 -v apps:/usr/local/tomcat/webapps -v confs:/usr/local/tomcat/conf -d --name mytomcat2 tomcat:8.0-jre8

這個時候 Tomcat 已經啟動了,可以通過 http://ip宿主機:8080 來訪問 Tomcat 的預設主頁,例如我的訪問地址 http://192.168.43.166:8080 ,看到湯姆貓的圖示就成功了。如果訪問失敗,可能是對應的 8080 埠沒有開放,CentOS7 可以參考:CentOS7開啟埠

場景2:MySQL

可參考官方文件:MySQL

# 通過 -e 指定引數,指定 MySQL 的 root 賬戶的密碼為:1234
docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -d mysql:5.7.32

# 停止容器,防止埠占用
docker stop mysql

# 資料庫的資料將會隨著容器消失而消失,所以需要將資料庫檔案持久化到宿主機,
# 配置對映到本地
docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -d -v mysqldata:/var/lib/mysql -v mysqlconfig:/etc/mysql  mysql:5.7.32

MySQL 就成功執行了,可以通過 Navicat 或者其他工具測試資料庫,地址為宿主機 ip地址,使用者名稱為 root,密碼為:1234,可以嘗試儲存資料,資料會被儲存在資料卷,這裡指定的資料卷名稱為:mysqldata

# 檢視所有資料卷
docker volume ls
# 檢視 MySQL 的資料卷
docker inspect mysqldata
# 返回的 json 物件,其中 Mountpoint 的值就是,檔案對應掛載的位置

# 我這裡掛載的地址為:/var/lib/docker/volumes/mysqldata/_data
# 進入這個目錄,就可以看到儲存的檔案

使用資料卷的好處在於:容器被移除了,重新執行一個新容器,直接掛載原來的資料卷就可了,資料不會丟失

# 移除容器
docker rm -f mysql2
# 重新執行新的容器,並掛載原來的資料卷
docker run --name mysql2 -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -d -v mysqldata:/var/lib/mysql -v mysqlconfig:/etc/mysql  mysql:5.7.32

Redis

可參考官方文件:Redis

需要注意的是:Redis 需要在映象名稱即 redis:5.0.10 的後面新增 redis-server --appendonly yes ,以此覆蓋映象預設的命令

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

# 停止容器,防止埠占用
docker stop redis

# 開啟持久化 redis-server --appendonly yes
# 開啟後,持久化生成的 aop 檔案會被放入容器中的 /data 目錄中
docker run --name redis2 -p 6379:6379 -d -v redisdata:/data redis:5.0.10 redis-server --appendonly yes
# 可以使用 Redis Desktop Manager 等工具,通過宿主機 ip 連線,進行測試

清理容器

# 檢視容器列表可以看到很多容器
docker ps
# -a 可以看到所有的容器,包括已經停止的
docker ps -a
# 如果忘記了引數或者命令可以在命令後面加上 --help,會有提示
docker ps --help
# 可以看到:-q, --quiet   Only display container IDs,即:-q引數僅輸出容器id,結合 -a,可以輸出所有容器的 id
docker ps -aq
# 結合 rm -f 就可以移除所有的容器了
docker rm -f $(docker ps -aq)

# 清除沒有用到的資料卷,有重要資料要謹慎
docker volume prune

docker

我們可以通過下面的命令,來找到 docker 的位置

whereis docker
# 我這裡執行返回的結果是:docker: /usr/bin/docker /etc/docker /usr/libexec/docker /usr/share/man/man1/docker.1.gz

可以看到 docker 的可執行檔案位於 /usr/bin,這個路徑存在環境變數 PATH 中,所以我們可以在任意路徑 使用 docker 命令

Docker 是 C/S 架構模式(客戶端-伺服器),所以上面的 docker 實際上是 Docker 的客戶端,Docker 的伺服器是 Docker Deamon 對應的就是 dockerd,也在這個目錄下,Deamon 就是 Docker 引擎,Docker 客戶端通過 Docker API 與 Deamon 進行通訊

docker 是一個可執行程式,包含了許多命令,輸入

docker --help

會將 Usage(用法)、Option(選項)、Commands(命令)都展示出來,Management Commands 也s是 Commands。每個命令可能會有它自己的子命令、選項

# run 命令有許多的選項
docker run --help
# volume 命令有許多子命令,例如:ls, rm, inspect
docker volume --help

命令梳理

使用 --help 引數,就可以查詢到到對應命令的使用方法,所以我們只要理解 Docker 命令的框架即可,不用記憶命令細節
對映象進行操作:images, rmi, search
對容器進行操作:run, stop, start, restart, exec, logs, top
其他:ps, cp, info, pull, version

還有一些 Management Commands,例如:image, network, volume
這些命令都是名詞,即要操作的物件,而具體的操作通過其子命令指定,語義更加清晰
image 常用子命令:ls, rm, prune
network 常用子命令:create, ls, inspect, rm, prune
volume 常用子命令:同上面 network 的四個

參考資料

Install docker using the convenience script
【程式設計不良人】Docker容器技術&Docker-Compose實戰
Docker元件
Docker 元件之間的關係

相關文章