.NET Core容器化@Docker

溫馨提示:本文適合動(dòng)手演練槽华,效果更佳。


.NET Core容器化@Docker
.NET Core容器化之多容器應(yīng)用部署@Docker-Compose
.NET Core+MySql+Nginx 容器化部署

1. 引言

我們知道. NET Core最大的特性之一就是跨平臺(tái)趟妥,而對(duì)于跨平臺(tái)硼莽,似乎大家印象中就是可以在非Windows系統(tǒng)上部署運(yùn)行。而至于如何操作煮纵,可能就有所欠缺懂鸵。那這一節(jié)我們就結(jié)合簡(jiǎn)單實(shí)例一步一步教你如何借助Docker來(lái)容器化 .NET Core應(yīng)用,以完成跨平臺(tái)的構(gòu)建和部署行疏。

2. 環(huán)境準(zhǔn)備

自從玩.NET就一直和Windows系統(tǒng)打交道匆光,如果還基于Windows來(lái)展開本節(jié)內(nèi)容,不就跑題了嗎酿联?终息!那咱們就切換到Linux系統(tǒng)夺巩。
如果沒有Linux基礎(chǔ)和Docker基礎(chǔ),請(qǐng)自覺完成以下兩個(gè)實(shí)驗(yàn):
騰訊云開發(fā)者實(shí)驗(yàn)室:Linux 基礎(chǔ)入門
騰訊云開發(fā)者實(shí)驗(yàn)室:搭建 Docker 環(huán)境

完成了以上兩個(gè)實(shí)驗(yàn)后周崭,我們就離Linux的世界更近一步柳譬。
因?yàn)楹罄m(xù)是基于Linux-CentOS系統(tǒng)進(jìn)行實(shí)操演練,沒有Linux上機(jī)環(huán)境的续镇,可以考慮從騰訊云實(shí)驗(yàn)室列表找一個(gè)CentOS相關(guān)的實(shí)驗(yàn)項(xiàng)目作為本文的演練環(huán)境美澳。

3. Docker簡(jiǎn)介

在開始之前,有必要對(duì)Docker做一下簡(jiǎn)單了解摸航,可以參考我的上一篇文章Hello Docker制跟。
這里就簡(jiǎn)要的再重復(fù)一下。
Docker是用Go語(yǔ)言編寫基于Linux操作系統(tǒng)的一些特性開發(fā)的酱虎,其提供了操作系統(tǒng)級(jí)別的抽象雨膨,是一種容器管理技術(shù),它隔離了應(yīng)用程序?qū)A(chǔ)架構(gòu)(操作系統(tǒng)等)的依賴读串。相較于虛擬機(jī)而言聊记,Docker共享的是宿主機(jī)的硬件資源,使用容器來(lái)提供獨(dú)立的運(yùn)行環(huán)境來(lái)運(yùn)行應(yīng)用恢暖。虛擬機(jī)則是基于Supervisor(虛擬機(jī)管理程序)使用虛擬化技術(shù)來(lái)提供隔離的虛擬機(jī)排监,在虛擬機(jī)的操作系統(tǒng)上提供運(yùn)行環(huán)境!雖然兩者都提供了很好的資源隔離胀茵,但很明顯Docker的虛擬化開銷更低社露!
Docker涉及了三個(gè)核心概念:Register、Image琼娘、Container峭弟。

  1. Registry:倉(cāng)庫(kù)。用來(lái)存儲(chǔ)Docker鏡像脱拼,比如Docker官方的Docker Hub就是一個(gè)公開的倉(cāng)庫(kù)瞒瘸,在上面我們可以下載我們需要的鏡像。
  2. Image:鏡像熄浓。開發(fā)人員創(chuàng)建一個(gè)應(yīng)用程序或服務(wù)情臭,并將它及其依賴關(guān)系打包到一個(gè)容器鏡像中。鏡像是應(yīng)用程序的配置及其依賴關(guān)系的靜態(tài)形式赌蔑。
  3. Container:容器俯在。Container是鏡像的運(yùn)行實(shí)例,它是一個(gè)隔離的娃惯、資源受控的可移植的運(yùn)行時(shí)環(huán)境跷乐,其中包含操作系統(tǒng)、需要運(yùn)行的程序趾浅、運(yùn)行程序的相關(guān)依賴愕提、環(huán)境變量等馒稍。

