8天入门docker系列 —— 第二天 通过一个aspnetcore程序加深对容器的理解
<p> </p><p> 我们知道容器是一个打包了应用和相关依赖的盒子,那怎么去操控这个盒子呢? 这一篇我通过一个简单的aspnetcore程序来加深对盒子的理解,使用之前先</p>
<p>安装一下Docker的环境。</p>
<p> </p>
<p><span style="font-size: 18pt">一:Docker的安装</span></p>
<p> 官方下载地址:https://docs.docker.com/install/linux/docker-ce/centos/ ,跟着文档执行完下面2个大步骤即可。</p>
<p><span style="font-size: 14pt">1. SET UP THE REPOSITORY</span></p>
<div class="cnblogs_code">
<pre>sudo yum install -y yum-<span style="color: rgba(0, 0, 0, 1)">utils \
device</span>-mapper-persistent-<span style="color: rgba(0, 0, 0, 1)">data \
lvm2
sudo yum</span>-config-<span style="color: rgba(0, 0, 0, 1)">manager \
</span>--add-<span style="color: rgba(0, 0, 0, 1)">repo \
https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">download.docker.com/linux/centos/docker-ce.repo</span></pre>
</div>
<p> </p>
<p><span style="font-size: 14pt">2. INSTALL DOCKER CE</span></p>
<div class="cnblogs_code">
<pre>sudo yum install docker-ce docker-ce-cli containerd.io</pre>
</div>
<p> </p>
<p><span style="font-size: 14pt">3. 启动docker 服务</span></p>
<div class="cnblogs_code">
<pre># service docker start
Redirecting to </span>/bin/<span style="color: rgba(0, 0, 0, 1)">systemctl startdocker.service<br></span></pre>
</div>
<p> </p>
<p><span style="font-size: 14pt">4. 查看docker版本</span></p>
<div class="cnblogs_code">
<pre># docker -<span style="color: rgba(0, 0, 0, 1)">v
Docker version </span><span style="color: rgba(128, 0, 128, 1)">18.09</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>, build <span style="color: rgba(128, 0, 128, 1)">6247962</span></pre>
</div>
<p> </p>
<p><span style="font-size: 18pt">二:新建asp.net core 网站</span></p>
<p> docker已经有了,接下来新建一个website,采用vs默认的mvc模板即可,有了网站之后新建一个Dockerfile文件,内容如下,目的就是为了制作镜像,</p>
<p>关于dockerfile的更多内容我会放到后面的文章中去说,本篇关注点在容器上。</p>
<div class="cnblogs_code">
<pre>FROM microsoft/dotnet:<span style="color: rgba(128, 0, 128, 1)">2.2</span>-aspnetcore-<span style="color: rgba(0, 0, 0, 1)">runtime
LABEL hxc@qq.com
RUN mkdir </span>/<span style="color: rgba(0, 0, 0, 1)">data
COPY .</span>/ /<span style="color: rgba(0, 0, 0, 1)">data
WORKDIR </span>/<span style="color: rgba(0, 0, 0, 1)">data
EXPOSE </span><span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
CMD [ </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dotnet</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">WebNotebook.dll</span><span style="color: rgba(128, 0, 0, 1)">"</span> ]</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/214741/201902/214741-20190217155523059-817042460.png" alt="" width="522" height="271"></p>
<p> </p>
<p> 然后点击vs的发布功能,把发布后的内容通过ftp push 到虚拟机中/data/publish文件夹下,具体内容如下:</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">ls</span><span style="color: rgba(0, 0, 0, 1)">
appsettings.Development.jsonweb.config WebNotebook.pdb WebNotebook.Views.pdb
appsettings.json WebNotebook.deps.jsonWebNotebook.runtimeconfig.jsonwwwroot
Dockerfile WebNotebook.dll WebNotebook.Views.dll
# </span></pre>
</div>
<p> </p>
<p> 接下来通过 docker build 的方式构建出webnotebook的镜像。</p>
<div class="cnblogs_code">
<pre># docker build -f ./Dockerfile -t huangxincheng/<span style="color: rgba(0, 0, 0, 1)">webnodebook:v1 .
Sending build context to Docker daemon</span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">.201MB
Step </span><span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : FROM microsoft/dotnet:<span style="color: rgba(128, 0, 128, 1)">2.2</span>-aspnetcore-<span style="color: rgba(0, 0, 0, 1)">runtime
</span><span style="color: rgba(128, 0, 128, 1)">2.2</span>-aspnetcore-runtime: Pulling from microsoft/<span style="color: rgba(0, 0, 0, 1)">dotnet
6ae821421a7d: Already exists
8a3a416e6dac: Already exists
ed82f21723d8: Already exists
4f77997e649d: Already exists
Digest: sha256:988829fbff8cde8b431d045d2dd2e3ea54d69abf5c61c69794c523535ce382e7
Status: Downloaded newer image </span><span style="color: rgba(0, 0, 255, 1)">for</span> microsoft/dotnet:<span style="color: rgba(128, 0, 128, 1)">2.2</span>-aspnetcore-<span style="color: rgba(0, 0, 0, 1)">runtime
</span>---><span style="color: rgba(0, 0, 0, 1)"> dad26d192ae6
Step </span><span style="color: rgba(128, 0, 128, 1)">2</span>/<span style="color: rgba(128, 0, 128, 1)">7</span><span style="color: rgba(0, 0, 0, 1)"> : MAINTAINER hxc@qq.com
</span>---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 89b9a2c5bec6
Removing intermediate container 89b9a2c5bec6
</span>---><span style="color: rgba(0, 0, 0, 1)"> 2d6c5ecba6d2
Step </span><span style="color: rgba(128, 0, 128, 1)">3</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : RUN <span style="color: rgba(0, 0, 255, 1)">mkdir</span> /<span style="color: rgba(0, 0, 0, 1)">data
</span>---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 08e8d316c3da
Removing intermediate container 08e8d316c3da
</span>---><span style="color: rgba(0, 0, 0, 1)"> 7d28be2a2bc1
Step </span><span style="color: rgba(128, 0, 128, 1)">4</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : COPY ./ /<span style="color: rgba(0, 0, 0, 1)">data
</span>---><span style="color: rgba(0, 0, 0, 1)"> 9f603790a8a2
Step </span><span style="color: rgba(128, 0, 128, 1)">5</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : WORKDIR /<span style="color: rgba(0, 0, 0, 1)">data
</span>---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 85fbed40b4f7
Removing intermediate container 85fbed40b4f7
</span>---><span style="color: rgba(0, 0, 0, 1)"> 8c18eaadc85b
Step </span><span style="color: rgba(128, 0, 128, 1)">6</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : EXPOSE <span style="color: rgba(128, 0, 128, 1)">80</span>
---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 0eaa5046ee1d
Removing intermediate container 0eaa5046ee1d
</span>---><span style="color: rgba(0, 0, 0, 1)"> 9b6ee99c1875
Step </span><span style="color: rgba(128, 0, 128, 1)">7</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : CMD [ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dotnet</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">WebNotebook.dll</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> ]
</span>---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 7c0d2fa1eb46
Removing intermediate container 7c0d2fa1eb46
</span>---> <span style="color: rgba(128, 0, 128, 1)">513950255443</span><span style="color: rgba(0, 0, 0, 1)">
Successfully built </span><span style="color: rgba(128, 0, 128, 1)">513950255443</span><span style="color: rgba(0, 0, 0, 1)">
Successfully tagged huangxincheng</span>/webnodebook:v1</pre>
</div>
<p> </p>
<p> 最后可以通过 docker images 查看一下镜像是否构建成功,从下图中可以看到,当前有一个我的应用镜像,还有一个runtime镜像。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
huangxincheng</span>/webnodebook v1 <span style="color: rgba(128, 0, 128, 1)">513950255443</span> <span style="color: rgba(128, 0, 128, 1)">38</span><span style="color: rgba(0, 0, 0, 1)"> seconds ago 264MB
microsoft</span>/dotnet <span style="color: rgba(128, 0, 128, 1)">2.2</span>-aspnetcore-runtime dad26d192ae6 <span style="color: rgba(128, 0, 128, 1)">4</span> days ago 260MB</pre>
</div>
<p> </p>
<p><span style="font-size: 18pt">三:容器操作</span></p>
<p><span style="font-size: 14pt">1. 启动容器</span></p>
<p> 通常启动容器的方式有两种,第一种为docker create, 还有一种是docker run,更多的情况我们使用docker run 方式,比如下面的命令。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(255, 0, 0, 1)">docker run --name webnotebook -d huangxincheng/</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">webnodebook:v1</span>
<span style="color: rgba(255, 0, 0, 1)">51ded69fce15</span>fb912ab167c4dea26535a17b0f2147a5571aaa411a974ab95b11<br></span></pre>
</div>
<p> 《1》 --name: 这个就是给你当前运行的容器取一个名字,如果不取的话就采用系统给你的默认名字。</p>
<p>《2》 -d: 表示脱离shell终端采用deamon形式的后台运行,在生产环境中必须要这么处理,没毛病吧。</p>
<p>《3》 huangxincheng/webnodebook:v1 : huangxincheng表示仓库名,当然你也可以不需要这个。webnodebook 表示镜像名, v1表示镜像的版本。</p>
<p> </p>
<p> 容器运行成功后,会返回一个容器的标识码,这里要注意的是,如果镜像在本地不存在,docker 默认会到官方的 hub.docker.com上进行拉取。</p>
<p> </p>
<p><span style="font-size: 14pt">2. 查看容器</span></p>
<p> 既然你说容器启动了,那我怎么判别是否真的启动了呢? 这里你就可以用 docker ps命令鉴别。</p>
<div class="cnblogs_code">
<pre># docker <span style="color: rgba(0, 0, 255, 1)">ps</span><span style="color: rgba(0, 0, 0, 1)">
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51ded69fce15 huangxincheng</span>/webnodebook:v1 <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dotnet WebNotebook.…</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 128, 1)">6</span> minutes ago Up <span style="color: rgba(128, 0, 128, 1)">6</span> minutes <span style="color: rgba(128, 0, 128, 1)">80</span>/tcp webnotebook</pre>
</div>
<p> 从上图中可以看到,容器的ID为 51ded69fce15 ,而这个刚好是你docker run 返回的前12个字符,然后Status= Up 6 minutes ,说明容器是启动的没毛病。</p>
<p> </p>
<p><span style="font-size: 14pt">3. 查看容器内应用程序是否启动</span></p>
<p> 容器启动了不代表我的webnotebook没问题,对吧,那接下来怎么去鉴别容器内的程序是否正常启动呢? 这里就可以用到下面两种方式。</p>
<p> </p>
<p><span style="font-size: 18px">《1》 docker top xxx 查看容器运行的进程。</span></p>
<p> xxx 就是你的容器名或者容器ID,如下图可以看到确实我的WebNoteBook的进程号是5323,说明是启动的。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># docker top webnotebook
UID PID PPID C STIME TTY TIME CMD
root </span><span style="color: rgba(128, 0, 128, 1)">5323</span> <span style="color: rgba(128, 0, 128, 1)">5306</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">09</span> ? <span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">01</span> dotnet WebNotebook.dll</pre>
</div>
<p> </p>
<p><span style="font-size: 18px">《2》 直接在宿主机上通过ps -ef 查看指定的程序。</span></p>
<p> 从下图中你也看到了,WebNotebook的PID果然是5323,说明启动了无疑。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">ps</span> -ef | <span style="color: rgba(0, 0, 255, 1)">grep</span><span style="color: rgba(0, 0, 0, 1)"> dotnet
root </span><span style="color: rgba(128, 0, 128, 1)">5323</span> <span style="color: rgba(128, 0, 128, 1)">5306</span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">09</span> ? <span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">01</span><span style="color: rgba(0, 0, 0, 1)"> dotnet WebNotebook.dll
root </span><span style="color: rgba(128, 0, 128, 1)">6235</span> <span style="color: rgba(128, 0, 128, 1)">3499</span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">23</span> pts/<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">00</span> <span style="color: rgba(0, 0, 255, 1)">grep</span> --color=auto dotnet</pre>
</div>
<p> </p>
<p><span style="font-size: 14pt">4. 如何查看容器的ip和port</span></p>
<p> 既然容器和容器内程序都是启动的,那接下来我怎么访问这个webnotebook呢? 要想访问,你肯定是要知道这个容器的ip+port,不然怎么访问呢? 通常有</p>
<p>两种做法可以获取到容器的ip和port端口。</p>
<p> </p>
<p><span style="font-size: 18px">《1》 使用docker exec 直接进入容器内</span></p>
<div class="cnblogs_code">
<pre># docker exec -it webnotebook /bin/<span style="color: rgba(0, 0, 0, 1)">bash
root@51ded69fce15:</span>/data# <span style="color: rgba(0, 0, 255, 1)">ifconfig</span><span style="color: rgba(0, 0, 0, 1)">
bash: </span><span style="color: rgba(0, 0, 255, 1)">ifconfig</span><span style="color: rgba(0, 0, 0, 1)">: command not found
root@51ded69fce15:</span>/data#</pre>
</div>
<p> </p>
<p> -it 表示给当前的容器分配一个终端,由于容器是ubuntu环境,为了精简并没有把ifconfig打包进来,所以你需要使用apt-get 安装一下net包即可。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">root@51ded69fce15:</span>/data# apt-get update &&apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> net-tools -<span style="color: rgba(0, 0, 0, 1)">y
Ign:</span><span style="color: rgba(128, 0, 128, 1)">1</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cdn-fastly.deb.debian.org/debian stretch InRelease </span>
Get:<span style="color: rgba(128, 0, 128, 1)">3</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cdn-fastly.deb.debian.org/debian stretch-updates InRelease </span>
Get:<span style="color: rgba(128, 0, 128, 1)">4</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cdn-fastly.deb.debian.org/debian stretch Release </span>
Get:<span style="color: rgba(128, 0, 128, 1)">2</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">security-cdn.debian.org/debian-security stretch/updates InRelease </span>
Get:<span style="color: rgba(128, 0, 128, 1)">5</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages </span>
Get:<span style="color: rgba(128, 0, 128, 1)">6</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cdn-fastly.deb.debian.org/debian stretch Release.gpg </span>
Get:<span style="color: rgba(128, 0, 128, 1)">7</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cdn-fastly.deb.debian.org/debian stretch/main amd64 Packages </span>
Get:<span style="color: rgba(128, 0, 128, 1)">8</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">security-cdn.debian.org/debian-security stretch/updates/main amd64 Packages </span>
Fetched <span style="color: rgba(128, 0, 128, 1)">7871</span> kB <span style="color: rgba(0, 0, 255, 1)">in</span> 1min 52s (<span style="color: rgba(128, 0, 128, 1)">69.8</span> kB/<span style="color: rgba(0, 0, 0, 1)">s)
Reading package lists... Done
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
net</span>-<span style="color: rgba(0, 0, 0, 1)">tools
</span><span style="color: rgba(128, 0, 128, 1)">0</span> upgraded, <span style="color: rgba(128, 0, 128, 1)">1</span> newly installed, <span style="color: rgba(128, 0, 128, 1)">0</span> to remove and <span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)"> not upgraded.
Need to get </span><span style="color: rgba(128, 0, 128, 1)">248</span><span style="color: rgba(0, 0, 0, 1)"> kB of archives.
After this operation, </span><span style="color: rgba(128, 0, 128, 1)">963</span><span style="color: rgba(0, 0, 0, 1)"> kB of additional disk space will be used.
Get:</span><span style="color: rgba(128, 0, 128, 1)">1</span> http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">cdn-fastly.deb.debian.org/debian stretch/main amd64 net-tools amd64 1.60+git20161116.90da8a0-1 </span>
Fetched <span style="color: rgba(128, 0, 128, 1)">248</span> kB <span style="color: rgba(0, 0, 255, 1)">in</span> 4s (<span style="color: rgba(128, 0, 128, 1)">56.4</span> kB/<span style="color: rgba(0, 0, 0, 1)">s)
debconf: delaying package configuration, since apt</span>-<span style="color: rgba(0, 0, 0, 1)">utils is not installed
Selecting previously unselected package net</span>-<span style="color: rgba(0, 0, 0, 1)">tools.
(Reading database ... </span><span style="color: rgba(128, 0, 128, 1)">6953</span><span style="color: rgba(0, 0, 0, 1)"> files and directories currently installed.)
Preparing to unpack ...</span>/net-tools_1.<span style="color: rgba(128, 0, 128, 1)">60</span>+git20161116.90da8a0-<span style="color: rgba(0, 0, 0, 1)">1_amd64.deb ...
Unpacking net</span>-tools (<span style="color: rgba(128, 0, 128, 1)">1.60</span>+git20161116.90da8a0-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) ...
Setting up net</span>-tools (<span style="color: rgba(128, 0, 128, 1)">1.60</span>+git20161116.90da8a0-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) ...
root@51ded69fce15:</span>/data# <span style="color: rgba(0, 0, 255, 1)">ifconfig</span><span style="color: rgba(0, 0, 0, 1)">
eth0: flags</span>=<span style="color: rgba(128, 0, 128, 1)">4163</span><UP,BROADCAST,RUNNING,MULTICAST>mtu <span style="color: rgba(128, 0, 128, 1)">1500</span><span style="color: rgba(0, 0, 0, 1)">
inet </span><span style="color: rgba(255, 0, 0, 1)">172.17.0.2</span>netmask <span style="color: rgba(128, 0, 128, 1)">255.255</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>broadcast <span style="color: rgba(128, 0, 128, 1)">172.17</span>.<span style="color: rgba(128, 0, 128, 1)">255.255</span><span style="color: rgba(0, 0, 0, 1)">
ether </span><span style="color: rgba(128, 0, 128, 1)">02</span>:<span style="color: rgba(128, 0, 128, 1)">42</span>:ac:<span style="color: rgba(128, 0, 128, 1)">11</span>:<span style="color: rgba(128, 0, 128, 1)">00</span>:<span style="color: rgba(128, 0, 128, 1)">02</span>txqueuelen <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">(Ethernet)
RX packets </span><span style="color: rgba(128, 0, 128, 1)">4133</span>bytes <span style="color: rgba(128, 0, 128, 1)">8350979</span> (<span style="color: rgba(128, 0, 128, 1)">7.9</span><span style="color: rgba(0, 0, 0, 1)"> MiB)
RX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span>overruns <span style="color: rgba(128, 0, 128, 1)">0</span>frame <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
TX packets </span><span style="color: rgba(128, 0, 128, 1)">3452</span>bytes <span style="color: rgba(128, 0, 128, 1)">189039</span> (<span style="color: rgba(128, 0, 128, 1)">184.6</span><span style="color: rgba(0, 0, 0, 1)"> KiB)
TX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span> overruns <span style="color: rgba(128, 0, 128, 1)">0</span>carrier <span style="color: rgba(128, 0, 128, 1)">0</span>collisions <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
lo: flags</span>=<span style="color: rgba(128, 0, 128, 1)">73</span><UP,LOOPBACK,RUNNING>mtu <span style="color: rgba(128, 0, 128, 1)">65536</span><span style="color: rgba(0, 0, 0, 1)">
inet </span><span style="color: rgba(128, 0, 128, 1)">127.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span>netmask <span style="color: rgba(128, 0, 128, 1)">255.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)">
looptxqueuelen </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">(Local Loopback)
RX packets </span><span style="color: rgba(128, 0, 128, 1)">0</span>bytes <span style="color: rgba(128, 0, 128, 1)">0</span> (<span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)"> B)
RX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span>overruns <span style="color: rgba(128, 0, 128, 1)">0</span>frame <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
TX packets </span><span style="color: rgba(128, 0, 128, 1)">0</span>bytes <span style="color: rgba(128, 0, 128, 1)">0</span> (<span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)"> B)
TX errors </span><span style="color: rgba(128, 0, 128, 1)">0</span>dropped <span style="color: rgba(128, 0, 128, 1)">0</span> overruns <span style="color: rgba(128, 0, 128, 1)">0</span>carrier <span style="color: rgba(128, 0, 128, 1)">0</span>collisions <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
root@51ded69fce15:</span>/data# </pre>
</div>
<p> </p>
<p> 当你安装完net包后,通过ifconfig你就可以看到 172.17.0.2 这个ip地址了,然后通过netstat 来查看webnotebook的端口号。</p>
<div class="cnblogs_code">
<pre>root@51ded69fce15:/data# netstat -<span style="color: rgba(0, 0, 0, 1)">tlnp
Active Internet connections (only servers)
Proto Recv</span>-Q Send-Q Local Address Foreign Address State PID/<span style="color: rgba(0, 0, 0, 1)">Program name
tcp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(255, 0, 0, 1)">:::80</span> :::* LISTEN <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(0, 0, 0, 1)">dotnet
root@51ded69fce15:</span>/data# </pre>
</div>
<p> </p>
<p><span style="font-size: 18px">《2》 使用 docker inspect 查看容器各方面的底层信息。</span></p>
<p> </p>
<div class="cnblogs_code">
<pre># docker inspect webnotebook
[
...</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NetworkSettings</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Bridge</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SandboxID</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cc8d9e678ef1137d992f3c8d019d81300c2b5f379bc8b746b08fe233d06ffb02</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">HairpinMode</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">LinkLocalIPv6Address</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">LinkLocalIPv6PrefixLen</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Ports</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(255, 0, 0, 1)">"80/tcp": null</span><span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SandboxKey</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/var/run/docker/netns/cc8d9e678ef1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SecondaryIPAddresses</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SecondaryIPv6Addresses</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">EndpointID</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">e37e565a26af790ce156dc957beab5182cd136215d61b655be26e5c31362b4ae</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Gateway</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.17.0.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GlobalIPv6Address</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GlobalIPv6PrefixLen</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IPAddress</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.17.0.2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IPPrefixLen</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IPv6Gateway</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MacAddress</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">02:42:ac:11:00:02</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Networks</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">bridge</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IPAMConfig</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Links</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Aliases</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NetworkID</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">d234a2cc0ff52b802e846d12530e41d886ec780f2344cf601f022ff1c434afe4</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">EndpointID</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">e37e565a26af790ce156dc957beab5182cd136215d61b655be26e5c31362b4ae</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Gateway</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.17.0.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(255, 0, 0, 1)">"IPAddress": "172.17.0.2",
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IPPrefixLen</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IPv6Gateway</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GlobalIPv6Address</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GlobalIPv6PrefixLen</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">MacAddress</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">02:42:ac:11:00:02</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">DriverOpts</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">
}
}
}
...
]</span></pre>
</div>
<p>从NetworkSettings节点中,你可以找到一个"IPAddress": "172.17.0.2" 的信息,这个ip就是你的容器IP,很简单吧,而且从"Ports": { "80/tcp": null } 上</p>
<p>你也看到,当前暴露的是80端口。</p>
<p> </p>
<p><span style="font-size: 14pt">5. 查看容器内程序日志</span></p>
<p> 容器和程序都启动起来了,不代表程序运行就正常,为了保险起见,还是要看一下程序打印到终端的一些操作日志,这样我才放心一些不是吗? 那现在</p>
<p>我可以通过 docker logs xxx 来查看指定容器的日志输出,从下面可以看到,一点问题都没有。</p>
<div class="cnblogs_code">
<pre># docker logs webnotebook
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[</span><span style="color: rgba(128, 0, 128, 1)">35</span><span style="color: rgba(0, 0, 0, 1)">]
No XML encryptor configured. Key {8199b0ea</span>-afae-<span style="color: rgba(128, 0, 128, 1)">4586</span>-<span style="color: rgba(128, 0, 128, 1)">8e6d</span>-aae75aa91db2} may be persisted to storage <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> unencrypted form.
Hosting environment: Production
Content root path: </span>/<span style="color: rgba(0, 0, 0, 1)">data
<span style="color: rgba(255, 0, 0, 1)">Now listening on: http:</span></span><span style="color: rgba(255, 0, 0, 1)">//[::]:80</span>
Application started. Press Ctrl+C to shut down.</pre>
</div>
<p> </p>
<p><span style="font-size: 14pt">6. 关闭和启动容器</span></p>
<p> 容器运行这一块基本上就是这样了,由于项目不断的迭代升级,你的旧版本程序的容器就该停止了,接下来你有 docker stop 和 docker kill 两种方式,</p>
<p> 两者的区别在于,前者是给你的程序 sigterm信号,后者是sigkill信号,如果不明白两者的区别,可以看我的这篇博文:</p>
<p> https://www.cnblogs.com/huangxincheng/p/9576795.html</p>
<div class="cnblogs_code">
<pre># docker stop webnotebook
webnotebook
# docker <span style="color: rgba(0, 0, 255, 1)">ps</span> -<span style="color: rgba(0, 0, 0, 1)">a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51ded69fce15 huangxincheng</span>/webnodebook:v1 <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dotnet WebNotebook.…</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 128, 1)">35</span> minutes ago <span style="color: rgba(255, 0, 0, 1)">Exited (0) 2</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"> seconds ago</span> webnotebook
# </pre>
</div>
<p> </p>
<p> 可以看到,当我执行了stop之后再 ps -a 发现,当前的容器已经退出了,然后你可以通过 docker start 重启,再用 docker kill 关闭。</p>
<div class="cnblogs_code">
<pre># docker start webnotebook
webnotebook
# docker <span style="color: rgba(0, 0, 255, 1)">ps</span> -<span style="color: rgba(0, 0, 0, 1)">a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51ded69fce15 huangxincheng</span>/webnodebook:v1 <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dotnet WebNotebook.…</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 128, 1)">37</span> minutes ago <span style="color: rgba(255, 0, 0, 1)">Up 2 seconds</span> <span style="color: rgba(128, 0, 128, 1)">80</span>/<span style="color: rgba(0, 0, 0, 1)">tcp webnotebook
# docker <span style="color: rgba(0, 0, 255, 1)">kill</span><span style="color: rgba(0, 0, 0, 1)"> webnotebook
webnotebook
# docker <span style="color: rgba(0, 0, 255, 1)">ps</span> -<span style="color: rgba(0, 0, 0, 1)">a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51ded69fce15 huangxincheng</span>/webnodebook:v1 <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dotnet WebNotebook.…</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 128, 1)">37</span> minutes ago <span style="color: rgba(255, 0, 0, 1)">Exited (137) 1</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"> second ago</span> webnotebook
#</pre>
</div>
<p> </p>
<p>既然ip+port都知道了,接下来网站你就可以访问啦。访问之前确保你的容器是start状态哦( docker webnotebook start )。</p>
<p><img src="https://img2018.cnblogs.com/blog/214741/201902/214741-20190217164850509-1022790037.png" alt=""></p>
<p> </p>
<p>好了,本篇就说到这里,希望对你有帮助。</p>
<p> </p>
<p> </p><br><br>
来源:https://www.cnblogs.com/huangxincheng/p/10391829.html
頁:
[1]