天天看点

docker深入1-docker初次安装使用

<code>===</code>

<code>参考资料:</code>

<code>Docker 和一个正常的虚拟机有何区别?http:</code><code>//developer</code><code>.51cto.com</code><code>/art/201312/421964</code><code>.htm</code>

<code>全球首部Docker书籍:让你迈出使用Docker的第一步(1) http:</code><code>//cloud</code><code>.51cto.com</code><code>/art/201412/461998</code><code>.htm</code>

<code>docker镜像与容器存储结构分析 http:</code><code>//www</code><code>.csdn123.com</code><code>/html/topnews201408/94/7494</code><code>.htm</code>

<code>[root@test01 download]</code><code># yum update </code>

<code>【】安装</code>

<code>[root@test01 download]</code><code># yum install docker-io</code>

<code>[root@test01 download]</code><code># docker -v     </code>

<code>Docker version 1.3.2, build 39fa2fa</code><code>/1</code><code>.3.2</code>

<code>【】启动服务</code>

<code>[root@test01 download]</code><code># service docker start</code>

<code>【】查看状态</code>

<code>[root@test01 download]</code><code># docker info         </code>

<code>Containers: 0</code>

<code>Images: 0</code>

<code>Storage Driver: devicemapper</code>

<code> </code><code>Pool Name: docker-253:0-2228227-pool</code>

<code> </code><code>Pool Blocksize: 65.54 kB</code>

<code> </code><code>Data </code><code>file</code><code>: </code><code>/var/lib/docker/devicemapper/devicemapper/data</code>

<code> </code><code>Metadata </code><code>file</code><code>: </code><code>/var/lib/docker/devicemapper/devicemapper/metadata</code>

<code> </code><code>Data Space Used: 305.7 MB</code>

<code> </code><code>Data Space Total: 107.4 GB</code>

<code> </code><code>Metadata Space Used: 733.2 kB</code>

<code> </code><code>Metadata Space Total: 2.147 GB</code>

<code> </code><code>Library Version: 1.02.89-RHEL6 (2014-09-01)</code>

<code>Execution Driver: native-0.2</code>

<code>Kernel Version: 2.6.32-431.el6.x86_64</code>

<code>Operating System: &lt;unknown&gt;</code>

<code>【】将某个用户加入到docker组,以便已非root用户来运行docker命令。</code>

<code>[root@test01 download]</code><code># useradd Jack             </code>

<code>[root@test01 download]</code><code># usermod -a -G docker Jack</code>

<code>[root@test01 download]</code><code># id Jack</code>

<code>uid=500(Jack) gid=500(Jack) </code><code>groups</code><code>=500(Jack),490(docker)</code>

<code>[root@test01 download]</code><code># su Jack</code>

<code>【】查看images</code>

<code>[Jack@test01 download]$ docker images</code>

<code>REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE</code>

<code>从国内的仓库docker.cn上pull一个</code>

<code>[Jack@test01 download]$ docker pull docker.cn</code><code>/docker/centos</code>

<code>Pulling repository docker.cn</code><code>/docker/centos</code>

<code>34943839435d: Download complete </code>

<code>511136ea3c5a: Download complete </code>

<code>5b12ef8fd570: Download complete </code>

<code>Status: Downloaded newer image </code><code>for</code> <code>docker.cn</code><code>/docker/centos</code><code>:latest</code>

<code>再次查看</code>

<code>REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE</code>

<code>docker.cn</code><code>/docker/centos</code>   <code>centos7             34943839435d        5 weeks ago         224 MB</code>

<code>docker.cn</code><code>/docker/centos</code>   <code>latest              34943839435d        5 weeks ago         224 MB</code>

<code>[root@test01 download]</code><code># cd /var/lib/docker/</code>

<code>[root@test01 docker]</code><code># ls</code>

<code>containers  devicemapper  execdriver  graph  init  linkgraph.db  repositories-devicemapper  tmp  trust  volumes</code>

