兴来每独往,胜事空自知。行到水穷处,坐看云起时

hello world

Docker入门(2)

21 June ’16

root@ubuntu:~# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
ouruser/sinatra           v2                  7e9b2767cf4f        3 hours ago         320.9 MB
jingyu1hao/docker-whale   latest              3179f50aaae0        3 weeks ago         274.6 MB
ubuntu                    14.04               8f1bd21bd25c        3 weeks ago         188 MB
hello-world               latest              94df4f0ce8a4        7 weeks ago         967 B
docker/whalesay           latest              6b362a9f73eb        13 months ago       247 MB

启动容器:

Docker容器非常轻量级,很多时候用户都是随时删除和新建容器。 新建并启动:

-t 让Docker分配一个伪终端并绑定到窗口的标准输入上,-i 让窗口的标准输入保持打开 -d 则在后台运行。 root@ubuntu:~/Downloads# docker run -dit ubuntu:14.04 ecdcd31f46bc0e2e7982a71b9a47831f4bca6192f3c55960c795258a1d687743 root@ubuntu:~/Downloads#

当利用==docker run==来创建容器时,Docker在后台运行的标准操作包括: * 检查本地是否存在指定的镜像,不存在就从公有仓库下载; * 利用镜像创建并启动一个容器 * 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层; * 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去; * 从地址池配置一个ip地址给容器; * 执行用户指定的应用程序; * 执行完毕后容器被终止 *

root@ubuntu:~/Downloads# docker run -it ubuntu:14.04 /bin/echo hello
hello

root@ubuntu:~/Downloads# docker run -it ubuntu:14.04 /bin/bash
root@d7d62da3c1db:/#

启动已终止容器: 使用==docker start==命令。 在伪终端,通过==ps==查看进程:

root@ubuntu:~/Downloads# docker run -it ubuntu:14.04 /bin/bash
root@d7d62da3c1db:/# ps
   PID TTY          TIME CMD
     1 ?        00:00:00 bash
    14 ?        00:00:00 ps

守护态运行: docker run 加“ -d ”参数。 容器启动后会返回一个唯一的id,也可以通过==docker ps==命令来查看容器信息:

root@ubuntu:~/Downloads# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ecdcd31f46bc        ubuntu:14.04        "/bin/bash"         12 minutes ago      Up 12 minutes                           modest_nobel
aa38fda1c7b9        ubuntu:14.04        "/bin/bash"         34 minutes ago      Up 34 minutes                           sleepy_hodgkin

获取窗口的输出信息:通过==docker logs==命令。

