1. 什么是 Docker-Compose
上一章我们讲了通过 Dockerfile 创建镜像, 这在一个小项目中是没问题的, 但如果在一个包含多个项目的情况下, 我们每次部署都需要执行多次创建镜像与运行容器的命令, 这样就比较麻烦, 为了解决这种情况, Docker-Compose 出现了. Docker-Compose 主要就是为了解决在一台服务器创建镜像与运行容器复杂的问题, 有了 Docker-Compose 我们就可以通过一条命令, 生成多镜像与运行容器.
2.Docker-Compose 安装
- sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- sudo chmod +x /usr/local/bin/docker-compose
查看安装是否成功
3. 创建两个. netcore 项目, 不启用 https
ServerProvider 项目
新增 Dockerfile
- FROM microsoft/dotnet:2.1-aspnetcore-runtime
- MAINTAINER yishi.chen
- LABEL description="this is a serverprovider website"
- LABEL version="1.0"
- ARG serverport
- WORKDIR /App
- COPY bin/Release/netcoreapp2.1/publish/ .
- EXPOSE $serverport
- ENTRYPOINT ["dotnet","ServerProvider.dll"]
Program.cs 改动
- public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseUrls($"http://*:{Environment.GetEnvironmentVariable("serverport")}")
- .UseStartup<Startup>();
ValuesController.cs 改动
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore.Mvc;
- namespace ServerProvider.Controllers
- {
- [Route("api/[controller]")]
- [ApiController]
- public class ValuesController : ControllerBase
- {
- // GET API/values
- [HttpGet]
- public ActionResult<IEnumerable<string>> Get()
- {
- return new string[] { "this is serverprovider's result" };
- }
- }
- }
ServerConsumer 项目
新增 Dockerfile
- FROM microsoft/dotnet:2.1-aspnetcore-runtime
- MAINTAINER yishi.chen
- LABEL description="this is a serverconsumer website"
- LABEL version="1.0"
- ARG consumerport
- WORKDIR /App
- COPY bin/Release/netcoreapp2.1/publish/ .
- EXPOSE $consumerport
- ENTRYPOINT ["dotnet","ServerComsumer.dll"]
Program.cs 改动
- public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseUrls($"http://*:{Environment.GetEnvironmentVariable("consumerport")}")
- .UseStartup<Startup>();
ValueController.cs 改动
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.NET.Http;
- using System.NET.Http.Headers;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore.Mvc;
- namespace ServerComsumer.Controllers
- {
- [Route("api/[controller]")]
- [ApiController]
- public class ValuesController : ControllerBase
- {
- // GET API/values
- [HttpGet]
- public ActionResult<IEnumerable<string>> Get()
- {
- return new string[] { "value1", "value2" };
- }
- // GET API/values/5
- [HttpGet("{id}")]
- public async Task<ActionResult<string>> Get(int id)
- {
- var httpClient = new HttpClient();
- httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
- return await httpClient.GetAsync(Environment.GetEnvironmentVariable("serverurl")).Result.Content.ReadAsStringAsync();
- }
- }
- }
新建 docker-compose.YAML 编排文件
内容如下 (docker-compose 的配置请见 https://www.cnblogs.com/chenyishi/p/9965479.html):
- version: '3'
- services:
- s_provider:
- build:
- context: ./ServerProvider/
- dockerfile: Dockerfile
- args:
- serverport: 1000
- ports:
- - "1000:1000"
- environment:
- serverport: 1000
- container_name: c_provider
- s_consumer:
- build:
- context: ./ServerComsumer/
- dockerfile: Dockerfile
- args:
- consumerport: 2000
- ports:
- - "2000:2000"
- links:
- - s_provider:s_provider
- environment:
- consumerport: 2000
- serverurl: http://s_provider:1000/API/values/
- container_name: c_consumer
4. 定位到 docker-compose 文件所在目录, 运行 docker-compose
[root@cys-test-CentOS WebDocker]# docker-compose up
运行成功, 状态如下:
5. 另起一个命令窗口, 测试接口
- [root@cys-test-CentOS ~]# curl http://localhost:1000/API/values
- ["this is serverprovider's result"]
- root@cys-test-CentOS ~]# curl http://localhost:2000/API/values
- ["value1","value2"]
- [root@cys-test-CentOS ~]# curl http://localhost:2000/API/values/1
- ["this is serverprovider's result"]
以上是通过 docker-compose 新建镜像, 并运行容器, 如果镜像已存在, 则可以去掉构建的过程, 我们稍微对 docker-compose 文件做一下调整
6. 在上面步骤的前提下, 先 CtrlC 停止容器, 然后 docker-compsoe down 删除容器
- [root@cys-test-CentOS WebDocker]# docker-compose down
- Removing c_consumer ... done
- Removing c_provider ... done
- Removing network webdocker_default
7. 查看生成的镜像
- [root@cys-test-CentOS WebDocker]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- webdocker_s_consumer latest cc95654856e1 17 minutes ago 253MB
- webdocker_s_provider latest 5b744758b56b 17 minutes ago 253MB
- microsoft/dotnet 2.1-aspnetcore-runtime db366d73508b 4 days ago 253MB
镜像名为: webdocker_s_provider 与 webdocker_s_consumer
8. 修改 docker-compose.YAML 文件
- version: '3'
- services:
- s_provider:
- image: webdocker_s_provider
- ports:
- - "1000:1000"
- environment:
- serverport: 1000
- container_name: c_provider
- s_consumer:
- image: webdocker_s_consumer
- ports:
- - "2000:2000"
- links:
- - s_provider:s_provider
- environment:
- consumerport: 2000
- serverurl: http://s_provider:1000/API/values/
- container_name: c_consumer
9. 验证接口
- [root@cys-test-CentOS ~]# curl http://localhost:2000/API/values/1
- ["this is serverprovider's result"]
到此 Docker-Compose 介绍完毕, 下一章讲 Docker 三剑客之 Docker-machine
来源: https://www.cnblogs.com/chenyishi/p/10000693.html