前端工程师眼中的Docker
笔者最近在整理 Node.js 操作各数据库的方法,却不料遇到一个很棘手的问题:很多数据库,都需要同时下载 Server 端和 Client 端,并进行相应的配置,着实是麻烦。那有没有方法可以省去这些步骤呢?
答案肯定是有的,这就是今天要介绍的主题 —— Docker。
Docker 概述
那 Docker 是什么呢?
通俗地讲,当我们部署代码到生产服务器时,第一次都需要先进行环境配置,比如你有 100 台机器,你就要手动配置 100 台服务器的环境,这样难保不会出错。 Docker 则将软件服务制作成标准化的模板,也就是镜像,从而实现快捷部署。每次部署新机器,只需要拉取相关镜像,即可一键完成。
Docker 官方提供了很多标准镜像,涵盖 MySQL、MongoDB、Node.js 等常见开源软件。此外,开发者也可以在已有镜像的基础上,打造属于自己的定制化镜像。
接下来以 MySQL 为例,快速入坑 Docker。
镜像和镜像库
那么如何获取镜像呢?
Docker 镜像一般存储在 镜像库 ( registry ) 中。 Docker Hub 和 Docker Cloud 是公共镜像库,任何人均可使用。 Docker 默认使用 Docker Hub 。同时,用户也可以部署自己的私有镜像库。
拉取镜像
首先,从镜像库中拉取 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>
成功连接了!
小结
- Docker 将软件服务制作成模板,称为 镜像 ;
- 镜像 存储在 镜像库 中, Docker Hub 和 Docker Cloud 是公共镜像库;
- 通过 镜像 可快速创建可执行环境,这就是 容器 ;
附录
更多 Node.js 技术文章,请查看:Node.js小册 ,转至 原文 可获得最佳阅读体验。
订阅更新,获取更多学习资料,请关注我们的 微信公众号 。
前端工程师眼中的Docker的更多相关文章
- 淘宝前端工程师:国内WEB前端开发十日谈
一直想写这篇"十日谈",聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是" ...
- 全栈工程师眼中的HTTP
HTTP,是Web工程师每天打交道最多的一个基本协议.很多工作流程.性能优化都围绕HTTP协议来进行,但是我们对HTTP的理解是否全面呢?如果前端工程师和后台工程师坐在一起玩捉鬼游戏,他们对HTTP的 ...
- 党建凯,创新工场知乎团队Web前端工程师
Nicholas C. Zakas谈怎样才能成为优秀的前端工程师: 昨天,我负责了Yahoo!公司组织的一次面试活动,感触颇深的是其中的应聘者提问环节.我得说自己对应聘者们提出的大多数问题都相当失望. ...
- Nicholas C. Zakas谈怎样才能成为优秀的前端工程师
黄色阴影为业务,红色字体为哲学 昨天,我负责了Yahoo!公司组织的一次面试活动,感触颇深的是其中的应聘者提问环节.我得说自己对应聘者们提出的大多数问题都相当失望.我希望听到一些对在Yahoo!工作充 ...
- web前端工程师入门须知
本文是写给那些想要入门web前端工程的初学者,高手请路过,也欢迎高手们拍砖. 先说下web前端工程师的价值,目前web产品交互越来越复杂,用户使用体验和网站前端性能优化这些都得靠web前端工程师去做w ...
- 前端工程师手中的Sublime Text
原文地址:http://css-tricks.com/sublime-text-front-end-developers/ 我的Blog:http://cabbit.me/sublime-text-f ...
- Web前端工程师成长之路——知识汇总
一.何为Web前端工程师? 前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业.Web前端开发工程师,主要职责是利用(X)HTML/CSS/JavaScript ...
- 前端工程师技能之photoshop巧用系列第三篇——切图篇
× 目录 [1]切图信息 [2]切图步骤 [3]实战 前面的话 前端工程师除了使用photoshop进行测量之外,更重要的是要使用该软件进行切图.本文是photoshop巧用系列的第三篇——切图篇 切 ...
- 前端工程师技能之photoshop巧用系列第二篇——测量篇
× 目录 [1]测量信息 [2]实战 [3]注意事项 前面的话 前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇——测量篇 测量信息 在网页制作中需要 ...
随机推荐
- bootstrap实现多选项及回显
1.前端 <link rel="stylesheet" href="${ctxStatic}/js/bootstrap-select-1.12.2/dist/css ...
- JQ主页图片划动切换效果
.wrapper { width: 726px; float: left; } #jiao_dian { width: 980px; *height: 292px; margin-top: 10px; ...
- windows下apache运行环境搭建
apache的安装 要求: 1,不要安装到有中文的目录中: 2,尽量将apache,php,mysql安装到一个总的目录,便于管理.(如都建立在amp目录下,然后在该目录下分别建立apache,php ...
- centos7 开机/etc/rc.local 不执行的问题(转载)
最近发现centos7 的/etc/rc.local不会开机执行,于是认真看了下/etc/rc.local文件内容的就发现了问题的原因了 #!/bin/bash # THIS FILE IS ADDE ...
- <JZOJ5906>传送门
emmm dpdpdp然鹅我考场上并想不到 还是凉凉 #include<cstdio> #include<cmath> #include<iostream> #in ...
- [转]<版本二>写代码的小女孩
天冷极了,下着雪,又快黑了.这是一年的最后一天——大年夜.在这又冷又黑的晚上,一个乖巧的小女孩在机房里调试程序.她从家里出来的时候还穿着一件外套,但是有什么用呢?那是一双很大的外套——那么大,不知是哪 ...
- python IO多路复用版FTP
需求: 实现文件上传及下载功能 支持多连接并发传文件 使用select or selectors
- Unique Snowflakes(窗口滑动)
题目: Emily the entrepreneur has a cool business idea: packaging and selling snowflakes. She has devis ...
- 北京VS上海:“活着为了工作”还是“工作为了生活”?
Costco开业你去现场了吗?人口普查似的排队场面对于上海人来说已经不稀奇,毕竟当新鲜的商品或是业态来到中国时,上海常常是第一站.但当Costco的新闻不断发酵的同时,在互联网的角落里也有一群人提出了 ...
- 使用Win10自带的虚拟机安装Linux
Win10自带了一款虚拟机,感觉不错,可以试用一下: 安装:http://news.mydrivers.com/1/650/650018.htm 主要思路就是在BIOS里面开启CPU虚拟化,然后在Wi ...