用了八年的方式-用 Docker 瞬間搭建本地開發環境
有些時候我們需要在本地搭開發環境,比如平時學習新技術的時候。或者有時候公司的項目需要在本地建一套類似的,方便調試修改。
開發環境可能包括 MySQL、Redis、Nginx、MQ 、Elasticsearch等等,今天用的是 MySQL,明天又用PostgreSQL了,如果用啥都在本機裝一下的話,倒也不是不可以,但是就非常麻煩了,而且有時候安裝會遇到各種各樣的問題,很是不爽。
有什么快速有優雅的方式沒有?
就是我們今天要說的 Docker 了,Docker 到現在為止,早就不是什么新技術了,甚至可以說是很普遍很大眾的技術方案了。
我記得我最早開始用 Docker 已經是 2015年了,到現在已經快8年了。只能感嘆,時間過得是真快呀!
圖片
那段時間也把 Docker 安利給了不少同學、同事,我只是這樣告訴他們:“這玩意兒在本地搭一套開發環境真的很方便”,至于它后來發展成現在的規模,我也是沒想到的。
如果你是個開發老手兒,相信你早就用起來了。而如果你是個新手,那也要盡快用起來了,不僅能節省搭建環境的時間,還能學習學習,畢竟現在容器化部署方式很普遍了,多了解了解還是非常有必要的。
Docker 原理和基礎命令
基本原理
用任何一種技術首先都要先了解它的技術原理,做到心中有數。
Docker 使用 Google 公司推出的 Go 語言進行開發實現,基于 Linux 內核的cgroup,namespace,以及 OverlayFS類的 Union FS 等技術,對進程進行封裝隔離,屬于操作系統層面的虛擬化技術。由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器。
Docker 經常拿來和虛擬機來比較,因為它們兩個的用處和用法都很相似,就是在一臺實體機上啟動多個虛擬系統(暫且這么說)。如果基于使用的層面來講,你完全可以把 Docker 當做虛擬機來用,然而實際的底層技術原理是完全不一樣的。
假設你現在變身了,站在了 Docker 和 虛擬機的內部,從里面向外看,發現虛擬機有自己的 CPU(虛擬CPU)、內存、硬盤,再往外才是宿主機的 CPU、硬盤、內存等。而如果是在Docker內部向外看,發現你無論站在當前實體機的哪個容器里,看到的都是宿主機的 CPU、硬盤、內存等。說明 Dokcer 容器是直接拿宿主機的資源當自己的用,所以每個容器的硬件配置都是一樣的,而虛擬機是完全虛擬出來一套。
基礎命令
Dokcer 的命令有一大堆,但是常用的就那幾個。
鏡像相關
獲取鏡像
docker pull 鏡像名稱
查看鏡像列表
docker image ls
容器相關
查看容器
docker ps -a
新建并啟動容器
sudo docker run -t -i ubuntu:12.04 /bin/bash
進入容器
docker exec -it 容器id bash
因為本文不是 Docker 的教程,所以只是拋磚引玉,具體的教程和文檔網上到處都是。
安裝 Docker Desktop
接下來開始本地實踐了,用 Docker 快速搭一套本地環境。
有一些 Docker 的可視化客戶端可以安裝,幫我們更方便更直觀的管理鏡像、容器,當然如果你很厲害的話,完全用命令行也不是不行。
我就沒這么厲害了,那些參數根本記不住,所以必須要裝客戶端。我安裝的是 Docker Desktop,官方客戶端,支持 Mac、Linux、Windows,我大部分時候用 Mac,有時候也要用 Windows,所以Docker Desktop是不二選擇。
如果你只用 Mac 的話,也可以安裝 OrbStack(https://orbstack.dev/),據說比 Docker Desktop 要流暢一些。
下載安裝
訪問 Docker Desktop 官網 https://www.docker.com/products/docker-desktop/,根據你的系統下載對應的版本。
圖片
下載完一鍵安裝就可以了,Docker 環境直接幫你裝好了,省心省事兒。下面是它的控制臺界面。左側導航可以查看鏡像列表、容器列表、映射的Volumes。
圖片
我們在命令行輸入 docker -v,如果出現正確的版本號,說明 docker服務已經安裝正常了。
Docker version 24.0.2, build cb74dfc
接下來有一件事兒是必須要做的,那就是設置國內鏡像源,道理大家都懂,你要是用國外的鏡像源,一天都不一定能搞下來一個。
點擊「設置」按鈕,在左側選擇「Docker Engine」
圖片
,然后在右側的配置框中添加如下配置,加到最下面即可:
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com/"
]
加完后,點擊「Apply & restart」,這時候會重啟 Docker 服務。
安裝一個服務
MySQL、Nginx、Redis、Zookeeper 這些都是服務,每一個都可以按照這種方式安裝,不管你的項目需要多少個服務,一個個安裝就好了,很快的呦。
正好我最進要學一下 PostgreSQL,我就直接啟動一個 docker 容器了,不在本地安裝了。當然了,像數據庫這種I/O型的應用是不建議容器化的,但是本地開發測試無所謂。
在這個搜索框輸入關鍵詞,查找對應的鏡像,我在這里輸入關鍵詞 PostgreSQL。如果安裝 Nginx 那就是輸入 Nginx,以此類推。
圖片
看,出來了一大堆,我一般都是找第一個,也就是下載量最大的這個。
圖片
可以 pull 或者 run,pull 是拉取鏡像,run 是拉取鏡像+啟動容器。
圖片
我一般都是直接 run,點一下 run,等一會兒,因為前面已經設置了國內鏡像源,所以速度很快,十幾秒鐘。(根據網速快慢不同,因為要下載鏡像文件,有的應用有上百M)
下載完之后,因為選的是 run,所以直接彈出了啟動參數。
圖片
設置鏡像名稱
容器名稱(Container name)就是為了我們一看到它就知道是干什么的,用來方便管理的,我就直接命名為 PostgreSQL了。
設置端口映射(Ports)
服務本身有自己的端口,例如 MySQL 是3306,這是服務本身在容器內的啟動端口,但最終我們要通過宿主機去訪問服務,所以要將這個容器內的端口綁定到一個宿主機端口,這叫做端口映射,這樣一來,我們就可以通過宿主機的端口訪問到容器內的端口了。比如我將 MySQL 容器的 3306 端口映射到宿主機的 13306 端口,之后我在設置數據庫連接的時候,就用本機 IP:13306就能訪問 MySQL 容器了。
在我這個 PostgreSQL 容器上,我將本機的 15432和容器的 5432端口綁定,之后就可以用 15432做連接端口了。
目錄映射(Volumes)
很多服務都會用到存儲目錄,但是容器本身就在宿主機上,所以需要將服務在容器內的目錄映射到宿主機的目錄上,這叫目錄映射。例如將 Nginx 容器的 /etc/nginx目錄映射到宿主機的 /apps/nginx/目錄上,那之后我在宿主機訪問 /apps/nginx目錄時,就能看到 Nginx 容器的配置文件了。
在我這個PostgreSQL 容器上,我將 /etc/postgresql/postgresql.conf配置文件映射到了我本地的一個目錄上。
環境變量
一個服務啟動可能會用到啟動變量,這些變量可以通過環境變量的方式進行配置。例如,我們啟動一個 Java jar 包,要配置 JVM 相關的參數,這些參數就可以放到環境變量中,供啟動的時候使用。
因為 PostgreSQL 需要密碼,所以這里就設置一個密碼的環境變量 POSTGRES_PASSWORD。
都設置好之后,點擊run按鈕,啟動容器。
然后我們看到容器已經啟動了,有相應的日志打印出來。
圖片
然后點擊左側的Containers,可以看到已經啟動的容器和一些基本配置。
圖片
然后就可以通過客戶端進行連接了。
圖片
圖片
另外,還可以在容器詳情中查看容器的內部文件、狀態、配置信息、日志等,以及進入命令行。
圖片
最后
第一次可能比較慢,熟悉了之后就非常快了,比你在本地直接安裝配置要快的多,而且一些軟件安裝配置起來非常繁瑣,會浪費很多不必要的時間。
還有很多開源的框架、應用提供docker版本,掌握了這個方法后,可以很快的安裝這些框架、應用來驗證和使用,用戶體驗直接上升一個數量級。