三分鐘Docker-鏡像、容器實(shí)戰(zhàn)篇

本文主要內(nèi)容:
Docker 鏡像、容器 常用命令整理
使用Docker常見命令,搭建Consul集群
通過創(chuàng)建自定義鏡像,把.NetCore Api運(yùn)行在Docker中
1.鏡像、容器命令
鏡像
| 序號 | 命令 | 描述 |
|---|---|---|
| 1 | docker image build | 基于Dockerfile創(chuàng)建鏡像 |
| 2 | docker image history | 顯示鏡像的歷史記錄,主要因?yàn)殓R像文件由多個(gè)層組成,那么可以使用該命令知道各個(gè)層的內(nèi)容具體是什么。 |
| 3 | docker image import | Import the contents from a tarball to create a filesystem image |
| 4 | docker image inspect | 顯示鏡像的詳細(xì)信息 |
| 5 | docker image load | 載入鏡像,可以使用該命令將導(dǎo)出的tar文件再導(dǎo)入本地鏡像庫 |
| 6 | docker image ls | 列出本地主機(jī)上安裝的所有鏡像 |
| 7 | docker image prune | 清理一些臨時(shí)的鏡像文件,未被使用的。 |
| 8 | docker image pull | 從registry中拉取鏡像或存儲庫(repository),可以指定Tag(一般用來標(biāo)識版本信息),默認(rèn)會選擇latest標(biāo)簽,下載最新版本的鏡像。 |
| 9 | docker image push | 將鏡像或存儲庫推送到注冊表(registry) |
| 10 | docker image rm | 刪除一個(gè)或多個(gè)鏡像 |
| 11 | docker image save | 存取鏡像,如果要導(dǎo)出鏡像到本地文件,可以使用該命令 |
| 12 | docker image tag | 為本地鏡像添加新的標(biāo)簽。 |
容器
| 序號 | 命令 | 描述 |
|---|---|---|
| 01 | docker container attach | 進(jìn)入容器 |
| 02 | docker container commit | Create a new image from a container’s changes |
| 03 | docker container cp | 在容器和主機(jī)之間復(fù)制文件 |
| 04 | docker container create | 創(chuàng)建容器,狀態(tài)是停止的,需要使用start命令 |
| 05 | docker container diff | 查看容器內(nèi)文件系統(tǒng)的變更 |
| 06 | docker container exec | 可以在運(yùn)行中容器內(nèi)執(zhí)行命令 |
| 07 | docker container export | 導(dǎo)出容器,文件類型后綴tar |
| 08 | docker container inspect | 查看容器詳情 |
| 09 | docker container kill | Kill one or more running containers |
| 10 | docker container logs | 查看容器輸出記錄 |
| 12 | docker container ls | 列出所有容器 |
| 13 | docker container pause | 暫停容器 |
| 14 | docker container port | 查看端口映射 |
| 15 | docker container prune | Remove all stopped containers |
| 16 | docker container rename | Rename a container |
| 17 | docker container restart | Restart one or more containers |
| 18 | docker container rm | 刪除一個(gè)或多個(gè)容器 |
| 19 | docker container run | 運(yùn)行一個(gè)容器,等同于先create、在start命令 |
| 20 | docker container start | 啟動容器 |
| 20 | docker container stats | 查看統(tǒng)計(jì)資源信息(cpu,內(nèi)存,存儲,網(wǎng)絡(luò)等使用情況) |
| 21 | docker container stop | 終止容器 |
| 22 | docker container top | 查看容器內(nèi)進(jìn)程 |
| 23 | docker container unpause | Unpause all processes within one or more containers |
| 24 | docker container update | 更新容器配置 比如啟動方式--restart=always |
| 25 | docker container wait | Block until one or more containers stop, then print their exit codes |
2.使用Docker常見命令,搭建Consul集群
拉取consul鏡像到本地
docker pull consul
運(yùn)行consul容器并且添加服務(wù)節(jié)點(diǎn)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'

單機(jī)版的consul已經(jīng)運(yùn)行起來了,下面搭建個(gè)consul集群
查看consul_server_1容器的ip地址,再添加2個(gè)服務(wù)節(jié)點(diǎn),組成集群
docker inspect --format='{{.NetworkSettings.IPAddress}}' consul_server_1
添加consul_node_2節(jié)點(diǎn)
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節(jié)點(diǎn)
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個(gè)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節(jié)點(diǎn)是不參與leader選舉的,使用如下命令查看
docker exec consul_server_1 consul operator raft list-peers

使用如下命令查看集群情況
docker exec consul_server_1 consul membersconsul參數(shù)解釋:
–net=host docker參數(shù), 使得docker容器越過了net namespace的隔離,免去手動指定端口映射的步驟
-server consul支持以server或client的模式運(yùn)行, server是服務(wù)發(fā)現(xiàn)模塊的核心, client主要用于轉(zhuǎn)發(fā)請求
-advertise 將本機(jī)私有IP傳遞到consul
-retry-join 指定要加入的consul節(jié)點(diǎn)地址,失敗后會重試, 可多次指定不同的地址
-client 指定consul綁定在哪個(gè)client地址上,這個(gè)地址可提供HTTP、DNS、RPC等服務(wù),默認(rèn)是>127.0.0.1
-bind 綁定服務(wù)器的ip地址;該地址用來在集群內(nèi)部的通訊,集群內(nèi)的所有節(jié)點(diǎn)到地址必須是可達(dá)的,>默認(rèn)是0.0.0.0
allow_stale 設(shè)置為true則表明可從consul集群的任一server節(jié)點(diǎn)獲取dns信息, false則表明每次請求都會>經(jīng)過consul的server leader
-bootstrap-expect 數(shù)據(jù)中心中預(yù)期的服務(wù)器數(shù)。指定后,Consul將等待指定數(shù)量的服務(wù)器可用,然后>啟動群集。允許自動選舉leader,但不能與傳統(tǒng)-bootstrap標(biāo)志一起使用, 需要在server模式下運(yùn)行。
-data-dir 數(shù)據(jù)存放的位置,用于持久化保存集群狀態(tài)
-node 群集中此節(jié)點(diǎn)的名稱,這在群集中必須是唯一的,默認(rèn)情況下是節(jié)點(diǎn)的主機(jī)名。
-config-dir 指定配置文件,當(dāng)這個(gè)目錄下有 .json 結(jié)尾的文件就會被加載,詳細(xì)可參考https://www.consul.io/docs/agent/options.html#configuration_files
-enable-script-checks 檢查服務(wù)是否處于活動狀態(tài),類似開啟心跳
-datacenter 數(shù)據(jù)中心名稱
-ui 開啟ui界面
-join 指定ip, 加入到已有的集群中
3.通過創(chuàng)建自定義鏡像,把.NetCore Api運(yùn)行在Docker中
生成Dockerfile文件
本示例使用前幾天分享的項(xiàng)目把AAStore.ProductCatalog.Api,選中項(xiàng)目右鍵->添加->Docker支持,就會看到生產(chǎn)的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"]
構(gòu)建鏡像
docker build -t aastore.productcatalog.api:dev -f F:/codelab/AAStore/AAStore.ProductCatalog.Api/Dockerfile .

鏡像構(gòu)建成功了,可以使用docker image ls查看鏡像
運(yùn)行容器
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 如何構(gòu)建容器化應(yīng)用)
