您的位置:首页 > 运维架构 > Docker

Docker的安装配置及使用详解

2016-09-12 09:53 736 查看

基本概念

Docker 包括三个基本概念

镜像(Image)
容器(Container)
仓库(Repository)


Docker 镜像

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新
的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。


Docker 仓库

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。


Docker 容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
先理解了这三个概念,就理解了 Docker 的整个生命周期。

1、docker安装与启动

<code class="language-shell hljs applescript has-numbering">yum install -y epel-release
yum install docker-io <span class="hljs-comment"># 安装docker</span>
<span class="hljs-comment"># 配置文件 /etc/sysconfig/docker</span>

chkconfig docker <span class="hljs-function_start"><span class="hljs-keyword">on</span></span>  <span class="hljs-comment"># 加入开机启动</span>
service docker start <span class="hljs-comment"># 启动docker服务</span>

<span class="hljs-comment"># 基本信息查看</span>
docker <span class="hljs-property">version</span> <span class="hljs-comment"># 查看docker的版本号,包括客户端、服务端、依赖的Go等</span>
docker info <span class="hljs-comment"># 查看系统(docker)层面信息,包括管理的images, containers数等</span>
docker pull centos 下载
docker images [ centos ] 查看
docker <span class="hljs-command">run</span> -i -t centos /bin/bash</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul>

2、镜像的获取与容器的使用

<code class="language-shell hljs bash has-numbering"><span class="hljs-comment"># 搜索镜像</span>
docker search <image> <span class="hljs-comment"># 在docker index中搜索image</span>
<span class="hljs-comment"># 下载镜像</span>
docker pull <image>  <span class="hljs-comment"># 从docker registry server 中下拉image</span>
<span class="hljs-comment"># 查看镜像 </span>
docker images: <span class="hljs-comment"># 列出images</span>
docker images <span class="hljs-operator">-a</span> <span class="hljs-comment"># 列出所有的images(包含历史)</span>
docker rmi  <image ID>: <span class="hljs-comment"># 删除一个或多个image</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>
<code class="hljs axapta has-numbering"><span class="hljs-preprocessor"># 使用镜像创建容器</span>
docker run -i -t sauloal/ubuntu14<span class="hljs-number">.04</span>
docker run -i -t sauloal/ubuntu14<span class="hljs-number">.04</span> /bin/bash <span class="hljs-preprocessor"># 创建一个容器,让其中运行 bash 应用,退出后容器关闭</span>
docker run -itd --name centos_aways --restart=always centos <span class="hljs-preprocessor">#创建一个名称centos_aways的容器,自动重启</span>
<span class="hljs-preprocessor"># --restart参数:always始终重启;on-failure退出状态非0时重启;默认为,no不重启</span>

<span class="hljs-preprocessor"># 查看容器</span>
docker ps :列出当前所有正在运行的<span class="hljs-keyword">container</span>
docker ps -l :列出最近一次启动的<span class="hljs-keyword">container</span>
docker ps -a :列出所有的<span class="hljs-keyword">container</span>(包含历史,即运行过的<span class="hljs-keyword">container</span>)
docker ps -q :列出最近一次运行的<span class="hljs-keyword">container</span> ID
<span class="hljs-preprocessor"># 再次启动容器</span>
docker start/stop/restart <<span class="hljs-keyword">container</span>> <span class="hljs-preprocessor">#:开启/停止/重启container</span>
docker start [container_id] <span class="hljs-preprocessor">#:再次运行某个container (包括历史container)</span>
<span class="hljs-preprocessor">#进入正在运行的docker容器</span>
docker exec -it [container_id] /bin/bash
docker run -i -t -p <host_port:contain_port> <span class="hljs-preprocessor">#:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。</span>

