三分钟Docker-镜像、容器实战篇

dotNET知音

共 5727字,需浏览 12分钟

 · 2020-07-28

本文主要内容:

  1. Docker 镜像、容器 常用命令整理

  2. 使用Docker常见命令,搭建Consul集群

  3. 通过创建自定义镜像,把.NetCore Api运行在Docker中

1.镜像、容器命令

镜像
序号命令描述
1docker image build基于Dockerfile创建镜像
2docker image history显示镜像的历史记录,主要因为镜像文件由多个层组成,那么可以使用该命令知道各个层的内容具体是什么。
3docker image importImport the contents from a tarball to create a filesystem image
4docker image inspect显示镜像的详细信息
5docker image load载入镜像,可以使用该命令将导出的tar文件再导入本地镜像库
6docker image ls列出本地主机上安装的所有镜像
7docker image prune清理一些临时的镜像文件,未被使用的。
8docker image pull从registry中拉取镜像或存储库(repository),可以指定Tag(一般用来标识版本信息),默认会选择latest标签,下载最新版本的镜像。
9docker image push将镜像或存储库推送到注册表(registry)
10docker image rm删除一个或多个镜像
11docker image save存取镜像,如果要导出镜像到本地文件,可以使用该命令
12docker image tag为本地镜像添加新的标签。
容器
序号命令描述
01docker container attach进入容器
02docker container commitCreate a new image from a container’s changes
03docker container cp在容器和主机之间复制文件
04docker container create创建容器,状态是停止的,需要使用start命令
05docker container diff查看容器内文件系统的变更
06docker container exec可以在运行中容器内执行命令
07docker container export导出容器,文件类型后缀tar
08docker container inspect查看容器详情
09docker container killKill one or more running containers
10docker container logs查看容器输出记录
12docker container ls列出所有容器
13docker container pause暂停容器
14docker container port查看端口映射
15docker container pruneRemove all stopped containers
16docker container renameRename a container
17docker container restartRestart one or more containers
18docker container rm删除一个或多个容器
19docker container run运行一个容器,等同于先create、在start命令
20docker container start启动容器
20docker container stats查看统计资源信息(cpu,内存,存储,网络等使用情况)
21docker container stop终止容器
22docker container top查看容器内进程
23docker container unpauseUnpause all processes within one or more containers
24docker container update更新容器配置 比如启动方式--restart=always
25docker container waitBlock until one or more containers stop, then print their exit codes

2.使用Docker常见命令,搭建Consul集群

拉取consul镜像到本地
docker pull consul
运行consul容器并且添加服务节点consul_node_1和consul管理界面
  docker run -d -p 8500:8500 -v /data/consul:/consul/data -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_1 consul agent -server  -bootstrap -ui -node=consul_node_1 -client='0.0.0.0'

单机版的consul已经运行起来了,下面搭建个consul集群

查看consul_server_1容器的ip地址,再添加2个服务节点,组成集群
docker inspect --format='{{.NetworkSettings.IPAddress}}' consul_server_1
添加consul_node_2节点
 docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_2 consul agent -server -node=consul_node_2  -join='172.17.0.2'
添加consul_node_3节点
docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_3 consul agent -server -node=consul_node_3  -join='172.17.0.2'
最后添加3个client 加入集群
docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_4 consul agent -client -node=consul_node_4 -join='172.17.0.2' -client='0.0.0.0'


docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_5 consul agent -client -node=consul_node_5 -join='172.17.0.2' -client='0.0.0.0'


docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_6 consul agent -client -node=consul_node_5 -join='172.17.0.2' -client='0.0.0.0'
在浏览器输入localhost:8500,查看集群信息

client节点是不参与leader选举的,使用如下命令查看

 docker exec consul_server_1 consul operator raft list-peers

使用如下命令查看集群情况

docker exec consul_server_1 consul members
consul参数解释:
  • –net=host docker参数, 使得docker容器越过了net namespace的隔离,免去手动指定端口映射的步骤

  • -server consul支持以server或client的模式运行, server是服务发现模块的核心, client主要用于转发请求

  • -advertise 将本机私有IP传递到consul

  • -retry-join 指定要加入的consul节点地址,失败后会重试, 可多次指定不同的地址

  • -client 指定consul绑定在哪个client地址上,这个地址可提供HTTP、DNS、RPC等服务,默认是>127.0.0.1

  • -bind 绑定服务器的ip地址;该地址用来在集群内部的通讯,集群内的所有节点到地址必须是可达的,>默认是0.0.0.0

  • allow_stale 设置为true则表明可从consul集群的任一server节点获取dns信息, false则表明每次请求都会>经过consul的server leader

  • -bootstrap-expect 数据中心中预期的服务器数。指定后,Consul将等待指定数量的服务器可用,然后>启动群集。允许自动选举leader,但不能与传统-bootstrap标志一起使用, 需要在server模式下运行。

  • -data-dir 数据存放的位置,用于持久化保存集群状态

  • -node 群集中此节点的名称,这在群集中必须是唯一的,默认情况下是节点的主机名。

  • -config-dir 指定配置文件,当这个目录下有 .json 结尾的文件就会被加载,详细可参考https://www.consul.io/docs/agent/options.html#configuration_files

  • -enable-script-checks 检查服务是否处于活动状态,类似开启心跳

  • -datacenter 数据中心名称

  • -ui 开启ui界面

  • -join 指定ip, 加入到已有的集群中

3.通过创建自定义镜像,把.NetCore Api运行在Docker中

生成Dockerfile文件

本示例使用前几天分享的项目把AAStore.ProductCatalog.Api,选中项目右键->添加->Docker支持,就会看到生产的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/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 8081
EXPOSE 18081

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["AAStore.ProductCatalog.Api/AAStore.ProductCatalog.Api.csproj", "AAStore.ProductCatalog.Api/"]
COPY ["AAStore.ProductCatalog/AAStore.ProductCatalog.csproj", "AAStore.ProductCatalog/"]
COPY ["AAStore.ProductCatalog.DataContracts/AAStore.ProductCatalog.DataContracts.csproj", "AAStore.ProductCatalog.DataContracts/"]
RUN dotnet restore "AAStore.ProductCatalog.Api/AAStore.ProductCatalog.Api.csproj"

COPY . .
WORKDIR "/src/AAStore.ProductCatalog.Api"
RUN dotnet build "AAStore.ProductCatalog.Api.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "AAStore.ProductCatalog.Api.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "AAStore.ProductCatalog.Api.dll"]

构建镜像

docker build -t aastore.productcatalog.api:dev -f F:/codelab/AAStore/AAStore.ProductCatalog.Api/Dockerfile .

镜像构建成功了,可以使用docker image ls查看镜像

运行容器

docker run --name aastore.productcatalog.api.service.001 --restart=always -d -p 8081:8081 aastore.productcatalog.api:dev

最后输入url:http://localhost:8081/api/product/get,查看部署的是否成功 图:

参考:

https://docs.docker.com/engine/reference/commandline/image/

https://docs.microsoft.com/zh-cn/visualstudio/containers/container-build?view=vs-2019(Visual Studio 如何构建容器化应用)


浏览 36
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报