它們?nèi)叩南嗷プ饔藐P(guān)系是:
當(dāng)我們執(zhí)行Docker pull或Docker run命令時(shí),若本地?zé)o所需的鏡像浅侨,那么將會(huì)從倉(cāng)庫(kù)(一般為DockerHub)下載(pull)一個(gè)鏡像纽谒。Docker執(zhí)行run方法得到一個(gè)容器,用戶在容器里執(zhí)行各種操作如输。Docker執(zhí)行commit方法將一個(gè)容器轉(zhuǎn)化為鏡像鼓黔。Docker利用login、push等命令將本地鏡像推送(push)到倉(cāng)庫(kù)挨决。其他機(jī)器或服務(wù)器上就可以使用該鏡像去生成容器请祖,進(jìn)而運(yùn)行相應(yīng)的應(yīng)用程序订歪。

4. 安裝Docker

4.1. 使用腳本自動(dòng)安裝Docker

在測(cè)試或開發(fā)環(huán)境中 Docker 官方為了簡(jiǎn)化安裝流程脖祈,提供了一套便捷的安裝腳本,CentOS系統(tǒng)上可以使用這套腳本安裝:

//使用腳本自動(dòng)化安裝Docker
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

執(zhí)行這個(gè)命令后刷晋,腳本就會(huì)自動(dòng)的將一切準(zhǔn)備工作做好盖高,并且把 Docker CE 的 Edge 版本安裝在系統(tǒng)中。

4.2. 啟動(dòng)Docker

下面執(zhí)行以下命令啟動(dòng)Docker眼虱。

//啟動(dòng) Docker CE
$ sudo systemctl enable docker
$ sudo systemctl start docker
//查看docker版本
$ sudo docker -v
Docker version 1.12.6, build ec8512b/1.12.6

4.3 測(cè)試Docker是否正確安裝

命令行執(zhí)行docker run hello-world

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/

當(dāng)執(zhí)行docker run hello-world時(shí)喻奥,docker首先會(huì)從本地找hello-world的鏡像,如果本地沒有捏悬,它將會(huì)從默認(rèn)的鏡像倉(cāng)庫(kù)Docker Hub上拉取鏡像撞蚕。鏡像拉取到本地后,就實(shí)例化鏡像得到容器过牙,輸出Hello from Docker!甥厦。

4.4. 配置鏡像加速

因?yàn)槟J(rèn)的鏡像倉(cāng)庫(kù)遠(yuǎn)在國(guó)外,拉取一個(gè)小的鏡像時(shí)間還可以忍受寇钉,若拉取一個(gè)上G的鏡像就有點(diǎn)太折磨人了刀疙,我們使用DaoCloud鏡像加速器來(lái)進(jìn)行鏡像加速。Linux上配置方法如下:

$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://37bb3af1.m.daocloud.io`
$ sudo systemctl restart docker

5. Hello Docker With .NET Core

Docker安裝完畢扫倡,我們來(lái)結(jié)合.NET Core玩一玩吧谦秧。

5.1. 拉取microsoft/dotnet鏡像

命令行執(zhí)行docker pull microsoft/dotnet,等幾分鐘后即可安裝完畢撵溃,執(zhí)行docker images可以看到本地已經(jīng)包含microsoft/dotnet疚鲤、docker.io/hello-world兩個(gè)鏡像。

5.2. 運(yùn)行microsoft/dotnet鏡像

使用docker run <image>可以啟動(dòng)鏡像缘挑,通過指定參數(shù)-it以交互模式(進(jìn)入容器內(nèi)部)啟動(dòng)集歇。依次執(zhí)行以下命令:

//啟動(dòng)一個(gè)dotnet鏡像
$ docker run -it microsoft/dotnet
//創(chuàng)建項(xiàng)目名為HelloDocker.Web的.NET Core MVC項(xiàng)目
dotnet new mvc -n HelloDocker.Web
//進(jìn)入HelloDocker.Web文件夾
cd HelloDocker.Web
//啟動(dòng).NET Core MVC項(xiàng)目
dotnet run

運(yùn)行結(jié)果如下所示:

