前端学一点Docker,不信你学不会
虽然前端很少跟docker打交道,但随着工作流程的自动化现代化,docker正变得越来越重要。无论你是希望扩展技能到全栈领域,还是想要炫技,掌握Docker基本知识都是前端小伙伴重要的一步。
什么是Docker
Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
我们知道,软件的安装是要区分系统环境的;即使是运行环境相同,依赖的版本一旦有所出入,也容易出现“我这里明明好使,你那里为啥不行“的问题。容器技术解决了环境一致性与依赖管理的问题。
因此,容器是我们的项目的运行环境,而docker是容器的运行环境与管理平台。
关键词
镜像 (Image)
镜像是构建容器的模板,可以简单理解为类似Js中的class类或构造函数。
镜像中详细记录了应用所需的运行环境、应用代码、如何操作系统文件等等信息;
容器 (Container)
容器是镜像的运行实例。可以简单理解为”new 镜像()“的实例,通过docker命令可以任意创建容器。
当前操作系统(宿主机)与容器之间的关系,可以参照浏览器页面与iframe之间的关系。容器可以拥有独立的IP地址,网络,文件系统以及指令等;容器与容器、容器与”宿主机“之间以隔离的方式运行,每个容器中通常运行着一个(或多个)应用。
仓库 (Registry)
仓库是集中管理镜像的地方。类似于npm平台与npm包之间的关系。
如果我们将搭建项目环境的详细过程以及具体的依赖记录进镜像中,每当需要部署新服务时,就可以很容易的通过镜像,创建出一个个完整的项目运行环境,完成部署。
示例——安装启动Mysql
1. 安装Docker
具体过程可参考菜鸟教程,下面以macOS系统作为例子进行演示。
启动docker客户端如下:
打开系统终端
(下面是在vscode的终端中演示),输入命令:
docker -v
效果如下:
说明docker已经安装并启动。
2. 下载Mysql镜像
下载镜像有点类似于安装npm包:npm install <包名>
,这里输入docker镜像的安装命令:docker pull mysql
来下载安装mysql
的镜像:
安装结束后,输入镜像列表的查看命令:docker images
当然,通过docker的客户端App也可以看到:
3. 创建mysql镜像的容器,启动Mysql
输入启动容器命令:
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
先来看下启动结果,下面的一堆数字是完整的容器id:
输入的这一串命令是什么意思?
docker run
: 这是启动新容器的命令。-d
或--detach
是使mysql服务在后台运行,而不是占用当前终端界面。-p 3308:3306
: 这是端口映射参数:- 创建容器会默认创建一个子网,与宿主机所处的网络互相隔离;mysql服务默认端口
3306
,如果要通过宿主机所在网络访问容器所处的子网络中的服务,就需要进行端口映射(不熟悉网络的可以看下《如何跟小白解释网络》)。 - 宿主机的端口在前(左边),容器的端口在后(右边)。
-e MYSQL_ROOT_PASSWORD=123456
: 设置环境变量MYSQL_ROOT_PASSWORD=123456
;也就是将mysql服务的root
用户的密码为123456
。mysql
: 这是上面刚刚pull
的镜像的名称。
通过上面的命令,我们启动了一个mysql
镜像的容器,并将主机的3308
端口映射到了容器所在子网中ip的3306
端口,这样我们就可以通过访问主机的localhost:3308
来访问容器中的mysql
服务了。
4.访问Mysql服务
下面写一段nodeJs代码:
// mysql.js
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
port: '3308',
user: 'root',
password: '123456',
database: '',
});
connection.connect();
// 显示全部数据库
connection.query('show databases;', function (err, rows, fields) {
if (err) {
console.log('[SELECT ERROR] - ', err.message);
return;
}
console.log('--------------------------SELECT----------------------------');
console.log(rows);
console.log('------------------------------------------------------------');
});
这里调用了nodeJs的mysql
包,访问localhost:3308
,用户名为root
,密码为123456
,运行结果下:
$ node mysql.js;
[SELECT ERROR] - ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication
protocol requested by server; consider upgrading MySQL client
这里报错了,原因是mysql
服务的认证协议与我们代码中的不同导致的。这里我们需要对mysql
服务进行一些修改。
为此,我们需要进入mysql
容器,对mysql
进行一些直接的命令行操作。
5.进入容器
首先,我们需要知道容器的id,输入容器查看命令:docker ps
,展示容器列表如下:
其中55cbcc600353
就是我们需要的容器的短id
,然后执行命令:docker exec -it 55cbcc600353 bash
,以下是命令的解析:
docker exec
:用于向运行中的容器发布命令。-it
:分配一个终端(伪终端),允许用shell
命令进行交互。也就是将容器中的终端界面映射到宿主机终端界面下,从而对容器进行直接的命令行操作。55cbcc600353
:容器ID或容器名称。bash
:这是要在容器内执行的命令。这里是启动了容器的Bash shell程序。
运行结果如下:
我们看到bash-4.4#
后闪烁的光标。这就是容器的bash shell
命令提示符,这里输入的shell命令将会在容器环境中执行。
我们输入mysql
登录命令,以root
用户身份登录:mysql -uroot -p123456
成功登录mysql
后,在mysql>
命令提示符下输入:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password By '123456';
这条命令用来修改’root
’用户的认证方式为mysql_native_password ,
将密码设置为123456
,并允许来自任何主机(‘%
’)的连接。
输入exit;
命令退出mysql>
命令提示符:
再按下:ctl+D
退出容器终端,回到宿主机系统终端下。再次运行上面的js代码,效果如下:
这样我们就完成了本地mysql
服务的部署。
结束
通过上面的简介以及安装部署mysql
服务的例子,相信不了解docker的前端小伙伴已经有了一些概念;感兴趣的小伙伴可以继续深入,学习相关的知识。
来源:juejin.cn/post/7304538094782808105