笔者最近在整理 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小册
订阅更新,获取更多学习资料,请关注咱们的 微信公众号 :