Skip to content

Commit 3591ed2

Browse files
authored
Auto deploy from GitHub Actions build 804
Jiahong Luo: [d46a6f4] Luojh -- improve docker (#84)
1 parent 76fc353 commit 3591ed2

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

Ch08/index.html

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1697,6 +1697,15 @@
16971697
<nav class="md-nav" aria-label="构建自己的 Docker 镜像">
16981698
<ul class="md-nav__list">
16991699

1700+
<li class="md-nav__item">
1701+
<a href="#docker_1" class="md-nav__link">
1702+
<span class="md-ellipsis">
1703+
Docker 的关键概念
1704+
</span>
1705+
</a>
1706+
1707+
</li>
1708+
17001709
<li class="md-nav__item">
17011710
<a href="#build-manually" class="md-nav__link">
17021711
<span class="md-ellipsis">
@@ -1812,12 +1821,12 @@ <h1 id="docker">Docker<a class="headerlink" href="#docker" title="Permanent link
18121821
<h2 id="why-docker">为什么使用 Docker?<a class="headerlink" href="#why-docker" title="Permanent link">&para;</a></h2>
18131822
<p>Docker 能够利用 Linux 内核的容器特性,隔离出一个轻便的环境来运行程序。这有什么意义呢?试想以下这些情况:</p>
18141823
<ul>
1815-
<li>你运行的 Linux 发行版很老,而你需要运行一个更新版本的 Linux 发行版,或者完全不同的 Linux 发行版设计的程序。</li>
1824+
<li>你运行的 Linux 发行版很老,而你需要运行一个更新版本的 Linux 发行版,或者完全不同的 Linux 发行版设计的程序。基于 Docker 的实现方式,与虚拟机(VM)不同,它们都共用同一个 Linux 内核(虚拟机是完全的虚拟化,包括内核和用户空间)。</li>
18161825
<li>你和朋友在设计一个大型的程序,而因为你们配置的环境不同,有时候在某个人的机器上正常运行的程序,在另一台机器上没法正常运行。</li>
18171826
<li>你希望在多台服务器上部署一个项目,但是项目需要非常复杂的配置,一个一个配置服务器的成本非常大。</li>
18181827
<li>…………</li>
18191828
</ul>
1820-
<p>Docker 就可以帮助解决这些问题。它可以快速配置不同的环境(比如说,通过 Docker,你可以在 Ubuntu 上使用 CentOS 的环境),部署应用。</p>
1829+
<p>Docker 就可以帮助解决这些问题。它可以快速配置不同的环境(比如说,通过 Docker,你可以在 Ubuntu 发行版上使用 CentOS 发行版的环境),部署应用。</p>
18211830
<h2 id="install-docker">安装 Docker<a class="headerlink" href="#install-docker" title="Permanent link">&para;</a></h2>
18221831
<p>Docker 可以在 Windows, Linux 和 macOS 上安装。下面我们讨论内容都基于 Docker 免费的社区版本。</p>
18231832
<h3 id="install-on-windows-or-macos">在 Windows 或 macOS 上安装<a class="headerlink" href="#install-on-windows-or-macos" title="Permanent link">&para;</a></h3>
@@ -1850,7 +1859,7 @@ <h3 id="install-on-linux">在 Linux 上安装<a class="headerlink" href="#instal
18501859
<p>在安装完成后,可以使用</p>
18511860
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>sudo<span class="w"> </span>adduser<span class="w"> </span>用户名<span class="w"> </span>docker
18521861
</code></pre></div>
1853-
<p>将需要使用 Docker 的用户<a href="../Ch05/#adduser">加入</a> <code>docker</code> 用户组。<strong>注意:<code>docker</code> 用户组中的用户拥有与 root 等效的权限。</strong></p>
1862+
<p>将需要使用 Docker 的用户<a href="../Ch05/#adduser">加入</a> <code>docker</code> 用户组,以便使用命令行方式操作 Docker<strong>注意:<code>docker</code> 用户组中的用户拥有与 root 等效的权限。</strong></p>
18541863
<h3 id="setup-registry-mirror">配置 Registry Mirror(可选,推荐)<a class="headerlink" href="#setup-registry-mirror" title="Permanent link">&para;</a></h3>
18551864
<div class="admonition tip">
18561865
<p class="admonition-title">本节操作请参考其他文档</p>
@@ -1886,11 +1895,11 @@ <h2 id="use-docker">使用 Docker 容器<a class="headerlink" href="#use-docker"
18861895
<p>接下来我们来尝试几个例子,体验 Docker 环境的独立性与易用性。</p>
18871896
<h3 id="use-ubuntu-bash">在 Ubuntu 容器中使用 shell<a class="headerlink" href="#use-ubuntu-bash" title="Permanent link">&para;</a></h3>
18881897
<ul>
1889-
<li><code>docker run -it --rm --name ubuntu-container ubuntu:20.04</code></li>
1898+
<li><code>docker run -it --rm --name ubuntu-container ubuntu:latest</code></li>
18901899
</ul>
18911900
<p>这里,<code>--rm</code> 代表容器停止运行(退出)之后,会被立刻删除;<code>--name</code> 参数代表给容器命名,如果没有加这个参数,那么 docker 会给容器随机起一个格式类似于 gracious_brahmagupta 的名字。</p>
18921901
<p><code>-it</code> 是为了获得可交互的 Shell 所必须的。<code>-i</code> 会将容器的 init(主进程,这里是 <code>/bin/bash</code>)的标准输入与 <code>docker</code> 这个程序的标准输入相连接;而 <code>-t</code> 会告知主进程输入为终端(TTY)设备。</p>
1893-
<p>在执行以上命令之后,你会获得一个 Ubuntu 20.04 的容器环境,退出 Shell 之后容器就会被销毁。</p>
1902+
<p>在执行以上命令之后,你会获得一个 Ubuntu(版本为 <code>latest</code> 即最新的 LTS;如果需要指定版本,可以使用类似 <code>20.04</code> 的版本号替换 <code>latest</code>,推荐在生产环境中这么做,因为 <code>latest</code> 指定的最新版本可能随时间变化)的容器环境,退出 Shell 之后容器就会被销毁。</p>
18941903
<p>如果没有加上 <code>--rm</code>,退出后可以使用 <code>docker ps -a</code> 查看系统中所有的容器。</p>
18951904
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>sudo<span class="w"> </span>docker<span class="w"> </span>ps<span class="w"> </span>-a
18961905
<span class="go">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span>
@@ -1937,6 +1946,22 @@ <h3 id="use-mkdocs-material-build">在 MkDocs 容器中构建本书<a class="hea
19371946
<li>另外,我们不需要在终端中与容器中的进程进行交互,所以没有设置 <code>-it</code> 参数。</li>
19381947
</ul>
19391948
<h2 id="build-docker-image">构建自己的 Docker 镜像<a class="headerlink" href="#build-docker-image" title="Permanent link">&para;</a></h2>
1949+
<h3 id="docker_1">Docker 的关键概念<a class="headerlink" href="#docker_1" title="Permanent link">&para;</a></h3>
1950+
<p>在继续之前,我们来梳理一下 Docker 中的几个关键概念:<strong>容器(container)</strong><strong>镜像(image)</strong><strong>镜像仓库(registry)</strong></p>
1951+
<ul>
1952+
<li><strong>镜像仓库</strong>是存储镜像的地方</li>
1953+
<li><strong>镜像</strong>是 Docker 容器内文件系统的一份快照</li>
1954+
<li><strong>Dockerfile</strong> 包含生成镜像的指令序列,可以理解为构建镜像的脚本</li>
1955+
<li><strong>容器</strong>是一个(隔离)的运行环境</li>
1956+
</ul>
1957+
<p>它们之间的关系可以用下图表示,其中括号中的命令是查看相应对象列表的命令。</p>
1958+
<pre class="mermaid"><code>flowchart TD
1959+
Registry --&gt;|pull| Image["Image (images)"]
1960+
Image --&gt;|run| Container["Container (ps)"]
1961+
Container --&gt;|commit| Image
1962+
Image --&gt;|push| Registry["Registry (search)"]
1963+
1964+
Dockerfile --&gt;|build| Image</code></pre>
19401965
<h3 id="build-manually">手工构建镜像<a class="headerlink" href="#build-manually" title="Permanent link">&para;</a></h3>
19411966
<p><code>docker commit</code> 命令可以从当前运行的容器新建镜像。以下是一个简单的例子:</p>
19421967
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>sudo<span class="w"> </span>docker<span class="w"> </span>run<span class="w"> </span>-it<span class="w"> </span>ubuntu
@@ -1978,7 +2003,7 @@ <h4 id="cross-compile-example">构建简单的交叉编译环境<a class="header
19782003
<p>通过使用 <code>docker build</code>,我们可以构建出镜像。</p>
19792004
<div class="highlight"><pre><span></span><code><span class="go">sudo docker build -t riscv-cross:example .</span>
19802005
</code></pre></div>
1981-
<p><code>-t riscv-cross:example</code> 代表为这个镜像打上 <code>riscv-cross:example</code> 的标签。构建完成后,使用 <code>docker run</code> 执行即可:</p>
2006+
<p><code>-t riscv-cross:example</code> 代表为这个镜像打上 <code>riscv-cross:example</code> 的标签<code>.</code> 表示从当前目录下寻找 Dockerfile 并以当前目录作为构建过程的“工作路径”。构建完成后,使用 <code>docker run</code> 执行即可:</p>
19822007
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>sudo<span class="w"> </span>docker<span class="w"> </span>run<span class="w"> </span>-v<span class="w"> </span><span class="si">${</span><span class="nv">PWD</span><span class="si">}</span>/workspace:/workspace<span class="w"> </span>-it<span class="w"> </span>riscv-cross:example
19832008
<span class="go">Welcome to fish, the friendly interactive shell</span>
19842009
<span class="gp">root@dec3d33003ee /workspace# </span>vim<span class="w"> </span>helloworld.c
@@ -2028,7 +2053,7 @@ <h4 id="cross-compile-example">构建简单的交叉编译环境<a class="header
20282053
<span class="k">RUN</span><span class="w"> </span>rm<span class="w"> </span>-rf<span class="w"> </span>/tmp/Python-3.7.3*
20292054
<span class="k">RUN</span><span class="w"> </span>yum<span class="w"> </span>clean<span class="w"> </span>all
20302055
</code></pre></div>
2031-
<p>当然,这不等于说必须要把所有命令都写在一条 <code>RUN</code> 里面。对于执行时间很长的命令,可以考虑放在 Dockerfile 的开头,并且使用单独的 <code>RUN</code> 运行,因为 Docker 在构建镜像时,可以重复使用之前构建好的层。这么做可以节约构建与调试 Dockerfile 的时间。</p>
2056+
<p>当然,这不等于说必须要把所有命令都写在一条 <code>RUN</code> 里面。对于执行时间很长的命令,可以考虑放在 Dockerfile 的开头,并且使用单独的 <code>RUN</code> 运行,因为 Docker 在构建镜像时,<strong>可以重复使用之前构建好的层</strong>。这么做可以节约构建与调试 Dockerfile 的时间。</p>
20322057
</div>
20332058
<h4 id="flask-production-example">在生产环境中运行使用 Flask 编写的简单网站<a class="headerlink" href="#flask-production-example" title="Permanent link">&para;</a></h4>
20342059
<p>Flask 是一个知名的 Python web 框架。本例子包含了一个运行 Flask 编写的网站的简单 Dockerfile(不包含数据库等部分):</p>

search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)