[root@iZ288a3qazlZ ~]# docker run -it microsoft/dotnet
root@816b4e94de67:/# dotnet new mvc -n HelloDocker.Web
The template "ASP.NET Core Web App (Model-View-Controller)" was created successfully.
This template contains technologies from parties other than Microsoft, see https://aka.ms/template-3pn for details.

Processing post-creation actions...
Running 'dotnet restore' on HelloDocker.Web/HelloDocker.Web.csproj...
  Restoring packages for /HelloDocker.Web/HelloDocker.Web.csproj...
  Generating MSBuild file /HelloDocker.Web/obj/HelloDocker.Web.csproj.nuget.g.props.
  Generating MSBuild file /HelloDocker.Web/obj/HelloDocker.Web.csproj.nuget.g.targets.
  Restore completed in 1.83 sec for /HelloDocker.Web/HelloDocker.Web.csproj.
  Restoring packages for /HelloDocker.Web/HelloDocker.Web.csproj...
  Restore completed in 376.14 ms for /HelloDocker.Web/HelloDocker.Web.csproj.

Restore succeeded.

root@816b4e94de67:/# cd HelloDocker.Web
root@816b4e94de67:/HelloDocker.Web# dotnet run
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {727df196-978f-4df8-b3d3-e92a77e410ee} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /HelloDocker.Web
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

鍵盤按住Ctrl+C即可關(guān)閉應(yīng)用,輸入exit即可退出當(dāng)前容器卖哎。

是不是簡(jiǎn)單的幾步就完成了一個(gè).NET Core MVC項(xiàng)目的創(chuàng)建和運(yùn)行鬼悠?删性!這個(gè)時(shí)候你可能會(huì)好奇,Linux宿主機(jī)上并沒有安裝.NET Core SDK啊焕窝,MVC項(xiàng)目是如何創(chuàng)建的呢蹬挺?這就是Docker神奇的地方,我們從鏡像倉(cāng)庫(kù)中拉取的dotnet鏡像它掂,包含了創(chuàng)建巴帮、構(gòu)建、運(yùn)行.NET Core項(xiàng)目所需的一切依賴和運(yùn)行時(shí)環(huán)境虐秋。

退出容器之后榕茧,執(zhí)行find -name HelloDocker.Web(查找HelloDocker.Web文件),我們發(fā)現(xiàn)并沒有找到客给。這說(shuō)明我們剛才創(chuàng)建的.NET Core MVC項(xiàng)目是在容器內(nèi)部創(chuàng)建的用押,是與宿主機(jī)完全隔離的。這個(gè)時(shí)候你可能會(huì)想靶剑,每次都要在容器中安裝源代碼太不方便了蜻拨,我們能不能讓容器運(yùn)行我們宿主機(jī)的源代碼項(xiàng)目?嗯桩引,這是個(gè)好問題缎讼。下面我們就來(lái)解答這個(gè)問題。

5.3. 掛載源代碼

為了在宿主機(jī)上創(chuàng)建.NET Core 項(xiàng)目坑匠,這個(gè)時(shí)候我們就需要在Linux宿主機(jī)上安裝.NET Core SDK血崭。

5.3.1. 宿主機(jī)安裝.NET Core SDK

步驟如下:

sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'
sudo yum update
sudo yum install libunwind libicu
sudo yum install dotnet-sdk-2.1.3

安裝完畢后,我們依次執(zhí)行以下命令創(chuàng)建一個(gè).NET Core MVC項(xiàng)目:

//回到根目錄
$ cd $HOME
//創(chuàng)建demo文件夾
$ mkdir demo
$ cd demo
//創(chuàng)建項(xiàng)目名為HelloDocker.Web的.NET Core MVC項(xiàng)目
dotnet new mvc -n HelloDocker.Web
//進(jìn)入HelloDocker.Web文件夾
cd HelloDocker.Web
//啟動(dòng).NET Core MVC項(xiàng)目
dotnet run

如果知道本機(jī)的ip地址的話(可以使用ifconfig命令查詢)厘灼,直接瀏覽器訪問http://<ip address>:5000即可訪問我們剛剛運(yùn)行的MVC項(xiàng)目夹纫。

這一步我們就在$HOME/demo/HelloDocker.Web目錄下成功創(chuàng)建了MVC項(xiàng)目,下一步我們就將該目錄下的源碼項(xiàng)目通過掛載的方式共享到容器中去手幢。

