多容器应用
到目前为止,我们一直在使用单容器应用程序。但是,我们现在想要将 MySQL添加到应用程序中。经常会出现下面的问题——“MySQL会在哪里运行?安装在同一个容器中还是单独运行?” 一般来说, 每个容器应该做一件事,并且做好。 几个原因:
- 您很有可能必须以不同于数据库的方式扩展 API 和前端
- 单独的容器让您可以隔离地版本和更新版本
- 虽然您可以在本地为数据库使用容器,但您可能希望在生产中为数据库使用托管服务。你不想在你的应用程序中发布你的数据库引擎。
- 运行多个进程将需要一个进程管理器(容器只启动一个进程),这增加了容器启动/关闭的复杂性
容器网络
请记住,默认情况下,容器是独立运行的,并且对同一台机器上的其他进程或容器一无所知。那么,我们如何让一个容器与另一个容器通信呢?答案是网络。现在,您不必成为网络工程师(万岁!)。只要记住这个规则……
如果两个容器在同一个网络上,它们可以相互通信。如果他们不是,他们就不能。
输入docker命令 docker network –help 我们可以看到
1 | Commands: |
最小之前的应用dockerapp 现在我们要让她使用另一个容器里的mysql数据库,遵循上面的规则,我们要做一些事情。
创建容器网络
让我们为之前的dockerapp 也就是(todo-list)应用创建网络
1 | docker network create todo-net |
使用网络创建mysql容器
1 | 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数据库。
1 | 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 |
1 | --network todo-net # 使用todo-net网络 |
测试结果
测试一下: 打开浏览器 http/localhost:3000/ 看到应用界面,如果没用查看容器日志检查问题,然后插入两条测试数据
再打开命令行执行下面语句
1 | docker exec -it mysql mysql -p todos |
第一个个mysql 是容器名称 第二个是登陆容器后执行命令 mysql 参数 -p toddos 使用数据库 todos
成功后查询数据结果
1
2
3
4
5
6
7
8mysql> 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参数
1 | 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是别名。