docker:快速構建、運行、管理應用的工具,可以幫助我們下載應用鏡像,創建并運行鏡像的容器,從而快速部署應用
1、部署mysql
先停掉虛擬機中的MySQL,確保你的虛擬機已經安裝Docker,且網絡開通的情況下,執行下面命令即可安裝MySQL(注意:若服務器上已經有mysql 占用了3306端口,可修改綁定服務器3307端口,如下)
docker run -d \--name mysql \-p 3307:3306 \ # 將主機端口從3306改為3307-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql
運行完后,可以通過navicat 正常訪問
如果想要集群部署,只需修改`宿主機端口映射`和`容器名稱`保證不同即可,因為容器之間環境是相互隔離的,所以都是3306不用變
# 如果想要集群部署只需修改docker容器內部的端口號和容器名稱即可# 節點1
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql# 節點2
docker run -d \--name mysql2 \-p 3307:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql# 節點3
docker run -d \--name mysql3 \-p 3308:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql
大家可以發現,當我們執行命令后,Docker做的第一件事情,是去自動搜索并下載了MySQL,然后會自動運行MySQL,我們完全不用插手,非常方便。而且,這種安裝方式完全不用考慮運行的操作系統環境問題,它不僅僅在CentOS系統是這樣,在Ubuntu系統、macOS系統、甚至是裝了WSL的Windows下,都可以使用這條命令來安裝MySQL。
要知道,不同操作系統下其安裝包、運行環境是都不相同的!如果是手動安裝,必須手動解決安裝包不同、環境不同的、配置不同的問題!
2、鏡像和容器
當我們利用Docker安裝應用時,Docker會自動搜索并下載應用鏡像(image)。
- 鏡像:不僅包含應用本身,還包含應用運行所需要的環境、配置、系統函數庫。
- 容器:Docker會在運行鏡像時創建一個隔離環境,稱為容器(container)。
- 鏡像倉庫:存儲和管理鏡像的平臺,Docker官方維護了一個公共倉庫:Docker Hub(目前國內已停止訪問)。
3、命令解讀
docker run -d \--name mysql \-p 3307:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql
解讀:
- docker run -d:創建并運行一個容器,-d則是讓容器以后臺進程運行
- --name mysql: 給容器起個名字叫mysql,你可以叫別的,要唯一
- -p 3307:3306: 設置端口映射。格式: -p 宿主機端口:容器內端口,示例中將宿主機的3307映射到容器內的3306端口
- -e TZ=Asia/Shanghai:配置容器內進程運行時的一些參數,此處是設置時區,格式:-e KEY=VALUE,KEY和VALUE都由容器內進程決定
- -e MYSQL_ROOT_PASSWORD=123:是設置MySQL默認密碼
- mysql : 設置鏡像名稱,Docker會根據這個名字搜索并下載鏡像,格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解為鏡像名,TAG是版本號,在未指定TAG的情況下,默認拉取最新版本鏡像,也就是mysql:latest
容器是隔離環境,外界不可訪問。但是可以將`宿主機端口`映射`容器內到端口`,當訪問宿主機指定端口時,就是在訪問容器內的端口了。
容器內端口往往是由容器內的進程決定,例如MySQL進程默認端口是3306,因此容器內端口一定是3306;而宿主機端口則可以任意指定,一般與容器內保持一致,但是這里為了防止與之前外部安裝的MySQL的3306沖突,改為3307映射容器內的3306。
鏡像的名稱不是隨意的,而是要到DockerRegistry中尋找,鏡像運行時的配置也不是隨意的,要參考鏡像的幫助文檔。
4、Docker基礎
4.1、常見命令
Docker最常見的命令就是操作鏡像、容器的命令,詳見官方文檔: https://docs.docker.com/
命令 | 說明 | 文檔地址 |
docker pull | 拉取鏡像 | docker pull |
docker push | 推送鏡像到DockerRegistry | docker push |
docker images | 查看本地鏡像 | docker images |
docker rmi | 刪除本地鏡像 | docker rmi |
docker run | 創建并運行容器(不能重復創建) | docker run |
docker stop | 停止指定容器 | docker stop |
docker start | 啟動指定容器 | docker start |
docker restart | 重新啟動容器 | docker restart |
docker rm | 刪除指定容器 | docker rm |
docker ps | 查看容器 | docker ps |
docker logs | 查看容器運行日志 | docker logs |
docker exec | 進入容器 | docker exec |
docker save | 保存鏡像到本地壓縮文件 | docker save |
docker load | 加載本地壓縮文件到鏡像 | docker load |
docker inspect | 查看容器詳細信息 | docker inspect |
補充:默認情況下,每次重啟虛擬機我們都需要手動啟動Docker和Docker中的容器。通過命令可以實現開機自啟
# Docker開機自啟
systemctl enable docker# Docker容器開機自啟
docker update --restart=always [容器名/容器id]
5、部署Nginx容器
需求:
- 在DockerHub中搜索Nginx鏡像,查看鏡像的名稱
- 拉取Nginx鏡像
- 查看本地鏡像列表
- 創建并運行Nginx容器
- 查看容器
- 停止容器
- 再次啟動容器
- 進入Nginx容器
- 刪除容器
# 第1步,查看nginx鏡像倉庫及相關信息
docker search 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}}"# 查看容器日志:docker logs 容器名
docker logs nginx
# 持續或動態查看容器日志:docker logs -f 容器名
docker logs -f nginx# 第6步,訪問網頁,地址:http://虛擬機IP地址:80# 第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步,進入容器,-it指的是可輸入終端,查看容器內目錄,輸入exit 退出容器
docker exec -it nginx bash
# 或者,可以進入容器的同時跟上執行的命令,之間一步進入容器內的MySQL
docker exec -it mysql mysql -uroot -p# 將鏡像打包下載到本地,.tar.gz是打壓縮包
docker save -o nginx.tar nginx:latest# 第13步,刪除容器
docker rm nginx
# 發現無法刪除,因為容器運行中,強制刪除容器
docker rm -f nginx
# 刪除鏡像
docker rmi nginx:latest# 將打包好的鏡像加載到本地,不用再去docker pull 對應鏡像了
docker load -i nginx.tar# 查看nginx鏡像
docker images# 創建并允許Nginx容器
docker run -d --name nginx -p 80:80 nginx
可通過下面命令進行格式化信息:
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
http://192.168.56.10/,通過這個地址可以訪問nginx
5.1、數據別名
給常用Docker命令起別名,方便我們訪問:
# 修改/root/.bashrc文件
vim /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
# 修改/root/.bashrc文件 后,執行下面命令,使其生效
source ~/.bashrc
6、數據卷掛載
容器是隔離環境,容器內程序的文件、配置、運行時產生的容器都在容器內部,我們要讀寫容器內的文件非常不方便。大家思考幾個問題:
- 如果要升級MySQL版本,需要銷毀舊容器,那么數據豈不是跟著被銷毀了?
- MySQL、Nginx容器運行后,如果我要修改其中的某些配置該怎么辦?
- 我想要讓Nginx代理我的靜態資源怎么辦?
因此,容器提供程序的運行環境,但是程序運行產生的數據、程序運行依賴的配置都應該與容器解耦