<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>学习笔记 on Java 技术探秘</title>
    <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
    <description>Recent content in 学习笔记 on Java 技术探秘</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 10 Jan 2021 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【docker实践】之二：安装redis</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%AE%9E%E8%B7%B5%E4%B9%8B%E4%BA%8C%E5%AE%89%E8%A3%85redis/</link>
      <pubDate>Sun, 10 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%AE%9E%E8%B7%B5%E4%B9%8B%E4%BA%8C%E5%AE%89%E8%A3%85redis/</guid>
      <description>1.获取镜像 # 先查询镜像，找到自己想要的 docker search redis # 拉取镜像，可指定tag，如拉取redis 5.0：docker pull redis:5.0 # 如果未指定tag，则拉取最新版本 docker pull redis:5.0 2.编写redis配置文件 由于docker容器的独立性，在容器删除时，redis中持久化的文件也会删除。为了解决这个问题，我们在启动docker时，需要将redis的持久化文件目录映射到宿主机，这样只即使docker删除了，只要不删除宿主机的文件，数据文件会一直保留，下次要使用时，只须重新运行一个docker容器，将redis的持久化文件目录映射到宿主机的相应目录即可。&#xA;目录规划如下：&#xA;新建/data/docker_data/redis_5.0目录 进入/data/docker_data/redis_5.0，创建conf、data、logs目录 进入/data/docker_data/redis_5.0/conf目录，创建文本文件，内容如下： bind 0.0.0.0 protected-mode yes port 6379 daemonize no pidfile /var/run/redis_6379.pid loglevel notice logfile &amp;#34;&amp;#34; databases 16 always-show-logo yes requirepass 2v8P5#ai1b%i save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /data appendonly yes appendfilename &amp;#34;appendonly.aof&amp;#34; appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes 将文件名保存为redis.</description>
    </item>
    <item>
      <title>【docker实践】之一：安装mysql</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%AE%9E%E8%B7%B5%E4%B9%8B%E4%B8%80%E5%AE%89%E8%A3%85mysql/</link>
      <pubDate>Sat, 09 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%AE%9E%E8%B7%B5%E4%B9%8B%E4%B8%80%E5%AE%89%E8%A3%85mysql/</guid>
      <description>1.获取镜像 # 先查询镜像，找到自己想要的 docker search mysql # 拉取镜像，可指定tag，如拉取mysql 5.7：docker pull mysql:5.7 # 如果未指定tag，则拉取最新版本 docker pull mysql 2.配置mysql目录及文件 由于docker容器的独立性，在容器删除时，mysql的文件也会删除。为了解决这个问题，我们在启动docker时，需要将mysql的数据文件目录映射到宿主机，这样只即使docker删除了，只要不删除宿主机的文件，数据文件会一直保留，下次要使用时，只须重新运行一个docker容器，将mysql的数据文件目录映射到宿主机的相应目录即可。&#xA;目录规划如下：&#xA;在~目录下新建mysql文件 进入mysql文件夹，再创建conf、data文件夹(data目录存放mysql数据，可酌情存放到其他盘) 进行conf文件夹，新建txt文件，内容如下： [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION lower_case_table_names=1 并将文件名保存为my.cnf。更多mysql配置，请参阅官方文档。&#xA;整个目录结构如下：&#xA;mysql ├─conf │ └─my.cnf └─data 3.启动docker docker run -p 3306:3306 --name mysql -v ~/mysql/conf/my.cnf:/etc/mysql/my.cnf -v ~/mysql/logs:/data/docker_data/mysql_5.7/logs:/var/log/mysql/ -v ~/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -d mysql:latest 命令解释如下：</description>
    </item>
    <item>
      <title>docker入门与实践之【08-外部访问容器】</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B08-%E5%A4%96%E9%83%A8%E8%AE%BF%E9%97%AE%E5%AE%B9%E5%99%A8/</link>
      <pubDate>Fri, 08 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B08-%E5%A4%96%E9%83%A8%E8%AE%BF%E9%97%AE%E5%AE%B9%E5%99%A8/</guid>
      <description>1.端口映射 容器中可以运行一些网络应用，要让外部也可以访问这些应用，可以通过 -P 或 -p 参数来指定端口映射。&#xA;示例：&#xA;$ docker run -d -P training/webapp python app.py $ docker container ls -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155-&amp;gt;5000/tcp nostalgic_morse -p 则可以指定要映射的端口，并且，在一个指定端口上只可以绑定一个容器。支持的格式有&#xA;ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。 1.1 映射所有接口地址 使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口，可以执行&#xA;$ docker run -d -p 5000:5000 training/webapp python app.py 此时默认会绑定本地所有接口上的所有地址。&#xA;1.2 映射到指定地址的指定端口 可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址，比如 localhost 地址 127.</description>
    </item>
    <item>
      <title>docker入门与实践之【07-数据管理】</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B07-%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86/</link>
      <pubDate>Thu, 07 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B07-%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86/</guid>
      <description>1.数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录，它绕过UFS，可以提供很多有用的特性：&#xA;数据卷 可以在容器之间共享和重用 对 数据卷 的修改会立马生效 对 数据卷 的更新，不会影响镜像数据卷 默认会一直存在，即使容器被删除 注意：数据卷 的使用，类似于 Linux 下对目录或文件进行 mount，镜像中的被指定为挂载点的目录中的文件会隐藏掉，能显示看的是挂载的 数据卷。&#xA;1.1 创建一个数据卷 $ docker volume create my-vol 查看所有的 数据卷&#xA;$ docker volume ls 查看指定的数据卷信息&#xA;$ docker volume inspect my-vol [ { &amp;#34;Driver&amp;#34;: &amp;#34;local&amp;#34;, &amp;#34;Labels&amp;#34;: {}, &amp;#34;Mountpoint&amp;#34;: &amp;#34;/var/lib/docker/volumes/my-vol/_data&amp;#34;, &amp;#34;Name&amp;#34;: &amp;#34;my-vol&amp;#34;, &amp;#34;Options&amp;#34;: {}, &amp;#34;Scope&amp;#34;: &amp;#34;local&amp;#34; } ] 1.2 启动一个挂载数据卷的容器 在用 docker run 命令的时候，使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷。&#xA;示例：&#xA;$ docker run -d -P \ --name web \ # -v my-vol:/wepapp \ --mount source=my-vol,target=/webapp \ training/webapp \ python app.</description>
    </item>
    <item>
      <title>docker入门与实践之【06-操作容器】</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B06-%E6%93%8D%E4%BD%9C%E5%AE%B9%E5%99%A8/</link>
      <pubDate>Wed, 06 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B06-%E6%93%8D%E4%BD%9C%E5%AE%B9%E5%99%A8/</guid>
      <description>1.启动 启动容器有两种方式，一种是基于镜像新建一个容器并启动，另外一个是将在终止状态（stopped）的容器重新启动。&#xA;1.1 新建并启动 所需要的命令主要为 docker run。&#xA;例如，下面的命令输出一个 “Hello World”，之后终止容器。&#xA;$ docker run ubuntu:14.04 /bin/echo &amp;#39;Hello world&amp;#39; Hello world 下面的命令则启动一个 bash 终端，允许用户进行交互。&#xA;$ docker run -t -i ubuntu:14.04 /bin/bash root@af8bae53bdd3:/# 其中，&#xA;-t 选项让Docker分配一个伪终端（pseudo-tty）并绑定到容器的标准输入上， -i 则让容器的标准输入保持打开。 1.2 启动已终止容器 可以利用 docker container start 命令，直接将一个已经终止的容器启动运行。 2. 后台运行 很多时候，需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时，可以通过添加 -d 参数来实现。&#xA;示例：&#xA;$ docker run -d ubuntu:17.10 /bin/sh -c &amp;#34;while true; do echo hello world; sleep 1; done&amp;#34; 77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a 使用 -d 参数启动后会返回一个唯一的 id，也可以通过 docker container ls 命令来查看容器信息。</description>
    </item>
    <item>
      <title>docker入门与实践之【05-其他镜像制作方式】</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B05-%E5%85%B6%E4%BB%96%E9%95%9C%E5%83%8F%E5%88%B6%E4%BD%9C%E6%96%B9%E5%BC%8F/</link>
      <pubDate>Tue, 05 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B05-%E5%85%B6%E4%BB%96%E9%95%9C%E5%83%8F%E5%88%B6%E4%BD%9C%E6%96%B9%E5%BC%8F/</guid>
      <description>1.从压缩包导入 格式：docker import [选项] &amp;lt;文件&amp;gt;|&amp;lt;URL&amp;gt;|- [&amp;lt;仓库名&amp;gt;[:&amp;lt;标签&amp;gt;]]&#xA;# 从网络导入ubuntu14.04镜像 $ docker import \ http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz \ openvz/ubuntu:14.04 可以使用history命令查询构建记录：&#xA;docker history openvz/ubuntu:14.04 IMAGE CREATED CREATED BY SIZE COMMENT f477a6e18e98 About a minute ago 214.9 MB Imported from http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz 2.docker save 和 docker load 使用 docker save 命令可以将镜像保存为归档文件。&#xA;比如我们希望保存这个 alpine 镜像。&#xA;$ docker image ls alpine REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest baa5d63471ea 5 weeks ago 4.803 MB 保存镜像的命令为：&#xA;$ docker save alpine | gzip &amp;gt; alpine-latest.</description>
    </item>
    <item>
      <title>docker入门与实践之【04-Dockfile指令】</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B04-dockfile%E6%8C%87%E4%BB%A4/</link>
      <pubDate>Mon, 04 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B04-dockfile%E6%8C%87%E4%BB%A4/</guid>
      <description>1.COPY 复制文件 格式：&#xA;COPY &amp;lt;源路径&amp;gt;... &amp;lt;目标路径&amp;gt; COPY [&amp;#34;&amp;lt;源路径1&amp;gt;&amp;#34;,... &amp;#34;&amp;lt;目标路径&amp;gt;&amp;#34;] COPY 指令将从构建上下文目录中 &amp;lt;源路径&amp;gt; 的文件/目录复制到新的一层的镜像内的 &amp;lt;目标路径&amp;gt; 位置。比如：&#xA;COPY package.json /usr/src/app/ &amp;lt;源路径&amp;gt; 可以是多个，甚至可以是通配符，其通配符规则要满足 Go 的 filepath.Match 规则&#xA;&amp;lt;目标路径&amp;gt; 可以是容器内的绝对路径，也可以是相对于工作目录的相对路径（工作目录可以用 WORKDIR 指令来指定）。&#xA;2.ADD 更高级的复制文件 ADD使用格式与COPY一致，不同的是，如果 &amp;lt;源路径&amp;gt; 为一个 tar 压缩文件的话，压缩格式为 gzip, bzip2 以及 xz 的情况下，ADD 指令将会自动解压缩这个压缩文件到 &amp;lt;目标路径&amp;gt; 去。 比如官方镜像 ubuntu 中：&#xA;FROM scratch ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz / ... COPY与ADD选用原则： 所有的文件复制应使用 COPY 指令，仅在需要自动解压缩的场合使用 ADD。&#xA;3.CMD 容器启动命令 CMD 指令的格式和 RUN 相似，也是两种格式：&#xA;shell 格式：CMD &amp;lt;命令&amp;gt; exec 格式：CMD [&amp;#34;可执行文件&amp;#34;, &amp;#34;参数1&amp;#34;, &amp;#34;参数2&amp;#34;.</description>
    </item>
    <item>
      <title>docker入门与实践之【03-使用dockerfile定制镜像】</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B03-%E4%BD%BF%E7%94%A8dockerfile%E5%AE%9A%E5%88%B6%E9%95%9C%E5%83%8F/</link>
      <pubDate>Sun, 03 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B03-%E4%BD%BF%E7%94%A8dockerfile%E5%AE%9A%E5%88%B6%E9%95%9C%E5%83%8F/</guid>
      <description>利用dockerfile定制镜像 Dockerfile 是一个文本文件，其内包含了一条条的指令(Instruction)，每一条指令构建一层，因此每一条指令的内容，就是描述该层应当如何构建。&#xA;以定制nginx 镜像为例，使用 Dockerfile 来定制。&#xA;在一个空白目录中，建立一个文本文件，并命名为 Dockerfile：&#xA;$ mkdir mynginx $ cd mynginx $ touch Dockerfile 其内容为：&#xA;FROM nginx RUN echo &amp;#39;&amp;lt;h1&amp;gt;Hello, Docker!&amp;lt;/h1&amp;gt;&amp;#39; &amp;gt; /usr/share/nginx/html/index.html 1 FROM 指定基础镜像 所谓定制镜像，那一定是以一个镜像为基础，在其上进行定制.FROM 就是指定基础镜像，一个 Dockerfile 中 FROM 是必备的指令，并且必须是第一条指令。&#xA;2 RUN 执行命令 RUN 指令是用来执行命令行命令的。由于命令行的强大能力，RUN 指令在定制镜像时是最常用的指令之一。其格式有两种：&#xA;shell 格式：RUN &amp;lt;命令&amp;gt;，就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。 RUN echo &amp;#39;&amp;lt;h1&amp;gt;Hello, Docker!&amp;lt;/h1&amp;gt;&amp;#39; &amp;gt; /usr/share/nginx/html/index.html exec 格式：RUN [&amp;quot;可执行文件&amp;quot;, &amp;quot;参数1&amp;quot;, &amp;quot;参数2&amp;quot;]，这更像是函数调用中的格式。 Dockerfile 中每一个指令都会建立一层，RUN 也不例外。每一个 RUN 的行为，就和刚才我们手工建立镜像的过程一样：新建立一层，在其上执行这些命令，执行结束后，commit 这一层的修改，构成新的镜像。&#xA;Union FS 是有最大层数限制的，比如 AUFS，曾经是最大不得超过 42 层，现在是不得超过 127 层。为了不生成非必要层，使用RUN指令时，可以使用如下方法：</description>
    </item>
    <item>
      <title>docker入门与实践之【02-镜像】</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B02-%E9%95%9C%E5%83%8F/</link>
      <pubDate>Sat, 02 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B02-%E9%95%9C%E5%83%8F/</guid>
      <description>1. 获取镜像 1.1 获取镜像 docker获取镜像的命令是pull，命令格式为：&#xA;docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 具体的选项可以通过 docker pull &amp;ndash;help 命令看到，这里我们说一下镜像名称的格式。&#xA;Docker 镜像仓库地址：地址的格式一般是 &amp;lt;域名/IP&amp;gt;[:端口号]。默认地址是 Docker Hub。 仓库名：如之前所说，这里的仓库名是两段式名称，即 &amp;lt;用户名&amp;gt;/&amp;lt;软件名&amp;gt;。对于 Docker Hub，如果不给出用户名，则默认为 library，也就是官方镜像。 示例：&#xA;docker pull ubuntu:16.04 1.2 运行 有了镜像后，我们就能够以这个镜像为基础启动并运行一个容器。以上面的 ubuntu:16.04 为例，如果我们打算启动里面的 bash 并且进行交互式操作的话，可以执行下面的命令。&#xA;$ docker run -it --rm \ ubuntu:16.04 \ bash 说明： docker run 就是运行容器的命令，后面再细讲。&#xA;-it：这是两个参数，一个是 -i：交互式操作，一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果，因此我们需要交互式终端。 &amp;ndash;rm：这个参数是说容器退出后随之将其删除。默认情况下，为了排障需求，退出的容器并不会立即删除，除非手动 docker rm。我们这里只是随便执行个命令，看看结果，不需要排障和保留结果，因此使用 &amp;ndash;rm 可以避免浪费空间。 ubuntu:16.04：这是指用 ubuntu:16.04 镜像为基础来启动容器。 bash：放在镜像名后的是命令，这里我们希望有个交互式 Shell，因此用的是 bash。 1.3 搜索镜像 可以通过 docker search 命令来查找官方仓库中的镜像</description>
    </item>
    <item>
      <title>docker入门与实践之【01-基本概念】</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B01-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/</link>
      <pubDate>Fri, 01 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E8%B7%B5%E4%B9%8B01-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/</guid>
      <description>1.docker镜像 Docker 镜像（Image），就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。&#xA;2.docker容器 镜像（Image）和容器（Container）的关系，就像是面向对象程序设计中的 类 和 实例 一样，镜像是静态的定义，容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。&#xA;容器的实质是进程，但与直接在宿主执行的进程不同，容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间，甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里，使用起来，就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性，很多人初学 Docker 时常常会混淆容器和虚拟机。&#xA;==按照 Docker 最佳实践的要求==，容器不应该向其存储层内写入任何数据，容器存储层要保持无状态化。所有的文件写入操作，都应该使用 数据卷（Volume）、或者绑定宿主目录，在这些位置的读写会跳过容器存储层，直接对宿主（或网络存储）发生读写，其性能和稳定性更高。&#xA;数据卷的生存周期独立于容器，容器消亡，数据卷不会消亡。因此，使用数据卷后，容器删除或者重新运行之后，数据却不会丢失。&#xA;3.仓库 通常，一个仓库会包含同一个软件不同版本的镜像，而标签就常用于对应该软件的各个版本。我们可以通过 &amp;lt;仓库名&amp;gt;:&amp;lt;标签&amp;gt; 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签，将以 latest 作为默认标签。&#xA;以 Ubuntu 镜像 为例，ubuntu 是仓库的名字，其内包含有不同的版本标签，如，14.04, 16.04。我们可以通过 ubuntu:14.04，或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签，比如 ubuntu，那将视为 ubuntu:latest。&#xA;仓库名经常以 两段式路径 形式出现，比如 jwilder/nginx-proxy，前者往往意味着 Docker Registry 多用户环境下的用户名，后者则往往是对应的软件名。但这并非绝对，取决于所使用的具体 Docker Registry 的软件或服务。</description>
    </item>
  </channel>
</rss>
