创建多容器应用
到目前为止,我们一直在使用单容器应用程序。但是,我们现在想要将 MySQL添加到应用程序中。经常会出现下面的问题——“MySQL会在哪里运行?安装在同一个容器中还是单独运行?” 一般来说, 每个容器应该做一件事,并且做好。 几个原因:
- 您很有可能必须以不同于数据库的方式扩展 API 和前端
- 单独的容器让您可以隔离地版本和更新版本
- 虽然您可以在本地为数据库使用容器,但您可能希望在生产中为数据库使用托管服务。你不想在你的应用程序中发布你的数据库引擎。
- 运行多个进程将需要一个进程管理器(容器只启动一个进程),这增加了容器启动/关闭的复杂性
容器网络
请记住,默认情况下,容器是独立运行的,并且对同一台机器上的其他进程或容器一无所知。那么,我们如何让一个容器与另一个容器通信呢?答案是网络。现在,您不必成为网络工程师(万岁!)。只要记住这个规则…
如果两个容器在同一个网络上,它们可以相互通信。如果他们不是,他们就不能。
输入docker命令 docker network --help 我们可以看到
Commands:
connect 连接一个容器到一个网络
create 创建一个网络
disconnect 将一个容器从一个网络中断开
inspect 显示一个或多个网络的详细信息
ls 列出所有的网络
prune 删除所有没用的网络
rm 删除一个或多个网络
最小之前的应用dockerapp 现在我们要让她使用另一个容器里的mysql数据库,遵循上面的规则,我们要做一些事情。
创建容器网络
让我们为之前的dockerapp 也就是(todo-list)应用创建网络
docker network create todo-net
使用网络创建mysql容器
docker run -dp 3306:3306 --network todo-net --network-alias mysql --name mysql -v D:\docker\mysql3306\conf:/etc/mysql/conf.d -v D:\docker\mysql3306\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=todos mysql:5.7.25
重新创建dockerapp应用容器。
让我们使用todo-net网络重新创建一下之前的dockerapp应用使用刚刚创建的mysql容器中的todos数据库。
docker run -dp 3000:3000 -w /dockerapp --network todo-net -e MYSQL_HOST=mysql -e MYSQL_USER=root -e MYSQL_PASSWORD=123456 -e MYSQL_DB=todos dangkei/dockerapp
--network todo-net # 使用todo-net网络
-e MYSQL_HOST=mysql # mysql主机名称
-e MYSQL_USER=root # mysql登陆用户名
-e MYSQL_PASSWORD=123456 # mysql登陆密码
-e MYSQL_DB=todos # 应用使用数据库名
测试结果
测试一下: 打开浏览器 http/localhost:3000/ 看到应用界面,如果没用查看容器日志检查问题,然后插入两条测试数据
再打开命令行执行下面语句
docker exec -it mysql mysql -p todos
第一个个mysql 是容器名称 第二个是登陆容器后执行命令 mysql 参数 -p toddos 使用数据库 todos
成功后查询数据结果
mysql> select * from todo_items ;
+--------------------------------------+--------------+-----------+
| id | name | completed |
+--------------------------------------+--------------+-----------+
| f5f2c90a-f5a3-45b7-b0a8-6fabd05286d4 | test | 0 |
| e4fe0fd5-9af3-44b8-b26c-edee17238970 | study docker | 0 |
+--------------------------------------+--------------+-----------+
2 rows in set (0.00 sec)
可以看到测试的数据已经保存到数据库中。
使用–link参数
很多时候我们默认创建mysql并没有指定network 我们应用要是连接mysql容器可以之间使用–link参数
docker run -dp 3000:3000 -w /dockerapp --name todo-lis --link mysql:mysql -e MYSQL_HOST=mysql -e MYSQL_USER=root -e MYSQL_PASSWORD=123456 -e MYSQL_DB=todos dangkei/dockerapp
–link mysql:mysql 中第一个mysql是mysql容器名称 第二个mysql是别名。