<aside> 💡 本文主要面向 Docker 初学者或前端开发者。阅览本文前,请务必先了解 Docker 是什么,以及各种基本概念 (镜像、容器等)。
</aside>
我是一个开发环境洁癖主义者,各种开发环境之间的相互影响非常讨厌,因此我曾经几乎尝试过网上的所有解决方案,比如 GUI 虚拟机、Vagrant、WSL 等等,但这些都有或多或少的缺点,尤其是当我在使用 Windows 系统的时候,开发环境永远是一个痛点。而横向对比下来,Docker 或许是当下最优的解决方案了。虽然 Docker 设计初衷是为了方便进行部署和运维,但只要是能用在生产环境的家伙,当然也能用在开发环境。那 Docker 在开发环境究竟可以做哪些事呢?
以 Docker 最常见的托管 MySQL 为例,我们要创建一个能够使用的 MySQL 容器需要两条命令:
docker pull mysql
docker run --name some-mysql \\
-v ./mysql/conf.d:/etc/mysql/conf.d \\
-v ./mysql/datadir:/var/lib/mysql \\
-e MYSQL_ROOT_PASSWORD=my-secret-pw \\
-d mysql
可以看到启动命令其实是比较繁琐的,况且这还是只有一个 MySQL 的情况。当我们有其他版本的 MySQL 或者其他服务需要一起使用时,单纯用命令行操作就显得非常繁琐了。因此我们也需要创建一个属于开发环境的 docker-compose.yml 文件用来管理一切我们需要用到的服务。
首先在你喜欢的位置创建一个文件夹,在其中添加 docker-compose.yml
。
version: "3.8"
services:
mysql:
# 启动后的容器名称
container_name: mysql
# 需要使用的镜像及版本
image: mysql:latest
# 总是自动重启
restart: always
# 端口映射
ports:
- "3306:3306"
# 数据卷映射
volumes:
- ./data/mysql:/var/lib/mysql
# 镜像需要使用的环境变量
environment:
- MYSQL_ROOT_PASSWORD=pass
- TZ=PRC
接着我们只需要执行 docker compose up -d
就可以直接启动文件中的所有服务。我们还可以给启动命令添加服务名作为参数,表示仅启动指定的服务,比如 docker compose up -d mysql
。
按照这个思路,我们只需要在 docker-compose.yml
中添加自己需要的各种服务即可,比如 Redis、MongoDB 等。下面再给出一个添加了 Redis 和 MongoDB 的完整例子。注意,我们在这里使用了 redis:alpine
这个基础镜像,这是因为基于 alpine 这个 linux 发行版的 Docker 镜像体积非常小,没有特殊需求的话,应当尽可能选用 alpine 版本的镜像。
docker-compose.yml