Docker基础

1. 列出所有本地镜像

$ docker images
REPOSITORY       TAG      IMAGE ID      CREATED      VIRTUAL SIZE
training/webapp  latest   fc77f57ad303  3 weeks ago  280.5 MB
ubuntu           13.10    5e019ab7bf6d  4 weeks ago  180 MB
ubuntu           saucy    5e019ab7bf6d  4 weeks ago  180 MB
ubuntu           12.04    74fe38d11401  4 weeks ago  209.6 MB
ubuntu           precise  74fe38d11401  4 weeks ago  209.6 MB
ubuntu           12.10    a7cf8ae4e998  4 weeks ago  171.3 MB
ubuntu           quantal  a7cf8ae4e998  4 weeks ago  171.3 MB
ubuntu           14.04    99ec81b80c55  4 weeks ago  266 MB
ubuntu           latest   99ec81b80c55  4 weeks ago  266 MB
ubuntu           trusty   99ec81b80c55  4 weeks ago  266 MB
ubuntu           13.04    316b678ddf48  4 weeks ago  169.4 MB
ubuntu           raring   316b678ddf48  4 weeks ago  169.4 MB
ubuntu           10.04    3db9c44f4520  4 weeks ago  183 MB
ubuntu           lucid    3db9c44f4520  4 weeks ago  183 MB

REPOSITORY:来自什么镜像源

tags:每个镜像都有标签

镜像和标签确定一个镜像,如ubuntu:14.04

2. 指定一个镜像运行容器

$ sudo docker run -t -i ubuntu:14.04 /bin/bash

3. 查找镜像

$ sudo docker search sinatra

4. 获取一个新的镜像

$ sudo docker pull centos

centos 是一个镜像,用来作为运行容器的来源。当你指定一个镜像时,docker 会首先从你的 docker 本机上查看镜像是否存在,如果没有,docker 会自动从镜像仓库Docker Hub 下载公共镜像。默认标签是 latest。

5. 更新提交一个新的镜像

$ sudo docker commit -m="Added json gem" -a="Kate Smith" 0b2616b0e5a8 ouruser/sinatra:v2

-m :指定提交的信息

-a:指定一个作者

0b2616b0e5a8:创建新镜像的来源容器 ID

ouruser/sinatra:v2:创建目标镜像的名称。用户名字/镜像名:镜像标签。

6. 设置镜像标签

$ docker tag 5db5f8471261 ouruser/sinatra:devel

7. 推送镜像到 DockerHub

$ docker push ouruser/sinatra

8. 主机中移除镜像

$ docker rmi training/sinatra

9. 运行一个带标签镜像的容器,并执行一段程序

$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world

docker run 用于在容器内运行一个应用程序。
/bin/echo 'Hello world' :就是要执行的命令。

$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

-t 表示在新容器内指定一个伪终端或终端
-i表示允许我们对容器内的 (STDIN) 进行交互。
这样就运行了一个交互式的容器。容器内可以随意执行各种操作系统的命令,使用 exit 或者 ctrl+D 退出容器。

上面的容器在执行完命令后就会退出,如何创建一个以进程方式运行的容器?

-d 标识告诉 docker 在容器内以后台进程模式运行。
P 标识通知 Docker 将容器内部使用的网络端口映射到我们使用的主机上。

$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

上面的指令创建了一个 hello world 的守护进程,会不断的输出 hello world,但是这时是看不到打印的结果的。只会返回一长串的容器 ID。

$ sudo docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
1e5535038e28  ubuntu:14.04  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        insane_babbage

使用 docker ps 可以查看 正在运行的docker 进程的所有容器,第一个容器 ID 是上面容器 ID 的简化版。-a 表示所有容器;-l 表示最近运行的容器

10. 使用 docker logs + 容器名称可以查看执行的结果。

$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .

11. 停止容器

使用 docker stop + 容器名停止正在运行的容器。这时这个容器将停止工作。使用 docker ps 就看不到它了。

$ sudo docker stop insane_babbage
insane_babbage
$ sudo docker ps -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->5000/tcp  nostalgic_morse

12. 端口映射

查看映射的端口,0.0.0.0:49155->5000/tcp表示 docker 开放了5000端口(这个端口指应用程序的默认端口,比如 nginx 的80,这里是 Python Flask的默认端口),映射到主机端口49155上,这个49155时 docker 随机绑定的本地主机上的高位端口(32768 至 61000)。我们也可以使用-p来指定端口。

$ sudo docker run -d -p 5000:5000 training/webapp python app.py

也可以这样查看对应的主机端口

$ sudo docker port nostalgic_morse 5000
0.0.0.0:49155

这样查看应用程序容器的进程:

$ sudo docker top nostalgic_morse
PID                 USER                COMMAND
854                 root                python app.py

13. 连接多个容器:

##创建一个 web 容器来和 db容器连接起来
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

连接容器的意义在于,docker 在容器之间打开了一个安全连接隧道不需要暴露任何端口在容器外部。

14. 挂载文件

在容器中挂载数据卷

docker run -t -i -v /Users/wangjc/Desktop:/opt centos:centos7.1.1503 /bin/bash

15. 一次性停止、删除容器和镜像:

docker kill $(docker ps -q) 
docker rm $(docker ps -a -q) 
docker rmi $(docker images -q -a) 

16. 进入正在运行的容器:

docker attach c1f83c32cfbe
## 如果是后台运行的容器,这样进入会hang 住,应该使用下面的参数,使用 ctrl+C 可以退出
docker attach --sig-proxy=false c1f83c32cfbe

17. docker升级

## 列出所有机器,找到需要升级的 name
docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM
default * virtualbox Running tcp://192.168.99.100:2376

## 只有一个 Default
docker-machine upgrade default

Stopping machine to do the upgrade...
Upgrading machine default...
Downloading https://github.com/boot2docker/boot2docker/releases/download/v1.9.0/boot2docker.iso to /Users/wangjc/.docker/machine/cache/boot2docker.iso...
Starting machine back up...
Starting VM...

18. 宿主机和容器互相拷贝文件

docker cp host/path/targetFile containerId:/file/pathInContainer
docker cp containerId:/file/pathInContainer host/path/targetFile 

参考文档:

《Docker 用户指南中文版》

《Docker 技巧》

2015-11-06 00:589