Docker 實踐及命令梳理

文檔

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 已經啟動了,可以通過 //ip宿主機:8080 來訪問 Tomcat 的默認主頁,例如我的訪問地址 //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 組件之間的關係