5.3.2. 掛載宿主機(jī)項(xiàng)目到容器中

在啟動(dòng)Docker鏡像時(shí)捷凄,Docker允許我們通過使用-v參數(shù)掛載宿主機(jī)的文件到容器的指定目錄下。換句話說(shuō)围来,就相當(dāng)于宿主機(jī)共享指定文件供容器去訪問跺涤。廢話不多說(shuō),實(shí)踐出真知监透。

// 命令中的`\`結(jié)合`Enter`鍵構(gòu)成換行符桶错,允許我們換行輸入一個(gè)長(zhǎng)命令。
$ docker run -it \
-v $HOME/demo/HelloDocker.Web:/app \
microsoft/dotnet:latest

上面的命令就是把$HOME/demo/HelloDocker.Web文件夾下的文件掛載到容器的\app目錄下胀蛮。

[root@iZ288a3qazlZ HelloDocker.Web]# docker run -it \
> -v $HOME/demo/HelloDocker.Web:/app \
> microsoft/dotnet:latest
root@d70b327f4b7e:/# ls
app  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@d70b327f4b7e:/# cd app
root@d70b327f4b7e:/app# ls
Controllers  HelloDocker.Web.csproj  Models  Program.cs  Startup.cs  Views  appsettings.Development.json  appsettings.json  bundleconfig.json  obj  wwwroot
root@d70b327f4b7e:/app# dotnet run
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {09a69edf-c1c5-4909-ad24-15a43a572fca} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

從上面的執(zhí)行結(jié)果來(lái)看院刁,容器內(nèi)部中的app目錄下包含了宿主機(jī)上的源碼項(xiàng)目。
上面說(shuō)到是以共享的形式粪狼,而不是容器擁有一份宿主機(jī)目錄的拷貝,意味著,在宿主機(jī)上對(duì)目錄的更改纤虽,會(huì)即時(shí)反應(yīng)到容器中。但反過來(lái)享潜,容器中對(duì)共享目錄的更改,不會(huì)反應(yīng)到宿主機(jī)上嗅蔬,不然就打破了容器具有的隔離特性剑按。

通過這樣一個(gè)簡(jiǎn)單場(chǎng)景,聰明的你是否會(huì)聯(lián)想到這一場(chǎng)景在我們?nèi)粘>幋a的應(yīng)用之處呢澜术?是的艺蝴,我們可以用來(lái)持續(xù)構(gòu)建(CI)∧穹希基本思路是猜敢,通過git clone源碼到宿主機(jī)上,然后將源碼目錄掛載到容器中去進(jìn)行構(gòu)建侮攀。

5.4. 借助Dockerfile

Dockerfile用來(lái)定義你將要在容器中執(zhí)行的系列操作锣枝。我們來(lái)創(chuàng)建第一個(gè)Dockerfile:

//確保進(jìn)入我們創(chuàng)建的MVC項(xiàng)目目錄中去
$ cd $HOME/demo/HelloDocker.Web
//使用touch命令創(chuàng)建Dockerfile
$ touch Dockerfile
//使用vi命令編輯Dockerfile
vi Dockerfile

進(jìn)入VI編輯界面后厢拭,復(fù)制以下代碼兰英,使用shift + Ins命令即可粘貼。然后按ESE退出編輯模式供鸠,按shift + :畦贸,輸入wq即可保存并退出編輯界面。

FROM microsoft/dotnet:latest
WORKDIR /app
COPY . /app
RUN dotnet restore
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
ENTRYPOINT ["dotnet","run"]

上面的命令我依次解釋一下:

  1. 使用FROM指定容器使用的鏡像
  2. 使用WORKDIR指定工作目錄
  3. 使用COPY指令楞捂,復(fù)制當(dāng)前目錄(其中.即代表當(dāng)前目錄)到容器中的/app目錄下
  4. 使用RUN命令指定容器中執(zhí)行的命令
  5. 使用EXPOSE指定容器暴露的端口號(hào)
  6. 使用ENV指定環(huán)境參數(shù)薄坏,上面用來(lái)告訴.NETCore項(xiàng)目在所有網(wǎng)絡(luò)接口上監(jiān)聽5000端口
  7. 使用ENTRYPOINT制定容器的入口點(diǎn)

