前端工程師眼中的Docker

筆者最近在整理 Node.js 操做各數據庫的方法,卻不料遇到一個很棘手的問題:不少數據庫,都須要同時下載 Server 端和 Client 端,並進行相應的配置,着實是麻煩。那有沒有方法能夠省去這些步驟呢?html

答案確定是有的,這就是今天要介紹的主題 —— Dockernode

Docker 概述

Docker 是什麼呢?mysql

通俗地講,當咱們部署代碼到生產服務器時,第一次都須要先進行環境配置,好比你有 100 臺機器,你就要手動配置 100 臺服務器的環境,這樣難保不會出錯。 Docker 則將軟件服務製做成標準化的模板,也就是鏡像,從而實現快捷部署。每次部署新機器,只須要拉取相關鏡像,便可一鍵完成。sql

Docker 官方提供了不少標準鏡像,涵蓋 MySQLMongoDBNode.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
複製代碼

a68be49896f8first-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 容器暴露了兩個端口,分別是 330633060 ,其中 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>
複製代碼

成功鏈接了!

小結

  • Docker 將軟件服務製做成模板,稱爲 鏡像
  • 鏡像 存儲在 鏡像庫 中, Docker Hub 和 Docker Cloud 是公共鏡像庫;
  • 經過 鏡像 可快速建立可執行環境,這就是 容器

附錄

更多 Node.js 技術文章請訪問:Node.js小冊

訂閱更新,獲取更多學習資料,請關注咱們的 微信公衆號

小菜學編程
相關文章
相關標籤/搜索