<span class="hljs-preprocessor"># 删除容器</span>
docker rm <<span class="hljs-keyword">container</span>...> <span class="hljs-preprocessor">#:删除一个或多个container</span>
docker rm `docker ps -a -q` <span class="hljs-preprocessor">#:删除所有的container</span>
docker ps -a -q | xargs docker rm <span class="hljs-preprocessor">#:同上, 删除所有的container</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li></ul>

docker run 和 docker create 参数基本一样,run是创建容器并后台启动,create是只创建容器。

docker run 相当于docker create 和 docker start

<code class="hljs lasso has-numbering">run创建容器:docker run <span class="hljs-attribute">-itd</span>
create创建: docker create <span class="hljs-attribute">-it</span>
<span class="hljs-attribute">-t</span>, <span class="hljs-subst">--</span>tty                       Allocate a pseudo<span class="hljs-attribute">-TTY</span>
<span class="hljs-attribute">-i</span>, <span class="hljs-subst">--</span>interactive               Keep STDIN open even <span class="hljs-keyword">if</span> <span class="hljs-literal">not</span> attached
<span class="hljs-attribute">-d</span>, <span class="hljs-subst">--</span>detach                    Run container <span class="hljs-keyword">in</span> background <span class="hljs-literal">and</span> print container ID <span class="hljs-variable">#run</span>的参数</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

进入容器 - nsenter 命令

nsenter安装

nsenter 工具在 util-linux 包2.23版本后包含。 如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。

<code class="hljs ruby has-numbering">cd /usr/src ; wget <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/www.kernel.org/pub</span><span class="hljs-regexp">/linux/utils</span><span class="hljs-regexp">/util-linux/v</span>2.<span class="hljs-number">28</span>/util-linux-<span class="hljs-number">2.28</span>.tar.gz
./configure --without-ncurses
make nsenter && sudo cp nsenter /usr/local/bin</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

nsenter使用

nsenter 可以访问另一个进程的名字空间。nsenter 要正常工作需要有 root 权限。

为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。

<code class="hljs mel has-numbering">PID=<span class="hljs-variable">$(</span>docker inspect --<span class="hljs-keyword">format</span> <span class="hljs-string">"{{ .State.Pid }}"</span> <<span class="hljs-keyword">container</span>>)</code><ul style="" class="pre-numbering"><li>1</li></ul>

通过这个 PID,就可以连接到这个容器:

<code class="hljs brainfuck has-numbering"><span class="hljs-comment">nsenter</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">target</span> <span class="hljs-comment">$PID</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">mount</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">uts</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">ipc</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">net</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">pid</span></code><ul style="" class="pre-numbering"><li>1</li></ul>

更简单的,建议下载 .bashrc_docker,并将内容放到 .bashrc 中。

<code class="hljs ruby has-numbering">wget -<span class="hljs-constant">P</span> ~ <span class="hljs-symbol">https:</span>/<span class="hljs-regexp">/github.com/yeasy</span><span class="hljs-regexp">/docker_practice/raw</span><span class="hljs-regexp">/master/</span>_local/.bashrc_docker;
echo <span class="hljs-string">"[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker"</span> >> ~<span class="hljs-regexp">/.bashrc; source ~/</span>.bashrc</code><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul>

这个文件中定义了很多方便使用 Docker 的命令,例如 docker-pid 可以获取某个容器的 PID;而

docker-enter 可以进入容器或直接在容器内执行命令。

<code class="hljs mel has-numbering">echo <span class="hljs-variable">$(</span>docker-pid <<span class="hljs-keyword">container</span>>)
docker-enter <<span class="hljs-keyword">container</span>> <span class="hljs-keyword">ls</span>
docker-enter <<span class="hljs-keyword">container</span>> bash</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

3、持久化容器与镜像

3.1 通过容器生成新的镜像

运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用docker commit 命令可以把一个正在运行的容器变成一个新的镜像。

<code class="language-shell hljs mel has-numbering">docker commit <<span class="hljs-keyword">container</span>> [repo:tag] # 将一个<span class="hljs-keyword">container</span>固化为一个新的<span class="hljs-keyword">image</span>,后面的repo:tag可选。</code><ul style="" class="pre-numbering"><li>1</li></ul>

