这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
很多后端开发小伙伴在日常开发中会遇到类似以下这些问题:
- 手头的两个项目使用的 MySQL 版本不一样,但是为了开发方便都需要在本地搭建一个测试数据库;
- 想在本地搭建一个 MongoDB 或者 Redis 集群的 Demo;
- 需要在不同的运行时环境测试自己的软件;
- 需要频繁地启动/停止/安装/卸载各种中间件;
- 等等
总结起来就是需要不断地修改开发电脑的各种环境配置。其实针对这个问题,在本地使用 Docker 部署各种运行环境和中间件就是很好的解决方案,它不像虚拟机那么重,又能很方便地独立运行各种环境。
这篇文章以 MySQL 为例,介绍使用 Docker 部署软件并方便日常开发的例子。根据这个例子,你可以了解日常开发中,如何使用 Docker 部署各种基础组件、中间件、运行环境等,解决频繁环境配置的痛点。
找到 MySQL 的官方镜像
运行一个 MySQL 数据库容器的第一步就是找到对应的镜像。
可以通过在 Docker Hub 搜索找到 MySQL 的官方镜像 mysql/mysql-server
。除了 MySQL 官方的镜像外,Docker Hub 上还能找到 Docker 维护的 MySQL 镜像,以及 Google、IBM 等公司维护的 MySQL 镜像,在此,我们以mysql/mysql-server
镜像为例,其他镜像的差别可以参考他们各自的文档。
找到之后,你可以通过以下命令将其拉取到本地,也可以在运行容器时让 Docker 自动拉取。
docker pull mysql/mysql-server
启动一个 MySQL 容器
接下来运行一个 MySQL 容器。
docker run --name=mysql_demo --restart on-failure -d -p 3306:3306 mysql/mysql-server
在日常开发中,推荐给所有运行的容器自定义个一个名字,而不是让 Docker 自动生成,这样不会混淆。然后,让这个容器在出问题时能够重启。
通过 docker ps
命令,确保它已经正确运行了。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58b0e1ea4ad3 mysql/mysql-server "/entrypoint.sh mysq…" 4 seconds ago Up 3 seconds (health: starting) 0.0.0.0:3306->3306/tcp, 33060-33061/tcp mysql_demo
通过容器进入容器操作 MySQL
在 MySQL 数据库被第一次安装的时候,会随机生成一个临时密码,写在日志中。如果在宿主机上安装,我们可以从日志文件中找到这个密码,然后通过 root 账户登录。
包含临时密码的日志内容类似于这样:
[Entrypoint] GENERATED ROOT PASSWORD: *****************
在容器中运行 MySQL 容器时,可以通过以下命令获取:
docker logs mysql_demo 2>&1 | grep GENERATED
这样可以读取容器的日志,并从中筛选出包含 GENERATED
的一行,这样就找到了 MySQL 生成的临时密码。
接下来,我们需要进入容器的命令行进行操作:
docker exec -it mysql_demo bash
以上的命令中,docker exec
可以执行容器中的一个命令,-it
是 -i -t
的简写,它的作用是让 Docker 分配一个伪终端并绑定到容器的标准输入上且保持打开,简而言之就是我们可以直接在容器中执行命令了。
接下来在容器中连接 MySQL 并修改 root 密码:
mysql -uroot -p
然后输入刚才获取到的临时密码,就能登录成功。
或者也可以一步到位地执行:
docker exec -it mysql1 mysql -uroot -p
如果看到命令提示符变成了 mysql>
就说明成功进入了 MySQL,然后修改 root 的密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
也可以在这时创建数据库、创建用户、给用户授权等,操作完退出就可以了。之后,只要这个容器处于运行状态,就可以和连接本地安装的 MySQL 一样连接它了。