前情提要:
由于我们的项目被投资者相中了,准备作为产品投产。所以我们需要考虑应用的规模化问题。SQLite显然是不适合规模化的。于是我们打算引入MySQL。不过这个时候我们就需要考虑:是单独为MySQL起一个容器,还是把它安装到现有容器当中。种种考量之下,我们知道给MySQL单独起一个容器的好处。那么接下来的问题就是,如何实现多个容器之间的通讯。我们利用nicolaka/netshoot容器,解决了找到容器的ip地址的问题。不过,我们的更大发现是:网络别名--network-alias的妙用。之后,我们知道原来在待办任务应用中,存在几个环境变量,使用这些环境变量,就能让我们指定指定应用向MySQL的连接,尽管这在生产环境中是绝对不推荐的。
那么,接下来就是今天的重头戏,实现应用容器对MySQL容器的请求。首先,让我们来启动准开发容器。
开工
1、指定上文一起学Docker8:如何搭建多容器应用(上)提到的所有环境变量,同时将容器接入我们的应用网络。
dockerrun-dp:\
-w/app-v"$(pwd):/app"\
--networktodo-app\
-eMYSQL_HOST=mysql\
-eMYSQL_USER=root\
-eMYSQL_PASSWORD=secret\
-eMYSQL_DB=todos\
node:12-alpine\
sh-c"yarninstallyarnrundev"
如果你用的是PowerShell的话,把命令中的\替换成`即可。
2、如果我们查看容器的日志的话,我们会看到消息,提示我们应用已经用上mysql数据库了。
3、在网页浏览器中打开应用,并给待办任务列表中,添加一些任务。
4、连接MySQL数据库,确认一下那些任务被写入了数据库。记住,密码是secret。
dockerexec-itmysql容器idmysql-ptodos
在MySQLshell中运行以下命令,你会看到刚才在网页端添加的任务,已经在这里显示了。
如果你打开Docker仪表盘查看的话,你会看到有2个应用容器在运行。但是没有什么标识可以让你一眼发现:这2个容器是同一个应用的。我们之后会看看怎么让它有更好的展示。
回顾
此时此刻,我们有一个应用,它把数据保存在另一个容器中的外部数据库中。我们学习了容器网络的一些内容,看到了如何通过使用DNS来实现服务发现。
不过,你可能开始觉得启动应用所需要的东西越来越多。我们必须创建网络,启动容器,指定所有环境变量,暴露端口等等。要记的东西有很多,如果要把工作交接给别人的话,也越发困难了。
在文章中,我们会讨论DockerCompose。有了DockerCompose,我们能够以更加简单的方式分享我们的应用栈,其他人只要一个简单的命令就能启动容器。