3.2 持久化容器

export命令用于持久化容器

<code class="language-shell hljs rust has-numbering">docker <span class="hljs-keyword">export</span> <CONTAINER ID> > /tmp/<span class="hljs-keyword">export</span>.tar</code><ul style="" class="pre-numbering"><li>1</li></ul>

3.3 持久化镜像

Save命令用于持久化镜像

<code class="language-shell hljs ruby has-numbering">docker save 镜像<span class="hljs-constant">ID</span> > <span class="hljs-regexp">/tmp/save</span>.tar</code><ul style="" class="pre-numbering"><li>1</li></ul>

3.4 导入持久化container

删除container 2161509ff65e

<code class="language-sh hljs cpp has-numbering">docker rm <span class="hljs-number">2161509f</span>f65e</code><ul style="" class="pre-numbering"><li>1</li></ul>

导入export.tar文件

<code class="language-sh hljs d has-numbering">cat /tmp/<span class="hljs-keyword">export</span>.tar | docker <span class="hljs-keyword">import</span> - <span class="hljs-keyword">export</span>:latest</code><ul style="" class="pre-numbering"><li>1</li></ul>

3.5 导入持久化image

删除image daa11948e23d

<code class="language-sh hljs  has-numbering">docker rmi daa11948e23d</code><ul style="" class="pre-numbering"><li>1</li></ul>

导入save.tar文件

<code class="language-shell hljs ruby has-numbering">docker load < <span class="hljs-regexp">/tmp/save</span>.tar</code><ul style="" class="pre-numbering"><li>1</li></ul>

对image打tag

<code class="language-sh hljs lasso has-numbering">docker <span class="hljs-built_in">tag</span> daa11948e23d load:<span class="hljs-built_in">tag</span></code><ul style="" class="pre-numbering"><li>1</li></ul>

3.6 export-import与save-load的区别

导出后再导入(export-import)的镜像会丢失所有的历史,而保存后再加载(save-load)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚。(可以执行docker tag 来回滚之前的层)。

3.7 一些其它命令

<code class="language-sh hljs mel has-numbering"> docker logs <span class="hljs-variable">$CONTAINER_ID</span> #查看docker实例运行日志,确保正常运行
docker inspect <span class="hljs-variable">$CONTAINER_ID</span> #docker inspect <<span class="hljs-keyword">image</span>|<span class="hljs-keyword">container</span>> 查看<span class="hljs-keyword">image</span>或<span class="hljs-keyword">container</span>的底层信息
docker build <path> 寻找path路径下名为的Dockerfile的配置文件,使用此配置生成新的<span class="hljs-keyword">image</span>
docker build -t repo[:tag] 同上,可以指定repo和可选的tag
docker build - < <dockerfile> 使用指定的dockerfile配置文件,docker以stdin方式获取内容,使用此配置生成新的<span class="hljs-keyword">image</span>
docker port <<span class="hljs-keyword">container</span>> <<span class="hljs-keyword">container</span> port> 查看本地哪个端口映射到<span class="hljs-keyword">container</span>的指定端口,其实用docker ps 也可以看到</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>

一些使用技巧

docker文件存放目录

Docker实际上把所有东西都放到/var/lib/docker路径下了。

<code class="language-sh hljs ruby has-numbering">[root<span class="hljs-variable">@localhost</span> docker]<span class="hljs-comment"># ls -F</span>
containers/  devicemapper/  execdriver/  graph/  init/  linkgraph.db  repositories-devicemapper  volumes/</code><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul>

containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system layer)存放在graph/imageid/layer路径下,这样我们就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如何一层一层叠加起来的。

转载请务必保留此出处:http://blog.csdn.net/fgf00/article/details/51893771

一张图总结 Docker 的命令

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: