CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose
程序员文章站
2024-02-01 11:31:58
1.什么是Docker-Compose 上一章我们讲了通过Dockerfile创建镜像,这在一个小项目中是没问题的,但如果在一个包含多个项目的情况下,我们每次部署都需要执行多次创建镜像与运行容器的命令,这样就比较麻烦,为了解决这种情况,Docker-Compose出现了。Docker-Compose ......
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.yml编排文件
内容如下(docker-compose的配置请见):
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.yml文件
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"]