Dockerfile就緒,我們就可以將我們當(dāng)前項(xiàng)目打包成鏡像以分發(fā)部署寨闹。
使用docker build -t <name> <path>指令打包鏡像:

$ docker build -t hellodocker.web .

以上命令就是告訴docker將當(dāng)前目錄打包成鏡像胶坠,并命名為hellodocker.web。命令執(zhí)行完畢繁堡,輸入docker images即可看到我們新打包的鏡像沈善。鏡像創(chuàng)建完畢我們就可以直接運(yùn)行了:

docker run -d -p 80:5000 hellodocker.web

上面的指令就是運(yùn)行我們新打包的鏡像,并通過-p參數(shù)映射容器的5000到宿主機(jī)的80端口椭蹄,其中-d參數(shù)告訴docker以后臺(tái)任務(wù)形式運(yùn)行鏡像闻牡。因?yàn)?0是默認(rèn)的web端口,所以我們通過瀏覽器直接訪問ip即可訪問到我們?nèi)萜髦羞\(yùn)行的MVC網(wǎng)站绳矩≌秩螅或者通過curl -i http://localhost來(lái)驗(yàn)證。操作示例如下:

[root@iZ288a3qazlZ HelloDocker.Web]# docker build -t hellodocker.web .
Sending build context to Docker daemon   3.3 MB
Step 1 : FROM microsoft/dotnet:latest
 ---> 7d4dc5c258eb
Step 2 : WORKDIR /app
 ---> Using cache
 ---> 98d48a4e278c
Step 3 : COPY . /app
 ---> d5df216b274a
Removing intermediate container 0a70f0f2b681
Step 4 : RUN dotnet restore
 ---> Running in 0c8a9c4d5ba1
  Restore completed in 939.01 ms for /app/HelloDocker.Web.csproj.
  Restoring packages for /app/HelloDocker.Web.csproj...
  Restore completed in 1.38 sec for /app/HelloDocker.Web.csproj.
 ---> 479f6b5cc7f0
Removing intermediate container 0c8a9c4d5ba1
Step 5 : EXPOSE 5000
 ---> Running in f97feceb7f1b
 ---> 562a95328196
Removing intermediate container f97feceb7f1b
Step 6 : ENV ASPNETCORE_URLS http://*:5000
 ---> Running in 403d8e2e25a6
 ---> 16b7bd572410
Removing intermediate container 403d8e2e25a6
Step 7 : ENTRYPOINT dotnet run
 ---> Running in 0294f87ce3fd
 ---> 532e44a7fd54
Removing intermediate container 0294f87ce3fd
Successfully built 532e44a7fd54
[root@iZ288a3qazlZ HelloDocker.Web]# docker run -d -p 80:5000 hellodocker.web
9d28bb3fa553653e4c26bf727715c82a837a2c224a0942107f3fab08c0a2686d
[root@iZ288a3qazlZ HelloDocker.Web]# curl -i http://localhost
HTTP/1.1 200 OK
Date: Sat, 23 Dec 2017 14:23:15 GMT
Content-Type: text/html; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked

至此翼馆,我們借助Docker就完美的完成了.NET Core項(xiàng)目的容器化部署割以。

結(jié)束了金度?還沒有!

我打包的鏡像是保存在本地的严沥,我如何把鏡像部署到其他機(jī)器上呢审姓?請(qǐng)繼續(xù)看。

6. 推送鏡像到倉(cāng)庫(kù)

在第三節(jié)中祝峻,我們就簡(jiǎn)要介紹了魔吐,有個(gè)Registry是專門用來(lái)存儲(chǔ)鏡像的。請(qǐng)自行到Docker Hub注冊(cè)個(gè)賬號(hào)莱找,然后我們把本地打包的鏡像放到自己賬號(hào)下的倉(cāng)庫(kù)下不就得了酬姆?!
注冊(cè)完畢后奥溺,執(zhí)行docker login

[root@iZ288a3qazlZ HelloDocker.Web]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: shengjie
Password:
Login Succeeded
[root@iZ288a3qazlZ HelloDocker.Web]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
hellodocker.web             latest              532e44a7fd54        13 minutes ago      1.745 GB

再執(zhí)行docker push