终止容器 使用==docker stop==命令。 当Docker容器中指定的应用终结时,容器也自动终止。 用户通过==exit==或==Ctrl+d==来退出终端时,所创建的容器也立刻终止。 终止状态的容器可以用==docker ps -a==命令查看到: ``` root@ubuntu:~/Downloads# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5030e8109acd ubuntu:14.04 “/bin/echo hello” 4 minutes ago Exited (0) 4 minutes ago tender_torvalds zing_goldberg f2b8b1b507f6 ubuntu:14.04 “/bin/bash” 49 minutes ago Exited (0) 47 minutes ago silly_hawking cc55f0d5ad0a ubuntu:14.04 “/bin/echo hello” 49 minutes ago Exited (0) 49 minutes ago pensive_payne …

处于终止状态的窗口,可通过==docker start==信念来重新启动:

root@ubuntu:~/Downloads# docker start pensive_payne pensive_payne

另外,==docker restart==命令会将一个运行态的窗口终止,然后再重新启动它。

进入容器:

使用==-d==参数时,容器启动后会进入后台,时候需要进入窗口进行操作,有很多种方法,包括使用==docker attach==命令或==nsenter==工具等。
    attach命令
attach命令是Docker自带的命令:

root@ubuntu:~/Downloads# docker attach sleepy_hodgkin root@aa38fda1c7b9:/# echo hello hello root@aa38fda1c7b9:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr root@aa38fda1c7b9:/#


使用attach有时候会有一个问题,当多个窗口同时attach到同一个窗口的时候,所有窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

nesnter命令:
需要安装

更简单的,下载==.bashrc_odcker==文件,并将内容放到.bashrc中。


下载.bashrc_docker

root@ubuntu:~# wget -P - https://raw.githubusercontent.com/yeasy/docker_practice/master/_local/.bashrc_docker;

保证.bashrc_docker在~/目录下,如不在,拷贝到该目录下:

root@ubuntu:~# find / -name .bashrc_docker /root/-/.bashrc_docker root@ubuntu:~# cp /root/-/.bashrc_docker .

编辑.bashrc

root@ubuntu:~# echo “[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker” » ~/.bashrc; source ~/.bashrc


.bashrc_docker里面定义了很多方便使用Docker的命令。如:
docker-pid可以获取某个容器的pid;docker-enter可以进入窗口或直接在窗口内执行命令。

root@ubuntu:~/Downloads# docker run -dit ubuntu:14.04 347f35396fae4d51b812d24cbb952f16a1ee8e8462150870502042c52c9ed64c root@ubuntu:~/Downloads# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 347f35396fae ubuntu:14.04 “/bin/bash” 3 seconds ago Up 2 seconds cranky_mestorf

root@ubuntu:~# docker-pid cranky_mestorf 9316 root@ubuntu:~# echo $(docker-pid cranky_mestorf) 9316

root@ubuntu:~# echo $(docker-pid cranky_mestorf) 9316 root@ubuntu:~# docker-enter cranky_mestorf root@347f35396fae:~# ls root@347f35396fae:~#


导出和导入容器
导出容器:
    可使用==docker export==命令导出本地某个容器。

root@ubuntu:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 347f35396fae ubuntu:14.04 “/bin/bash” 5 minutes ago Up 5 minutes cranky_mestorf root@ubuntu:~# docker export 347f35396fae > ubuntu.tar root@ubuntu:~#

root@ubuntu:~# ll root@ubuntu:~# ll total 180032 drwxr-xr-x 2 root root 4096 Jun 20 23:19 -/ drwx—— 23 root root 4096 Jun 21 00:09 ./ drwxr-xr-x 24 root root 4096 May 30 02:36 ../ -rw——- 1 root root 62 Jun 17 01:29 .bash_history -rw-r–r– 1 root root 3326 Jun 20 23:16 .bashrc -rw-r–r– 1 root root 1938 Jun 20 23:21 .bashrc_docker -rw-r–r– 1 root root 184207360 Jun 21 00:09 ubuntu.tar drwxr-xr-x 2 root root 4096 May 29 23:01 Videos/ -rw——- 1 root root 7457 Jun 20 19:57 .viminfo -rw-r–r– 1 root root 182 Jun 20 23:19 .wget-hsts -rw——- 1 root root 51 Jun 20 19:54 .Xauthority -rw——- 1 root root 161 Jun 20 19:55 .xsession-errors -rw——- 1 root root 1389 Jun 17 01:29 .xsession-errors.old

这将导出容器快照到本地文件。

导入容器快照:
可使用==docker import==从容器快照文件中再导入为镜像:

root@ubuntu:~# cat ubuntu.tar |docker import - test/ubuntu:v1.0 sha256:e23a604423349dbfccc80c60f36c05ce7b41c60ad3d6117b9c1ca3a66bc98117

root@ubuntu:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/ubuntu v1.0 e23a60442334 14 seconds ago 175.1 MB ouruser/sinatra v2 7e9b2767cf4f 4 hours ago 320.9 MB jingyu1hao/docker-whale latest 3179f50aaae0 3 weeks ago 274.6 MB ubuntu 14.04 8f1bd21bd25c 3 weeks ago 188 MB hello-world latest 94df4f0ce8a4 7 weeks ago 967 B docker/whalesay latest 6b362a9f73eb 13 months ago


另外也可以通过指定URL或者某个目录来导入:

root@ubuntu:~# docker import http://example.com/exampleimage.tgz example/imagerepo Downloading from http://example.com/exampleimage.tgz Got HTTP status code >= 400: 404 Not Found ``` 此处URL有误,所以……

注:既可以使用==docker load==来导入镜像存储文件到本地镜像库,也可以使用==docker import==来导入一个容器快照到本地镜像库。两者的区别在于容器快照文件将丢弃所有历史记录和元数据信息(即仅保存窗口当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

删除容器 可使用==docker rm==来删除一个处理终止状态的容器: ``` root@ubuntu:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 276a13698062 hello-world “/hello” 3 weeks ago Exited (0) 3 weeks ago stoic_fermi

root@ubuntu:~# docker rm stoic_fermi stoic_fermi

```

在删除一个运行中的容器,可添加==-f==参数。Docker会发送SIGKILL信号给容器。