前言:
当前的服务越来越多的构建在了Docker中,web、api、db、nginx等等都在Docker中构建运行。本文结合实际项目,使用docker-compose工具启动运行服务,配置文件使用docker-compose.yml以及Dockerfile构建镜像的方式,概述了整个使用过程。
1. 在项目根目录创建Dockerfile
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Bionic.Api/Bionic.Api.csproj", "Bionic.Api/"]
COPY ["Bionic.Basic.Service/Bionic.Base.Service.csproj", "Bionic.Basic.Service/"]
COPY ["Bionic.Core/Bionic.Core.csproj", "Bionic.Core/"]
COPY ["Bionic.Device.Service/Bionic.Device.Service.csproj", "Bionic.Device.Service/"]
COPY ["Bionic.DataAnalysis.Service/Bionic.DataAnalysis.Service.csproj", "Bionic.DataAnalysis.Service/"]
RUN dotnet restore "Bionic.Api/Bionic.Api.csproj"
COPY . .
WORKDIR "/src/Bionic.Api"
RUN dotnet build "Bionic.Api.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Bionic.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Bionic.Api.dll"]
-
放一张项目结构图
项目结构
2. 忽略docker构建无关文件
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md
3. 编写yml配置文件
这里我单独放到了Deploy目录下,里面配置了docker-compose.yml
,也为了放置volumes映射文件,
docker-compose.yml
内容如下
version: '3.1'
services:
web_api:
build:
context: ../
dockerfile: Dockerfile
image: bionic_api
container_name: bionic_api
restart: unless-stopped
environment: # 设置环境变量,相当于docker run命令中的-e
TZ: Asia/Shanghai
LANG: en_US.UTF-8
volumes:
- "./docs:/app/docs"
- "./logs:/app/logs"
ports:
- "5000:80"
depends_on:
- postgres_db
networks:
- bionic_net
postgres_db:
image: postgres:14.2
container_name: postgresql
volumes:
- ./pgdata:/var/lib/postgresql/data
restart: always
environment:
POSTGRES_USER: bionic #在此填写postgres的用户名
POSTGRES_PASSWORD: abc_123! #在此填写posgres的数据库密码
POSTGRES_DB: bionic_test #在此填写postgres的数据库名,默认是postgres
TZ: Asia/Shanghai
LANG: en_US.UTF-8
ports:
- "1001:5432"
networks:
- bionic_net
networks:
bionic_net:
driver: "bridge"
volumes:
pgdata: {}
注意事项:
- 编写web_api时注意 build 的上下文路径,这里要定位到上级跟目录,所有
build: context: ../
使用的是../
相对的上级目录
- 编写web_api时注意 build 的上下文路径,这里要定位到上级跟目录,所有
- web_api 的volumes目录应注意确定docker内部的具体位置,可在Dockerfile中查看
workdir
路径,我的就是上面Dockerfile中的/app
路径,也可使用docker attach container_name
命令进入容器中查看实际的位置
- web_api 的volumes目录应注意确定docker内部的具体位置,可在Dockerfile中查看
- 使用depends_on依赖其他服务,只有依赖的服务启动成功后,该服务才会开始启动。如上web_api中使用depends_on中依赖了postgres_db,故web_api服务在db服务后面启动
- 将web_api的网络与db的网络联系起来,因每个服务都有一个独立的虚拟网卡,各自并不能访问。docker内部实现了使用服务名的方式访问不同的Service,前提是networks都映射到同一个网卡上。
在yml文件根级放上
- 将web_api的网络与db的网络联系起来,因每个服务都有一个独立的虚拟网卡,各自并不能访问。docker内部实现了使用服务名的方式访问不同的Service,前提是networks都映射到同一个网卡上。
...
networks:
bionic_net:
driver: "bridge"
然后在每个Service中都配置相同的networks
services:
xxx:
....
networks:
- bionic_net
这样配置之后web_api服务就可以使用{服务名}:{容器内部端口号}
的形式访问其他服务了
如我的appsettings.json的配置
{
"Postgresql": "Host=postgres_db;Port=5432;Database=bionic_test;Username=bionic;Password=abc_123!",
}
【重点】代码配置这里一定要注意Port是容器内部端口号,不是外部的映射端口号哦。如我的db端口号配置为ports: - 1001:5432
,1001是外部的宿主机端口号,5432是容器内部端口号。
4. 运行docker
将命令行定位到docker-compose.yml文件目录位置
docker-compose up -d
初次运行up会自动构建build,但是如果有代码改动,需要重新build,命令如下
docker-compose build
然后在up起来即可
docker-compose up -d
5. 查看docker中的网络
docker network ls
NETWORK ID NAME DRIVER SCOPE
095175a509bf bridge bridge local
1c25f2553faf deploy_bionic_net bridge local
40fa153f0d09 host host local
1d5667a6d547 none null local
可知networks中多了deploy_bionic_net
这个虚拟网卡
docker-compose的网络名的规则是:<当前路径名_networks>
docker-compose使用环境变量来取代路径名。
在docker-compose.yml同级目录下新建.env
文件,并写入环境变量
设置环境变量:COMPOSE_PROJECT_NAME
$ cat .env
COMPOSE_PROJECT_NAME=aaa
此时docker-compose的网络名的规则是:<COMPOSE_PROJECT_NAME>_<NETWORKS>
总体规则就是:
- 1、如果没有定义networks,那么就是default。
- 2、如果没有环境变量COMPOSE_PROJECT_NAME,那么就是当前路径名(取前缀)。
查看官网docker-networks https://docs.docker.com/compose/networking/
6. 更新web_api
当所有服务都运行起来之后,更新部署时可以部分service build
以及部分service up
- 重新构建web_api
docker-compose build web_api
- 单独重新up启动web_api
docker-compose up -d --no-deps web_api
使用--no-deps
参数后依赖项就不重新启停
7. 开发阶段
开发阶段只启动依赖服务,不需要用docker启动web_api, 因为web_api需要单独从IDE启动并调试. 此时可以单独再写一个yml文件,如下: 文件名为docker-compose-dev.yml
version: '3.1'
services:
# # 开发阶段不使用docker启动web_api
# web_api:
# build:
# context: ../
# dockerfile: Dockerfile
# image: bionic_api
# container_name: bionic_api
# restart: unless-stopped
# environment: # 设置环境变量,相当于docker run命令中的-e
# TZ: Asia/Shanghai
# LANG: en_US.UTF-8
# volumes:
# - "./docs:/app/docs"
# - "./logs:/app/logs"
# ports:
# - "5000:80"
# depends_on:
# - postgres_db
# - redis
# - rabbitmq
# - influxdb
# networks:
# - bionic_net
postgres_db:
image: postgres:14.2
container_name: postgresql
volumes:
- ./pgdata:/var/lib/postgresql/data
restart: always
environment:
POSTGRES_USER: bionic #在此填写postgres的用户名
POSTGRES_PASSWORD: abc_123! #在此填写posgres的数据库密码
POSTGRES_DB: bionic_test #在此填写postgres的数据库名,默认是postgres
TZ: Asia/Shanghai
LANG: en_US.UTF-8
ports:
- "1001:5432"
networks:
- bionic_net
networks:
bionic_net:
driver: "bridge"
volumes:
pgdata: {}
指定-f
参数, 启动docker-compose-dev.yml
文件
docker-compose -f docker-compose-dev.yml up -d
总结
以上就是一个完整项目的docker-compose部署过程,当然dockerfile如何写,yml如何配置并没有具体说明,这个还要小伙伴自己去学习,本文主要将docker-compose工具构建发布的过程讲述了一遍,并说明了一些注意事项,让各位小伙伴对docker-compose能有个大体的轮廓。
作者:wwmin
本文链接:https://www.jianshu.com/p/117ea6b11c5d
转载请注明出处!
微信公众号: DotNet技术说
如果您觉得文章对您有帮助,关注点赞,您的鼓励是博主的最大动力!
网友评论