前端工程师眼中的Docker

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

前端工程师眼中的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

  1. 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

  1. 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小册 ,转至 原文 可获得最佳阅读体验。

订阅更新,获取更多学习资料,请关注我们的 微信公众号 。

原文地址https://www.cnblogs.com/YanYanv/p/12500712.html

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8月前
|
人工智能 监控 开发者
在开发者眼中,Docker有怎样通俗易懂的理解方式
【4月更文挑战第27天】Docker是轻量级容器化技术,允许可移植的应用程序及其依赖在任何环境运行,提供快速部署和扩展。它比传统虚拟化更高效,但容器间的资源隔离和管理是个挑战。Docker与AI结合,简化了AI模型部署,实现环境无关性,并支持版本控制和性能监控,提升模型管理效率。然而,复杂模型可能需结合其他工具管理。
44 0
|
8月前
|
资源调度 前端开发 Shell
[docker] DevContainer高效开发(第二篇):前端开发体验
上面的配置只是最基本的配置,大部分情况我们是需要自定义配置,让容器更符合我们的需求。自定义配置就需要用到 Dockerfile,这个文件是 docker 的配置文件,可以在里面安装软件,配置环境等等。Dockerfile 的语法可以参考 官方文档。然后根据自己的需求编写 Dockerfile# 设置变量,由 .devcontainer.json 中的 args 传入# 指定 node 版本# 设置编码# 设置工作目录# 挂载 volume# 设置 bash 为默认 shell。
219 0
|
8月前
|
前端开发 jenkins 持续交付
新的centos7.9安装docker版本的jenkins2.436.1最新版本-前端项目发布(五)
新的centos7.9安装docker版本的jenkins2.436.1最新版本-前端项目发布(五)
199 1
|
8月前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
720 0
|
3月前
|
前端开发 开发工具 git
如何清理 docker 磁盘空间+修改 Gitea 服务器的 Webhook 设置+前端一些好学好用的代码规范-git hook+husky + commitlint
如何清理 docker 磁盘空间+修改 Gitea 服务器的 Webhook 设置+前端一些好学好用的代码规范-git hook+husky + commitlint
48 5
|
4月前
|
前端开发 应用服务中间件 nginx
docker部署本地前端项目思路
docker部署本地前端项目思路
55 7
|
3月前
|
JavaScript 前端开发 Docker
拿下奇怪的前端报错(二):nvm不可用报错`GLIBC_2.27‘‘GLIBCXX_3.4.20‘not Found?+ 使用docker构建多个前端项目实践
本文介绍了在多版本Node.js环境中使用nvm进行版本管理和遇到的问题,以及通过Docker化构建流程来解决兼容性问题的方法。文中详细描述了构建Docker镜像、启动临时容器复制构建产物的具体步骤,有效解决了不同项目对Node.js版本的不同需求。
141 0
|
6月前
|
前端开发 Docker 容器
前端 CSS 经典:mac docker 效果
前端 CSS 经典:mac docker 效果
67 0
|
8月前
|
前端开发 应用服务中间件 nginx
前端破圈使用Docker Nginx容器部署项目🏴‍☠️
前端破圈使用Docker Nginx容器部署项目🏴‍☠️
247 0
|
8月前
|
前端开发 Java 网络安全
解决docker中运行的jar包连不上前端程序
解决docker中运行的jar包连不上前端程序