<code>【】查看docker使用的镜像层次存储的driver是devicemapper</code>

<code>查看内容:</code>

<code>[root@test01 download]</code><code># cat /var/lib/docker/repositories-devicemapper |python -mjson.tool</code>

<code>{</code>

<code>    </code><code>"Repositories"</code><code>: {</code>

<code>        </code><code>"docker.cn/docker/centos"</code><code>: {</code>

<code>            </code><code>"centos7"</code><code>: </code><code>"34943839435dfb2ee646b692eebb06af13823a680ace00c0adc232c437c4f90c"</code><code>, </code>

<code>            </code><code>"latest"</code><code>: </code><code>"34943839435dfb2ee646b692eebb06af13823a680ace00c0adc232c437c4f90c"</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>}</code>

<code>Device mapper driver 会创建一个100G的简单文件包含你的镜像和容器。每一个容器被限制在10G大小的卷内。</code>

<code>磁盘占用:100G不是实际占用,556M才是。</code>

<code>[root@test01 devicemapper]</code><code># cd devicemapper/devicemapper</code>

<code>[root@test01 devicemapper]</code><code># ll -h</code>

<code>total 556M</code>

<code>-rw------- 1 root root 100G Jan  7 14:52 data</code>

<code>-rw------- 1 root root 2.0G Jan  7 19:13 metadata</code>

<code>【】启动一个容器:</code>

<code>语法:</code>

<code>docker run -it -d --name Container_Name REPOSITORY:TAG CMD</code>

<code>-i:开启容器中STDIN</code>

<code>-t:分配一个</code><code>tty</code><code>来提供一个交互式shell</code>

<code>-d:后台模式</code>

<code>--name: 容器名</code>

<code>[Jack@test01 download]$ docker run -it docker.cn</code><code>/docker/centos</code> <code>/bin/bash</code>

<code>    </code> 

<code>[root@896725223c75 /]</code><code># ip a</code>

<code>13: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 16436 qdisc noqueue state UNKNOWN </code>

<code>    </code><code>link</code><code>/loopback</code> <code>00:00:00:00:00:00 brd 00:00:00:00:00:00</code>

<code>    </code><code>inet 127.0.0.1</code><code>/8</code> <code>scope host lo</code>

<code>    </code><code>inet6 ::1</code><code>/128</code> <code>scope host </code>

<code>       </code><code>valid_lft forever preferred_lft forever</code>

<code>14: eth0: &lt;BROADCAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000</code>

<code>    </code><code>link</code><code>/ether</code> <code>02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet 172.17.0.4</code><code>/16</code> <code>scope global eth0</code>

<code>    </code><code>inet6 fe80::42:acff:fe11:4</code><code>/64</code> <code>scope link </code>

<code>       </code> 

<code>[root@896725223c75 /]</code><code># cat /etc/hosts</code>

<code>172.17.0.4      896725223c75</code>

<code>ff02::2 ip6-allrouters</code>

<code>127.0.0.1       localhost</code>

<code>::1     localhost ip6-localhost ip6-loopback</code>

<code>fe00::0 ip6-localnet</code>

<code>ff00::0 ip6-mcastprefix</code>

<code>ff02::1 ip6-allnodes</code>

<code>该选项指定容器名</code>

<code>[Jack@test01 download]$ docker run --name </code><code>test</code><code>-docker-01    </code>

<code>【】如何用TAG</code>

<code>可以这样:</code>

<code>也可以这样:</code>

<code>[Jack@test01 download]$ docker run -it docker.cn</code><code>/docker/centos</code><code>:centos7 </code><code>/bin/bash</code>

<code>[Jack@test01 download]$ docker run -it docker.cn</code><code>/docker/centos</code><code>:7 </code><code>/bin/bash</code>

<code>不能这样:</code>

<code>[Jack@server200-21 ~]$ docker run -it docker.cn</code><code>/docker/centos</code><code>:centos </code><code>/bin/bash</code>

<code>Unable to </code><code>find</code> <code>image </code><code>'docker.cn/docker/centos:centos'</code> <code>locally</code>

<code>FATA[0000] Tag centos not found </code><code>in</code> <code>repository docker.cn</code><code>/docker/centos</code> 

<code>【】查看docker进程</code>

<code>docker </code><code>ps</code> <code>-l    该选项会列出最后一次运行的容器,包括正在运行和已经停止的。</code>

<code>docker </code><code>ps</code> <code>-a    显示全部容器</code>

<code>docker </code><code>ps</code> <code>-n 2  显示最近2个容器</code>

<code>[Jack@test01 download]$ docker </code><code>ps</code> <code>-a</code>

<code>CONTAINER ID        IMAGE                             COMMAND             CREATED             STATUS                       PORTS               NAMES</code>

<code>896725223c75        docker.cn</code><code>/docker/centos</code><code>:centos7   </code><code>"/bin/bash"</code>         <code>3 minutes ago       Exited (127) 2 seconds ago                       condescending_morse   </code>

<code>3eb4e1567db2        docker.cn</code><code>/docker/centos</code><code>:centos7   </code><code>"/bin/bash"</code>         <code>9 minutes ago       Exited (0) 8 minutes ago                         jolly_archimedes      </code>

<code>8a4f4b9e5984        docker.cn</code><code>/docker/centos</code><code>:centos7   </code><code>"/bin/bash"</code>         <code>11 minutes ago      Exited (0) 10 minutes ago                        </code><code>test</code><code>-docker-01</code>

<code>【】重新启动已经停止的容器</code>

<code>[Jack@test01 download]$ docker start </code><code>test</code><code>-docker-01</code>

<code>test</code><code>-docker-01</code>

<code>[Jack@test01 download]$ docker </code><code>ps</code>

<code>CONTAINER ID        IMAGE                             COMMAND             CREATED             STATUS              PORTS               NAMES</code>

<code>8a4f4b9e5984        docker.cn</code><code>/docker/centos</code><code>:centos7   </code><code>"/bin/bash"</code>         <code>14 minutes ago      Up 22 seconds                           </code><code>test</code><code>-docker-01</code>

<code>Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行,因此我们容器重新启动后会运行一个交互式会话shell。此外,我们也可以用docker attach命令,重新附着到该容器的会话上</code>

<code>[Jack@test01 download]$ docker attach </code><code>test</code><code>-docker-01</code>

<code>[root@8a4f4b9e5984 /]</code><code># exit</code>

<code>【】守护式容器</code>

<code>除了这些交互式运行的容器(interactive container),我们也可以创建长期运行的容器。</code>

<code>守护式容器 (daemonized container) 没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。</code>

<code>[Jack@test01 docker]$ docker run --name </code><code>test</code><code>-docker02-daemon -d docker.cn</code><code>/docker/centos</code> <code>/bin/bash</code> <code>-c </code><code>"while true; do echo hello world; sleep 1; done"</code> 

<code>589a71825c044120a5729dca24154dd32c257bfa529d83966a931ea67e2d058f</code>

<code>【】使用logs来查看容器的日志</code>

<code>[Jack@test01 docker]$ docker logs </code><code>test</code><code>-docker02-daemon</code>

<code>hello world</code>

<code>类似</code><code>tail</code> <code>-n</code>

<code>[Jack@test01 docker]$ docker logs --</code><code>tail</code> <code>10 </code><code>test</code><code>-docker02-daemon</code>

<code>类似</code><code>tail</code> <code>-f</code>

<code>[Jack@test01 docker]$ docker logs -f </code><code>test</code><code>-docker02-daemon       </code>

<code>查看容器内的进程,类似</code><code>top</code>

<code>[Jack@test01 docker]$ docker </code><code>top</code> <code>test</code><code>-docker02-daemon</code>

<code>UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD</code>

<code>root                28600               26577               0                   19:41               ?                   00:00:00            </code><code>/bin/bash</code> <code>-c </code><code>while</code> <code>true</code><code>; </code><code>do</code> <code>echo</code> <code>hello world; </code><code>sleep</code> <code>1; </code><code>done</code>

<code>root                28898               28600               0                   19:44               ?                   00:00:00            </code><code>sleep</code> <code>1</code>

<code>【】在容器内部运行进程</code>

<code>[Jack@test01 docker]$ docker </code><code>exec</code> <code>-d </code><code>test</code><code>-docker02-daemon </code><code>touch</code> <code>/etc/new_file</code>

<code>【】启动一个诸如打开shell的交互式任务</code>

<code>[Jack@test01 docker]$ docker </code><code>exec</code> <code>-t -i </code><code>test</code><code>-docker02-daemon </code><code>/bin/bash</code>

<code>[root@589a71825c04 /]</code><code># ls /etc/new*</code>

<code>/etc/new_file</code>

<code>【】停止守护式容器</code>

<code>docker stop命令会向Docker容器进程发送SIGTERM信号。</code>

<code>docker </code><code>kill</code><code>命令来向容器进程发送SIGKILL信号。如果你想快速停止某个容器。</code>

<code>[Jack@test01 docker]$ docker stop </code><code>test</code><code>-docker02-daemon</code>

<code>test</code><code>-docker02-daemon</code>

<code>【】自动重启容器</code>

<code>docker run --restart=always --name </code><code>test</code><code>-docker03 -d docker.cn</code><code>/docker/centos</code> <code>bin</code><code>/bash</code> <code>-c </code><code>"while true; do echo hello world; sleep 1; done"</code> 

<code>--restart标志被设置为always。无论容器的退出代码是什么,Docker都会自动重启该容器,除了always。</code>

<code>我们还可以将这个标志设为on-failure,这样,只有当容器的退出代码为非0值的时候,才会自动重启。另外,on-failure``还接受``一个可选的重启次数参数,例如:</code>

<code>--restart=on-failure:5  </code>

<code>【】使用inspect得到更多信息</code>

<code>[Jack@test01 docker]$ docker inspect </code><code>test</code><code>-docker02-daemon </code>

<code>[Jack@test01 docker]$ docker inspect --help</code>

<code>Usage: docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]</code>

<code>Return low-level information on a container or image</code>

<code>  </code><code>-f, --</code><code>format</code><code>=</code><code>""</code>    <code>Format the output using the given go template.</code>

<code>  </code><code>--help=</code><code>false</code>       <code>Print usage</code>

<code>  </code> 

<code>docker inspect 某个容器名,会返回一堆json格式的数据;</code>

<code>可以指定-f or --</code><code>format</code>  <code>后边跟着key的名称,这样可以精确匹配到value</code>

<code>例如:得到容器app1所在的docker host的IP地址:</code>

<code>[Jack@test01 docker]</code><code># docker inspect -f '{{ .NetworkSettings.IPAddress }}' app1</code>

<code>172.17.0.12</code>

<code>【】删除容器</code>

<code>需要注意的是,运行中的Docker容器是无法删除的!你必须先通过docker stop或docker </code><code>kill</code><code>命令停止容器,才能将其删除。</code>

<code>[Jack@test01 docker]$ docker </code><code>rm</code> <code>test</code><code>-docker02-daemon</code>

<code>删除所有容器</code>

<code>-a:列出所有容器</code>

<code>-q:只返回容器的ID</code>

<code>[Jack@test01 docker]$ docker </code><code>rm</code> <code>`docker </code><code>ps</code> <code>-aq`</code>

<code>896725223c75</code>

<code>3eb4e1567db2</code>

<code>8a4f4b9e5984</code>

<code>[Jack@test01 docker]$ docker </code><code>ps</code> <code>-a</code>

<code>CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES</code>

本文转自 pcnk 51CTO博客,原文链接:http://blog.51cto.com/nosmoking/1611825,如需转载请自行联系原作者