阅读目录:
Docker 应用: Hello World
前言:
昨天完成了 Docker 入门示例 (Docker 应用: Hello World), 示例只是粗略展示了单机应用在 Docker 中部署的大概流程;
但是即使先不考虑大型项目关联的多个应用服务, 单单只是单机应用部署来说, 过程也是略为复杂.
因为现在的软件公司开发, 测试, 部署基本上分开, 甚至交由不同的人完成各个阶段的工作, 如果软件部署要敲写大量的命令,
那还是很容易出错; 甚至有些公司只是运维人员, 工程人员在部署, 一旦出了问题, 他们想找到原因基本很难.
所以要求部署必须是接近傻瓜式的, 所以有了容器编排技术.
一, 遗留问题
昨天的示例是遗留有一些问题的, 比如容器重启后 IP 地址变化, 容器重启后应用相关的远程容器服务都将失效, 这点是非常致命的.
第二是网络通信问题, 昨天的示例中 web 调用 MySQL 是通过 ip 映射, 出到容器外部在访问另外一个容器内部的数据, 如下:
1 conn = new MySqlConnection("server=198.198.198.181;User Id=root;password=mima2100;Database=mysql-db");
198.198.198.181 是我本地机器的局域网 IP, 由于这个 IP, 导致 Web 应用对 MySQL 容器有了硬耦合, 得想办法去掉.
二, 解决问题
1, 其实也简单, 在 Dockerfile 文件相同目录创建 docker-compose.YAML 文件
- version: '3'
- services:
- Web:
- build: .
- ports:
- - "8000:80"
- depends_on:
- - MySQL
- MySQL:
- container_name: mysql_dc
- environment:
- - MYSQL_ROOT_PASSWORD=mima2100
- image: MySQL
- ports:
- - "3306:3306"
2, 上边的 docker-compose.YAML 文件格式, 其他参数各自百度一下, 意思就是创建 2 个应用: Web,MySQL
2.1,Web 在本直接 build(也有从镜像下载的方式),80 端口映射到本地 8000 端口, 依赖 MySQL
2.2,MySQL 指定登录密码 mima2100, 容器 3306 端口映射到本地 3306
2.3,MySQL 连接改成如下:
- using Dapper;
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Threading.Tasks;
- using MySQL.Data.MySqlClient;
- namespace WebApp_HelloWorld.Controllers
- {
- public class DBService
- {
- protected IDbConnection conn;
- public DBService()
- {
- conn = new MySqlConnection("server=mysql_dc;User Id=root;password=mima2100;Database=mysql-db");
- }
- public async Task<T> Single<T>(string sql, object paramPairs = null)
- {
- return await conn.QuerySingleOrDefaultAsync<T>(sql, paramPairs);
- }
- public async Task<int> Count(string sql, object paramPairs = null)
- {
- return await conn.QuerySingleOrDefaultAsync<int>(sql, paramPairs);
- }
- }
- }
三, 验证
1, 验证一下 docker-compose 版本
1 docker-compose version
2, 定位到 Web 目录, 输入指令
1 docker-compose up -d
3, 查看容器
1 docker ps -a
可以看到 MySQL 与 Web 都创建成功了, 无报错.
4, 访问一下 localhost:8000
搞定..
来源: https://www.cnblogs.com/lanxiaoke/p/10439282.html