霖龍 發表於 2018-2-19 00:11:00

Docker 小记 — Docker Engine

<h2 id="前言">前言</h2>
<p>用了 Docker 方才觉得生产环境终于有了他该有的样子,就像集装箱普及之后大型货轮的价值才逐渐体现出来,Docker 详细说明可查阅“官方文档”。本篇为 Docker Engine 的笔记,也就是我们通常说的 Docker,他包含了提供容器技术实现的 Docker daemon 及终端控制 Docker CLI 的应用程序。后续会继续发布 Docker Compose 和 Docker Swarm 的操作笔记,由于我的绝大部分应用案例都是云服务器,因此 Docker Machine 就略过了。<br>
<img src="https://images2017.cnblogs.com/blog/801714/201801/801714-20180128143352428-704555727.png" alt="" loading="lazy"></p>
<h2 id="1-docker-安装--配置镜像加速器">1. Docker 安装 &amp; 配置镜像加速器</h2>
<h3 id="a">a:</h3>
<pre><code class="language-bash"># step 1:安装必要的一些系统工具
apt update
apt -y install apt-transport-https ca-certificates curl software-properties-common

# step 2:安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -

# Step 3:写入软件源信息
add-apt-repository "deb http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# Step 4:更新并安装 Docker-CE
apt -y update
apt -y install docker-ce
</code></pre>
<h3 id="b">b:</h3>
<pre><code class="language-bash">mkdir -p /etc/docker
tee /etc/docker/daemon.json &lt;&lt;-'EOF'
{
"registry-mirrors": ["https://jrzzvzok.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
</code></pre>
<h2 id="2-dockerfile-详解">2. Dockerfile 详解</h2>
<p>Docker 的架构很有魅力,他拥有类似于虚拟机性质的隔离机制,但并不是严格意义上的虚拟机。我还是喜欢拿货轮举例,以前我们是一条小船运一个集装箱的货物,现在可以把 N 个集装箱扔到一条大货轮上。每个容器(集装箱)共用宿主机(货轮)的内核(运载力),Dockerfile 就像是每个集装箱中的货物清单和说明书,一般由以下五部分构成:</p>
<h3 id="21-基础指令">2.1 基础指令</h3>
<ul>
<li><strong>FROM:</strong> 指定基础镜像,且必须位于第一行,使用格式如下:</li>
</ul>
<pre><code class="language-dockerfile">FROM &lt;image&gt;
FROM &lt;image&gt;:&lt;tag&gt;
FROM &lt;image&gt;@&lt;digest&gt;
</code></pre>
<p>Docker 的原理基于 Linux 内核的隔离技术,且 Linux From Scratch,因此 <code>FROM scratch</code> 是 docker 中最基础的镜像,debian、ubuntu 和 centos 等都基于 scratch 之上。在实际的运用中,如果必须从零开始搭建镜像的一般都选择 <code>FROM debian</code> 作为基础镜像,不过大多数情况下一般都会以如下:<code>FROM python</code>、<code>FROM nginx</code>、<code>FROM java</code> 等为基础镜像。</p>
<ul>
<li>MAINTAINER:指定维护者信息,例:<code>MAINTAINER useruser@mail.com</code>。</li>
</ul>
<h3 id="22-控制指令">2.2 控制指令</h3>
<ul>
<li><strong>RUN:</strong> 在构建的过程中指定需要被执行的命令,使用格式如下:</li>
</ul>
<pre><code class="language-sh">RUN command param1 param2 # 更推荐
RUN ["executable","param1","param2"]
</code></pre>
<ul>
<li><strong>WORKDIR:</strong> 用于切换构建过程中的工作目录,例:<code>WORKDIR project</code>。可配合环境变量使用,例:</li>
</ul>
<pre><code class="language-sh">ENV BASEDIR /project
WORKDIR $BASEDIR/test
</code></pre>
<ul>
<li>ONBUILD: 在当前镜像被当做基础镜像时,执行其携带指令,例:</li>
</ul>
<pre><code class="language-sh">ONBUILD RUN echo "hello world"
</code></pre>
<p>“hello world”会在子镜像被构建的过程中输出。</p>
<h3 id="23-引入指令">2.3 引入指令</h3>
<ul>
<li><strong>COPY:</strong> 拷贝文件或目录,格式:</li>
</ul>
<pre><code class="language-sh">COPY &lt;src&gt; &lt;dest&gt;
COPY ["&lt;src&gt;","&lt;dest&gt;"]
</code></pre>
<ul>
<li><strong>ADD:</strong> 在COPY的基础之上,ADD可识别压缩文件,例:<code>ADD rootfs.tar.xz /</code>。理论上也可添加网络地址,但还是建议在 RUN 指令中执行 wget 或 curl 命令,感觉这样更加可控。实际应用中我喜欢将 COPY 用于文件,ADD 用于目录(仅我个人的使用习惯)。</li>
</ul>
<h3 id="24-执行指令">2.4 执行指令</h3>
<ul>
<li><strong>CMD:</strong> 容器启动时需要执行的命令,格式:</li>
</ul>
<pre><code class="language-sh">CMD ["executable","param1","param2"] # 更推荐
CMD ["param1","param2"]
CMD command param1 param2
</code></pre>
<p>若在 docker run 中指定启动命令,则 CMD 将被覆盖。</p>
<ul>
<li>ENTRYPOINT:主程序启动前的准备指令,用于启动主程序所依赖的服务,格式同CMD(基本上没用过就不介绍了,而且容易出错,不推荐使用)。</li>
</ul>
<h3 id="25-配置指令">2.5 配置指令</h3>
<ul>
<li>EXPOSE: 暴露容器端口,格式:<code>EXPOSE &lt;port&gt; [&lt;port&gt;...]</code>,注意此处的暴露端口和docker run 中-p指定的映射端口是两个概念。</li>
<li>ENV: 声明环境变量,格式:<code>ENV &lt;key&gt;=&lt;value&gt; ...</code>。</li>
<li>LABEL: 标记,格式:<code>LABEL &lt;key&gt;=&lt;value&gt;...</code>。</li>
<li>USER: 设置启动容器的用户,格式:<code>USER daemo</code>。</li>
<li>ARG: 设置变量,格式同ENV。</li>
<li>STOPSIGNAL: 容器停止时给应用程序发出的信号,例:<code>STOPSIGNAL SIGKELL</code>。</li>
<li>SHELL: 指定shell,例:<code>SHELL ["bash","-c"]</code>。</li>
</ul>
<h2 id="3-docker-命令详解">3. Docker 命令详解</h2>
<p>为了避免喧宾夺主,此处仅摘录我个人操作中较为常用的命令。</p>
<h3 id="31-生命周期管理">3.1 生命周期管理</h3>
<ul>
<li><strong>run:</strong> 创建并运行容器,格式:<code>docker run IMAGE </code>,参数说明:</li>
</ul>
<pre><code class="language-sh">-d , --detach            # 后台运行
-it, --interactive tty   # 交互终端形式运行
-p , --publish list      # 指定端口
-v , --volume list       # 挂载存储卷
               --name string       # 定义名字
               --rm                # 容器终止后自动删除(不支持在后台运行的容器)
               --restart string    # no、on-failure(非正常退出时重启,on-failure:3 最多重启三次)、always、unless-stopped
</code></pre>
<p>docker run 的参数甚多,可通过 <code>--help</code> 查询,后续这些复杂的配置都会移交给 Docker Compose,以上几个足以应用70%~80%的场景,例:</p>
<pre><code class="language-sh"># 类似 ubuntu 这类容器必须以 -it 交互终端形式运行,否则无法在后台保留
docker run -it -d --name my-ubuntu ubuntu
</code></pre>
<pre><code class="language-sh"># 端口映射和挂载数据卷
docker run -d \
-p 8080:80 \
-v /data/www:/usr/share/nginx/html\
--name my-nginx nginx
</code></pre>
<ul>
<li>start/stop/restart:<code>docker start/stop/restart my-container</code>。</li>
<li>rm:移除容器,格式:<code>docker rm CONTAINER </code>,参数说明:</li>
</ul>
<pre><code class="language-sh">-f, --force   Force the removal of a running container
-l, --link      Remove the specified link
-v, --volumes   Remove the volumes associated with the container
</code></pre>
<ul>
<li>exec:在运行的容器中执行命令,不过更常用的还是先进入容器再执行命令,例子:<code>docker exec -it my-nginx bash</code>。</li>
</ul>
<h3 id="32-容器操作">3.2 容器操作</h3>
<ul>
<li><strong>ps:</strong> 列出容器,常用:<code>docker ps -anq</code>,参数说明:all、n last(最新 n 个容器)、quiet(只显示容器编号)。</li>
<li><strong>top:</strong> 查看容器中的进程信息,例:<code>docker top my-container</code>。</li>
<li><strong>logs:</strong> 查看容器日志,常用:<code>docker logs -f --tail</code>,参数说明:follow、--tail n(最新条日志)。</li>
<li>port:查看端口映射情况,例:<code>docker port my-container</code>。</li>
</ul>
<h3 id="33-镜像仓库">3.3 镜像仓库</h3>
<ul>
<li><strong>login/logout:</strong> 镜像仓库的登录和退出,格式:</li>
</ul>
<pre><code class="language-sh">docker login
docker logout
</code></pre>
<p>如果是Docker Hub,则示例如下:</p>
<pre><code class="language-sh">docker login -u username -p passward
docker logout
</code></pre>
<p>在生产环境中,我们一般会选择使用云厂商的镜像仓库,例:</p>
<pre><code class="language-sh">docker login -u yo****@qq.com -p ****** registry-vpc.cn-hangzhou.aliyuncs.com
docker logout registry-vpc.cn-hangzhou.aliyuncs.com
</code></pre>
<ul>
<li><strong>pull:</strong> 拉取镜像,最常用的命令之一,格式:<code>docker pull NAME[:TAG|@DIGEST]</code>。</li>
<li><strong>push:</strong> 上传镜像,格式:<code>docker push NAME[:TAG]</code>。</li>
</ul>
<h3 id="34-本地镜像管理">3.4 本地镜像管理</h3>
<ul>
<li><strong>images:</strong> 列出本地镜像,常用 <code>docker images -q</code>,参数说明:quiet(只显示image Id)。</li>
<li><strong>rmi:</strong> 删除本地镜像,常用 <code>docker rmi -f</code>,参数说明:force。</li>
<li><strong>tag:</strong> 标记镜像,归入仓库,格式:<code>docker tag IMAGE[:TAG] NAME[:TAG]</code>,例:<code>docker tag ubuntu youclk/my-ubuntu:v1</code>。</li>
<li><strong>build:</strong> 使用Dockerfile创建镜像,格式:<code>docker build PATH | URL | -</code>,参数说明:-t tag 例:<code>docker build -t youclk/my-ubuntu:v1 .</code>。</li>
</ul>
<h2 id="结语">结语</h2>
<p>静夜听钟却念念不安,举首相望,恐知者唯灯而~ 哀哉!整理至此,小弟拙笔盼君悦之。</p>
<hr>
<p>我的公众号《有刻》,我们共同成长!<br>
<img src="https://images2018.cnblogs.com/blog/801714/201805/801714-20180504015424584-1286454815.png" alt="" loading="lazy"></p>


</div>
<div id="MySignature" role="contentinfo">
    <blockquote>
作者:<span class="rose">捷义</span>
<br>
出处:http://www.cnblogs.com/youclk/
<br>
说明:转载请标明来源和作者
</blockquote><br><br>
来源:https://www.cnblogs.com/youclk/p/8371108.html
頁: [1]
查看完整版本: Docker 小记 — Docker Engine