最近一直在研究和实践ASP.NET Core、Docker、持续集成。在ASP.NET Core 和 Dcoker结合下遇到了一些坑,在此记录和分享,希望对大家有一些帮助。
二.中间镜像我前面写过一个 《ASP.NET Core & Docker 零基础持续集成 》的教程。里面我们通过持续集成工具Jenkins构建Docker镜像并运行容器,采用的是Docker Compose来进行编排构建运行的(Visual Studio 2017添加Docker支持是采用的Docker Compose)。细心的朋友可能会发现,每次构建完毕以后通过docker images命令查询,可以发现多了许多没有名称()的镜像。这些都是构建过程中的中间镜像,我们可以在构建完成以后 进行统一删除。
删除所有无名称镜像:
docker rmi $(docker images -f "dangling=true" -q)此命令应当加在构建的最后一步,示例:
echo ---------------Remove-Orphans------------------ docker-compose -f src/docker-compose.yml -f src/docker-compose.override.yml -p alipaydemo down --rmi local --remove-orphans echo ---------------Publishing...------------------ docker-compose -f "src/docker-compose.yml" -f "src/docker-compose.override.yml" -p alipaydemo up -d --build echo ---------------Clear-Images...------------------ docker rmi $(docker images -f "dangling=true" -q)执行之后会看到以下效果:
这是非常有必要的,因为如果每次构建都残留一些中间镜像,会额外消耗我们的磁盘空间的。
三.固定容器外部端口这里主要讲的是在自动化构建的过程中,通过docker compose来运行容器的外部端口,而不是直接通过docker run命令来指定。
我们通过Visual Studio 2017添加Docker支持(Docker Compose),通过Docker Compose编排构建运行容器,我们会发现每次构建以后,运行的容器的外部端口都不是固定的,比如32774、32775、32776等等。这对于我们设置了Nginx反向代理和API Gateway等配置的肯定是十分不方便的,我们每次构建完毕以后还要去改这些配置,不是扯淡吗。所以我们需要固定我们容器运行的外部端口,我们可以通过改变docker compose的yml文件来固定容器的外部端口。
Visual Studio 2017 添加的Docker支持所生成的文件有如下结构:
我是用的版本为VS2017 15.6.5。如果是更早的版本添加Docker支持可能会多出一个docker-compose.ci.build.yml文件,其实这一步没必要,目前的最新的VS2017已经移除了该文件。
我们固定容器外部端口需要修改的是docker-compose.override.yml文件,我们需要修改的是ports。默认为:
ports: - "80"这个80端口只是容器的内部端口,我们进行如下修改来知道容器运行时映射到服务器的端口也就是外部端口:
ports: - "32775:80"通过上面的设置,我们将容器的外部端口指定为32775,这样我们在构建完成以后,容器运行以后的外部端口都将会为32775,无需再次修改Nginx反向代理等配置。
四.设置镜像版本我们的应用程序具有不同的版本号,我们不同版本的应用程序构建出来的镜像应该也是具有不同的版本的,我们可以通过设置镜像的Tag来表示不同的版本:
我们同样可以在docker compose的yml里面进行设置,这次修改的是docker-compose.yml文件,我们直接在镜像的名称后面设置Tag,语法为:
image: <镜像名称>:<Tag>比如我设置一个名为alipaydemo的镜像Tag为V1:
image: alipaydemo:v1完整的配置分享:
version: '3' services: alipay.demo.pcpayment: image: alipaydemopcpayment:v1 container_name: alipaydemocontainer build: context: . dockerfile: Alipay.Demo.PCPayment/Dockerfile 五.设置容器名称我们在通过docker compose运行的容器将会被指定一个默认的容器名称,如果是第四节的配置,那么容器的默认名称为alipaydemopcpayment.alipay.demo.pcpayment.build_1,具有非常一长串,此时我们可以自己来指定这个容器的名称,同样我们需要修改docker-compose.yml文件,设置容器名称的命令格式为:
container_name: <容器名称>完整的配置分享:
version: '3' services: alipay.demo.pcpayment: image: alipaydemopcpayment:v1 container_name: alipaydemocontainer build: context: . dockerfile: Alipay.Demo.PCPayment/Dockerfile通过上面的配置我们将容器名称设置为了alipaydemocontainer