很早之前就对Docker的大名有所耳闻,今日一学,满是欢喜。其容器和虚拟化概念的运用,把部署难度简易到了一个新的里程碑。我手中的项目尚需各种库的支持,凡是要部署到新的系统,都要受其部署的繁琐之苦,更何况是更大的项目。而有了Docker后,这繁琐之苦,算是化为了虚无。
运行
启动交互
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@d77ccb2e5cca:/#
- -i: 交互式操作。
- -t: 终端。
- ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
- /bin/bash: 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
拖取镜像
runoob@runoob:~$ docker pull httpd
运行镜像
runoob@runoob:~$ docker run httpd
停止容器
runoob@runoob:~$ docker stop wizardly_chandrasekhar
wizardly_chandrasekhar
重启容器
runoob@runoob:~$ docker start wizardly_chandrasekhar
wizardly_chandrasekhar
后台运行命令和端口绑定
docker run -d -P <Image-Name> python app.py
docker run -d -p 5000:5000 <Image-Name> python app.py
- -d 让容器在后台运行。
- -P 是容器内部端口随机映射到主机的高端口。
- -p 是容器内部端口绑定到指定的主机端口。
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
进入容器
- docker attach
- docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
attach
docker attach 1e560fca3906 # 注意: 如果从这个容器退出,会导致容器的停止。
exec
docker exec -it 243c32535da7 /bin/bash
docker 宿主机与容器直接文件移动命令
将容器中的文件复制到宿主机
我们把容器中的 nginx 目录整个复制到 宿主机/usr/local/nginx 目录下,使用如下命令:
docker cp nginx_test: /etc/nginx /usr/local/nginx
将宿主机文件复制到容器中
我们把宿主机目录(/usr/local/nginx/a.key)下的a.key 复制到容器(nginx_test)的/etc/nginx 目录下,使用如下命令:
docker cp /usr/local/nginx/a.key nginx_test:/etc/nginx
查看
查看日志
runoob@runoob:~$ docker logs -f bf08b7f2cd89
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.239.1 - - [09/May/2016 16:30:37] "GET / HTTP/1.1" 200 -
192.168.239.1 - - [09/May/2016 16:30:37] "GET /favicon.ico HTTP/1.1" 404
- -f 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
列出本地镜像列表
runoob@runoob:~$ docker images
查看容器内部运行进程
docker top
runoob@runoob:~$ docker top wizardly_chandrasekhar
UID PID PPID ... TIME CMD
root 23245 23228 ... 00:00:00 python app.py
查找镜像
runoob@runoob:~$ docker search httpd
网络端口的快速查看
CONTAINER ID
runoob@runoob:~$ docker port bf08b7f2cd89
5000/tcp -> 0.0.0.0:5000
NAMES
runoob@runoob:~$ docker port wizardly_chandrasekhar
5000/tcp -> 0.0.0.0:5000
查询最后一次创建的容器
# docker ps -l
CONTAINER ID IMAGE PORTS NAMES
bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
查看Docker底层信息
runoob@runoob:~$ docker inspect wizardly_chandrasekhar
......
删除
删除镜像
$ docker rmi hello-world
删除容器
docker rm -f <容器ID>
移除容器
runoob@runoob:~$ docker rm wizardly_chandrasekhar
wizardly_chandrasekhar
删除容器时,容器必须是停止状态,否则会报如下错误
runoob@runoob:~$ docker rm wizardly_chandrasekhar
Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
清理所有终止状态的容器
docker container prune
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用 Dockerfile 指令来创建一个新的镜像
更新镜像
runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
-
-m: 提交的描述信息
-
-a: 指定镜像作者
-
e218edb10161: 容器 ID
-
runoob/ubuntu 指定要创建的目标镜像名
构建镜像
runoob@runoob:~$ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
- 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
- 第一条FROM,指定使用哪个镜像源。
- RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
- 使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
runoob@runoob:~$ docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
---> Using cache
---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
---> Using cache
---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......
- -t : 指定要创建的目标镜像名
- . : Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。
runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev
docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
导入导出
导入导出容器
导入
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu
$ cat docker/ubuntu.tar | docker import - test/ubuntu
此外,也可以通过指定 URL 或者某个目录来导入,例如:
$ docker import http://example.com/exampleimage.tgz example/imagerepo
导出
$ docker export 1e560fca3906 > ubuntu.tar