$ docker push hellodocker.web
Error response from daemon: You cannot push a "root" repository. Please rename your repository to docker.io/<user>/<repo> (ex: docker.io/shengjie/hellodocker.web)

推送失敗辞色,提示我們的鏡像命名不符規(guī)范。原來(lái)在推送之前要把鏡像按<user>/<repo>格式來(lái)命名浮定。那如何重命名呢相满,我們用打標(biāo)簽的方式重命名:

$ docker tag hellodocker.web shengjie/hellodocker.web:v1
$ docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
hellodocker.web                      latest              532e44a7fd54        35 minutes ago      1.745 GB
shengjie/hellodocker.web          v1                  532e44a7fd54        35 minutes ago      1.745 GB
$ docker push shengjie/hellodocker.web
The push refers to a repository [docker.io/shengjie/hellodocker.web]
774b128a8c4f: Pushed
7bf42a9b5527: Pushed
bd7f01c2dc6f: Pushed
....

換一臺(tái)機(jī)器,我們直接執(zhí)行以下命令桦卒,就完成了多重部署立美。

docker run -p 80:5000 <username>/hellodocker.web:v1

7.最后

如果你一步一步跟著練習(xí)的話,相信你對(duì)Docker以及.NET Core的跨平臺(tái)特性有了初步的理解方灾,也相信你對(duì)Docker的Build, Ship, and Run Any App, Anywhere有了更深的體會(huì)建蹄。

本文的實(shí)戰(zhàn)演練就先到這里,下一篇裕偿,我們來(lái)看如何借助Docker使用Nginx完成.NET Core Web項(xiàng)目的反向代理6瓷鳌!嘿棘!

參考資料

Hello Docker
HOSTING .NET CORE ON LINUX WITH DOCKER - A NOOB'S GUIDE
Docker命令收集
Linux常用命令

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劲腿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸟妙,更是在濱河造成了極大的恐慌焦人,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圆仔,死亡現(xiàn)場(chǎng)離奇詭異垃瞧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坪郭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門个从,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事嗦锐∠铀桑” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵奕污,是天一觀的道長(zhǎng)萎羔。 經(jīng)常有香客問我,道長(zhǎng)碳默,這世上最難降的妖魔是什么贾陷? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮嘱根,結(jié)果婚禮上髓废,老公的妹妹穿的比我還像新娘。我一直安慰自己该抒,他們只是感情好慌洪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凑保,像睡著了一般冈爹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欧引,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天频伤,我揣著相機(jī)與錄音,去河邊找鬼维咸。 笑死剂买,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的癌蓖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼婚肆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼租副!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起较性,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤用僧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赞咙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體责循,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年攀操,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了院仿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖歹垫,靈堂內(nèi)的尸體忽然破棺而出剥汤,到底是詐尸還是另有隱情,我是刑警寧澤排惨,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布吭敢,位于F島的核電站,受9級(jí)特大地震影響暮芭,放射性物質(zhì)發(fā)生泄漏鹿驼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一辕宏、第九天 我趴在偏房一處隱蔽的房頂上張望蠢沿。 院中可真熱鬧,春花似錦匾效、人聲如沸舷蟀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)野宜。三九已至,卻和暖如春魔策,著一層夾襖步出監(jiān)牢的瞬間匈子,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工闯袒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虎敦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓政敢,卻偏偏與公主長(zhǎng)得像其徙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喷户,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Docker — 云時(shí)代的程序分發(fā)方式 要說(shuō)最近一年云計(jì)算業(yè)界有什么大事件唾那?Google Compute Engi...
    ahohoho閱讀 15,532評(píng)論 15 147
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,499評(píng)論 0 120
  • 一褪尝、Docker 簡(jiǎn)介 Docker 兩個(gè)主要部件:Docker: 開源的容器虛擬化平臺(tái)Docker Hub: 用...
    R_X閱讀 4,386評(píng)論 0 27
  • 五闹获、Docker 端口映射 無(wú)論如何,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問不到的河哑。此外避诽,除了...
    R_X閱讀 1,748評(píng)論 0 7
  • 殷殷教育情 拳拳育人心 ◎liuyuexue樂園 序言 一個(gè)渺小的人,一個(gè)天天勞動(dòng)在一起的人璃谨,星期五中午頂...
    向前的冰山來(lái)客15669閱讀 643評(píng)論 0 7