筆者最近在整理 Node.js 操做各數據庫的方法,卻不料遇到一個很棘手的問題:不少數據庫,都須要同時下載 Server 端和 Client 端,並進行相應的配置,着實是麻煩。那有沒有方法能夠省去這些步驟呢?html
答案確定是有的,這就是今天要介紹的主題 —— Docker。node
那 Docker 是什麼呢?mysql
通俗地講,當咱們部署代碼到生產服務器時,第一次都須要先進行環境配置,好比你有 100 臺機器,你就要手動配置 100 臺服務器的環境,這樣難保不會出錯。 Docker 則將軟件服務製做成標準化的模板,也就是鏡像,從而實現快捷部署。每次部署新機器,只須要拉取相關鏡像,便可一鍵完成。sql
Docker 官方提供了不少標準鏡像,涵蓋 MySQL、MongoDB、Node.js 等常見開源軟件。此外,開發者也能夠在已有鏡像的基礎上,打造屬於本身的定製化鏡像。docker
接下來以 MySQL 爲例,快速入坑 Docker。數據庫
那麼如何獲取鏡像呢?編程
Docker 鏡像通常存儲在 鏡像庫 ( registry ) 中。 Docker Hub 和 Docker Cloud 是公共鏡像庫,任何人都可使用。 Docker 默認使用 Docker Hub 。同時,用戶也能夠部署本身的私有鏡像庫。bash
首先,從鏡像庫中拉取 MySql 8.0 版本的鏡像:服務器
$ docker pull mysql:8.0
複製代碼
讀取鏡像列表,驗證 MySQL 鏡像是否拉取成功:微信
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 8.0 c8ad2be69a22 3 days ago 465MB
複製代碼
能夠看到 MySQL 已經在鏡像列表中,版本號爲 8.0 。
容器 是經過 鏡像 建立的可執行環境,同個鏡像能夠實例化多個容器。
如今,讓咱們使用 MySQL 鏡像建立容器:
$ docker run --name first-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
複製代碼
命令有點長,且聽我細細講述。
docker run
命令用於建立並執行新容器:--name
,用於指定容器名,在此咱們將新容器命名爲 first-mysql
;-e
,即 --environment
,指定環境變量,MYSQL_ROOT_PASSWORD
環境變量用於配置數據庫 root 用戶的密碼;-d
,讓容器在後臺運行;最後指定鏡像名和版本號,這裏用的是 mysql:8.0
。
docker ps
命令用於讀取正在運行的容器列表:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a68be49896f8 mysql:8.0 "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 3306/tcp, 33060/tcp first-mysql
複製代碼
docker ps -a
命令用於讀取全部容器列表,包括中止的容器:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a68be49896f8 mysql:8.0 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp first-mysql
c344ce31b67e mongo:3.6 "docker-entrypoint.s…" 3 months ago Exited (255) 3 months ago 0.0.0.0:27017->27017/tcp docker-service_mongo_1
複製代碼
列表中一共有兩個容器,從 STATUS 列能夠獲知容器的狀態。first-mysql ,處於運行的狀態;docker-service_mongo_1 處於退出狀態。
使用 docker stop
命令中止容器。
$ docker stop a68be49896f8
複製代碼
a68be49896f8
是 first-mysql 的 容器 ID。
查看容器列表,發現 first-mysql 容器此時已處於退出狀態:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a68be49896f8 mysql:8.0 "docker-entrypoint.s…" 20 minutes ago Exited (0) 3 seconds ago first-mysql
複製代碼
使用 docker start
開啓已被中止的容器,這裏,咱們開啓剛剛被中止的 first-mysql。
$ docker start a68be49896f8
複製代碼
查看容器列表,此時 first-mysql 容器已是運行中狀態。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a68be49896f8 mysql:8.0 "docker-entrypoint.s…" 25 minutes ago Up 6 seconds 3306/tcp, 33060/tcp first-mysql
複製代碼
掌握了鏡像和容器的基本操做後,接下來,讓咱們來看看如何操做 MySQL。咱們拉取的 MySQL 鏡像,已經內置了客戶端程序 mysql 命令,能夠直接鏈接並操做 MySQL 。那麼,如何在容器內執行命令呢?
這就要用到 docker exec
命令了:
$ docker exec -it first-mysql bash
複製代碼
這個命令在容器 first-mysql 內執行 bash
命令,啓動一個交互式 Shell 。注意到,命令行參數 -it
表示提供交互式的終端。
執行完上述命令,不出意外,便進入容器 Shell 環境:
root@a68be49896f8:/#
複製代碼
在 Shell 中,執行 mysql 命令便可鏈接數據庫:
root@a68be49896f8:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.19 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
複製代碼
-u
,即用戶名,此處是 root
;-p
,表示密碼,即一開始咱們建立容器時指定的密碼。在容器內成功鏈接數據庫後,就能夠愉快地進行各類數據操做了。
若是咱們要在實際中應用 Docker 技術,僅在容器內操做顯然是不夠的。試想一下,當咱們須要在本機鏈接容器內的 MySQL,又該如何操做呢?有辦法將容器的端口映射出來嗎?
先看一下咱們的 MySQL 容器都有哪些端口:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eff3e64f65bb mysql:8.0 "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 3306/tcp, 33060/tcp first-mysql
複製代碼
能夠看到,MySQL 容器暴露了兩個端口,分別是 3306
和 33060
,其中 3306
用於鏈接數據庫。但遺憾的是,這兩個端口目前還沒法被外部訪問,除非將它們映射出來。
建立容器時,能夠指定 -p
參數,將本地指定端口映射到容器內:
$ docker run --name first-mysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:8.0
複製代碼
這個命令在本機開啓 3306
端口,並映射到容器的 3306
端口。
如今,咱們再來看下容器發生了什麼變化:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1c17ca83541 mysql:8.0 "docker-entrypoint.s…" 8 seconds ago Up 6 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp first-mysql
複製代碼
PORTS
列顯示 0.0.0.0:3306->3306/tcp
, 這表示本地 3306
端口映射到容器 3306
端口。0.0.0.0
表明全網可鏈接。
下載 MySQL 客戶端,鏈接容器內的 MySQL 服務器。這裏筆者用的是 Homebrew 下載的 mysql-client。因爲本機端口配置了全網可連,因此咱們的 host
設定爲 127.0.0.1
便可,端口指定 3306
。執行以下命令鏈接 MySQL:
$ /usr/local/Cellar/mysql-client/8.0.18/bin/mysql -u root -h 127.0.0.1 -P 3306 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.19 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
複製代碼
成功鏈接了!
更多 Node.js 技術文章請訪問:Node.js小冊
訂閱更新,獲取更多學習資料,請關注咱們的 微信公衆號 :