Docker 入門
基礎
不同操作系統下其安裝包、運行環境是都不相同的!如果是手動安裝,必須手動解決安裝包不同、環境不同的、配置不同的問題
而使用Docker,這些完全不用考慮。就是因為Docker會自動搜索并下載MySQL。注意:這里下載的不是安裝包,而是**鏡像(image)
。鏡像中不僅包含了MySQL本身,還包含了其運行所需要的環境、配置、系統級函數庫。因此它在運行時就有自己獨立的環境,就可以跨系統運行,也不需要手動再次配置環境了。這套獨立運行的隔離環境我們稱為容器(container)
**
💡 Docker安裝軟件的過程,就是自動搜索下載鏡像,然后創建并運行容器的過程
Docker本身包含一個后臺服務
,我們可以利用Docker命令告訴Docker服務,幫助我們快速部署指定的應用。Docker服務部署應用時,首先要去搜索并下載應用對應的鏡像,然后根據鏡像創建并允許容器,應用就部署完成
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql
解讀:
docker run -d
:創建并運行一個容器,d
則是讓容器以后臺進程運行-name mysql
: 給容器起個名字叫mysql
,你可以叫別的p 3306:3306
: 設置端口映射。- 容器是隔離環境,外界不可訪問。但是可以將宿主機端口映射容器內到端口,當訪問宿主機指定端口時,就是在訪問容器內的端口了。
- 容器內端口往往是由容器內的進程決定,例如MySQL進程默認端口是3306,因此容器內端口一定是3306;而宿主機端口則可以任意指定,一般與容器內保持一致。
- 格式:
p 宿主機端口:容器內端口
,示例中就是將宿主機的3306映射到容器內的3306端口
e TZ=Asia/Shanghai
: 配置容器內進程運行時的一些參數- 格式:
e KEY=VALUE
,KEY和VALUE都由容器內進程決定 - 案例中,
TZ=Asia/Shanghai
是設置時區;MYSQL_ROOT_PASSWORD=123
是設置MySQL默認密碼
- 格式:
mysql
: 設置鏡像名稱,Docker會根據這個名字搜索并下載鏡像- 格式:
REPOSITORY:TAG
,例如mysql:8.0
,其中REPOSITORY
可以理解為鏡像名,TAG
是版本號 - 在未指定
TAG
的情況下,默認是最新版本,也就是mysql:latest
- 格式:
Docker 常見命令
命令 | 說明 | 文檔地址 |
---|---|---|
docker pull | 拉取鏡像 | https://docs.docker.com/engine/reference/commandline/pull/ |
docker push | 推送鏡像到DockerRegistry | https://docs.docker.com/engine/reference/commandline/push/ |
docker images | 查看本地鏡像 | https://docs.docker.com/engine/reference/commandline/images/ |
docker rmi | 刪除本地鏡像 | https://docs.docker.com/engine/reference/commandline/rmi/ |
docker run | 創建并運行容器(不能重復創建) | https://docs.docker.com/engine/reference/commandline/run/ |
docker stop | 停止指定容器 | https://docs.docker.com/engine/reference/commandline/stop/ |
docker start | 啟動指定容器 | https://docs.docker.com/engine/reference/commandline/start/ |
docker restart | 重新啟動容器 | https://docs.docker.com/engine/reference/commandline/restart/ |
docker rm | 刪除指定容器 | https://docs.docker.com/engine/reference/commandline/rm/ |
docker ps | 查看容器 | https://docs.docker.com/engine/reference/commandline/ps/ |
docker logs | 查看容器運行日志 | https://docs.docker.com/engine/reference/commandline/logs/ |
docker exec | 進入容器 | https://docs.docker.com/engine/reference/commandline/exec/ |
docker save | 保存鏡像到本地壓縮文件 | https://docs.docker.com/engine/reference/commandline/save/ |
docker load | 加載本地壓縮文件到鏡像 | https://docs.docker.com/engine/reference/commandline/load/ |
docker inspect | 查看容器詳細信息 | https://docs.docker.com/engine/reference/commandline/inspect/ |
💡 docker run 相當于 docker create 和 docker start,啟動鏡像時不要使用 docker run
以Nginx
為例演示上述命令
# 第1步,去DockerHub查看nginx鏡像倉庫及相關信息# 第2步,拉取Nginx鏡像
docker pull nginx# 第3步,查看鏡像
docker images
# 結果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB# 第4步,創建并允許Nginx容器
docker run -d --name nginx -p 80:80 nginx# 第5步,查看運行中容器
docker ps
# 也可以加格式化方式訪問,格式會更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第6步,訪問網頁,地址:http://虛擬機地址# 第7步,停止容器
docker stop nginx# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第9步,再次啟動nginx容器
docker start nginx# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"# 第11步,查看容器詳細信息
docker inspect nginx# 第12步,進入容器,查看容器內目錄
docker exec -it nginx bash
# 或者,可以進入MySQL
docker exec -it mysql mysql -uroot -p# 第13步,刪除容器
docker rm nginx
# 發現無法刪除,因為容器運行中,強制刪除容器
docker rm -f nginx
給常用Docker命令起別名,方便訪問:
# 修改/root/.bashrc文件
vi /root/.bashrc
內容如下:
# .bashrc# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fi
數據卷
容器提供程序的運行環境,但是程序運行產生的數據、程序運行依賴的配置都應該與容器解耦
數據卷(volume)是一個虛擬目錄,是容器內目錄與宿主機目錄之間映射的橋梁
在上圖中:
- 我們創建了兩個數據卷:
conf
、html
- Nginx容器內部的
conf
目錄和html
目錄分別與兩個數據卷關聯。 - 而數據卷conf和html分別指向了宿主機的
/var/lib/docker/volumes/conf/_data
目錄和/var/lib/docker/volumes/html/_data
目錄
這樣以來,容器內的conf
和html
目錄就 與宿主機的conf
和html
目錄關聯起來,我們稱為掛載。此時,我們操作宿主機的/var/lib/docker/volumes/html/_data
就是在操作容器內的/usr/share/nginx/html/_data
目錄。只要我們將靜態資源放入宿主機對應目錄,就可以被Nginx代理了
💡 /var/lib/docker/volumes
這個目錄就是默認的存放所有容器數據卷的目錄,其下再根據數據卷名稱創建新目錄,格式為/數據卷名/_data
為什么不讓容器目錄直接指向宿主機目錄呢?
- 因為直接指向宿主機目錄就與宿主機強耦合了,如果切換了環境,宿主機目錄就可能發生改變了。由于容器一旦創建,目錄掛載就無法修改,這樣容器就無法正常工作了
- 但是容器指向數據卷,一個邏輯名稱,而數據卷再指向宿主機目錄,就不存在強耦合。如果宿主機目錄發生改變,只要改變數據卷與宿主機目錄之間的映射關系即可
- 一般數據卷目錄比較深,不好尋找,通常讓容器直接與宿主機
目錄
掛載而不使用數據卷
數據卷的相關命令有:
命令 | 說明 | 文檔地址 |
---|---|---|
docker volume create | 創建數據卷 | https://docs.docker.com/engine/reference/commandline/volume_create/ |
docker volume ls | 查看所有數據卷 | https://docs.docker.com/engine/reference/commandline/volume_ls/ |
docker volume rm | 刪除指定數據卷 | https://docs.docker.com/engine/reference/commandline/volume_prune/ |
docker volume inspect | 查看某個數據卷的詳情 | https://docs.docker.com/engine/reference/commandline/volume_inspect/ |
docker volume prune | 清除數據卷 | https://docs.docker.com/engine/reference/commandline/volume_prune/ |
容器與數據卷的掛載要在創建容器時配置,對于創建好的容器,是不能設置數據卷的。而且創建容器的過程中,數據卷會自動創建
數據卷的目錄結構較深,如果操作數據卷目錄會不太方便。在很多情況下,會直接將容器目錄與宿主機指定目錄掛載。掛載語法與數據卷類似:
# 掛載本地目錄
-v 本地目錄:容器內目錄
# 掛載本地文件
-v 本地文件:容器內文件
💡 本地目錄或文件必須以 /
或 ./
開頭,如果直接以名字開頭,會被識別為數據卷名而非本地目錄名
-v mysql:/var/lib/mysql # 會被識別為一個數據卷叫mysql,運行時會自動創建這個數據卷
-v ./mysql:/var/lib/mysql # 會被識別為當前目錄下的mysql目錄,運行時如果不存在會創建目錄
參考
黑馬程序員Docker快速入門到項目部署,MySQL部署+Nginx部署+docker自定義鏡像+DockerCompose項目實戰
day02-Docker — 張虎翼