这篇博客主要罗列了一些docker的基本命令和一些进阶命令,以及一些命令的详解:
不添加用户的话,每次执行docker 都需要使用sudo,所以进行添加一下,方便操作;
sudo gpasswd -a lin docker
lin@ubuntu:~$ docker info
ubuntu15.10为例,镜像可以从docker hub 寻找,根据自己的需要进行镜像系统和版本的安装
lin@ubuntu:~$ docker pull u
buntu:15.10
lin@ubuntu:~$ docker images
所有的容器运行命令主要为 docker run。
下面的命令输出一个 hello docker ,然后终止容器。
lin@ubuntu:~$ docker run ubuntu:15.10 /bin/echo hello docker
hello docker
这跟在本地执行 /bin/echo hello docker 几乎感觉不出来任何区别
下面的命令则启动一个bash终端,允许用户进行交互
sudo docker run -t -i --name myubuntu ubuntu:15.10 /bin/bash
-t 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i 则让容器的标准输入保持打开,--name 给容器命名为myubuntu。
退出的话使用exit 或者 ctrl+d,一旦退出,容器便停止;
后台运行的,可以重新进入容器
docker exec -it [容器ID] /bin/bash
也可以使用
lin@ubuntu:~$ docker attach containId
bin/bash 是用命令模式进入
使用-p提供容器接口 例如
$ docker run -d -P training/webapp python app.py
-d 命令不多解释(下面会有-d的说明),是告诉docker我们需要后台运行,-p是告诉docker我们会影射一个内部的端口到外部 不加代表默认
也可以自己定义
$ docker run -d -p 80:5000 training/webapp python app.py
5000是docker内部接口,80是影射到外部的接口,为什么要这么写,是因为,若是两个容器的python被启动,都是5000端口,那么外部就不知道该怎么访问,所以这里影射需要影射一下外网访问的端口。这样你就可以在本地使用 localhost:80来访问应用程序
查看端口影射情况
docker port containID 5000
更多的时候,需要让docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时可以通过添加-d 来实现;
如果不是用-d参数
docker run ubuntu:15.10 /bin/sh -c "while true ;do echo hello docker ; sleep 2; done"
容器就会把输入的结果(STDOUT)打印到宿主机上
若是是用-d
myjob=$(docker run -d ubuntu:15.10 /bin/sh -c "while true ;do echo hello docker ; sleep 2; done")
此时容器会在后台运行并不会把输出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs 查看)。
这里给这个job起了一个名字叫myjob,hello docker 将会两秒运行一次,因为若是不自己命名,就会默认自动生成一个名字,往后的日志将会很难查找。
注: 容器是否会长久运行,是和docker run指定的命令有关,和 -d 参数无关。
更多的参数 可以使用docker run --help 查看
lin@ubuntu:~$ docker logs $myjob
hello docker
在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach 命令或 nsenter 工具等。
lin@ubuntu:~$ docker attach myubuntu1 root@0fec10a4f28a:/#
docker exec -it myubuntu1 /bin/bash
lin@ubuntu:~$ docker ps
lin@ubuntu:~$ docker ps -a
使用如下命令查看程序最近一次的运行情况
$ docker ps -l
lin@ubuntu:~$ docker stop $myjob
e34198448f878c1f1cff3d34f2707f137962fc622919c35a9059d11232629f7e
lin@ubuntu:~$ docker start $myjob
e34198448f878c1f1cff3d34f2707f137962fc622919c35a9059d11232629f7e
使用restart命令,会先停止该容器再重新启动
export 这个命令用于将容器的系统文件打成jar包导出到本地,在本地就能看到从容器中打的while.tar;
docker export 0bbea06cac56 >while.tar
lin@ubuntu:~$ ls
Desktop Downloads Music Public Videos
Documents examples.desktop Pictures Templates while.tar
import 可以导入远程文件、本地文件和目录成为镜像
使用远程的文件命令式
$ docker import http://example.com/example.tar
本地文件或者目录的导入需要使用 -参数 使用docker import --help查看参数
sudo cat while.tar |docker import - ubuntu:15.10v1
*注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
$ docker load -i example.tar
$ docker save image
保存后用docker images 查看会多出这个镜像
lin@ubuntu:~$ docker commit $myjob myjob1
764c656f5fc53db19194226cbb84b28bc0c53c9199367b19641fbf87aaa00090
lin@ubuntu:~$ docker rm $myjob
e34198448f878c1f1cff3d34f2707f137962fc622919c35a9059d11232629f7e
lin@ubuntu:~$ docker rm $(docker ps -a)
删除所有的未运行的容器
lin@ubuntu:~$ docker rm $(docker ps -a -q)
*注意:这个命令其实会试图删除所有的包括还在运行中的容器,不过就像上面提过的 docker rm
默认并不会删除运行中的容器。
lin@ubuntu:~$ docker rmi imageId
*注意:在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。
docker images 可以列出本地所有的镜像,其中很可能会包含有很多中间状态的未打过标签的镜像,大量占据着磁盘空间。清理所有未打过标签的本地镜像
删除所有未打过标签的本地镜像
$ sudo docker rmi $(docker images -q -f "dangling=true")
$
docker tag imageId/name ouruser/sinatra:devel
以上这些基本命令差不多在普通的操作中已经够用;
$ docker build [option] path|url
还有一些docker提供的额外选项可以使用 docker build --help命令查看
docker还提供了一个非常强大的命令 diff,他可以列出容器内发生变化的文件和内容目录。这些变化包括添加,删除,修改。
$ docker diff container
从容器内复制文件到指定的路径上,cp
$ docker cp container:path hostpath
把容器里面的test拷贝到本地
lin@ubuntu:~$ docker cp
0bbea06cac56:/test /test
$ docker login [option] [server]
登录自己主机的registry使用
$ docker login localhost:8080
这些信息包括
容器实例的IP地址
端口绑定列表
特定端口映射的搜索
收集配置的详细信息
lin@ubuntu:~$ docker inspect
0bbea06cac56
[ { "Id": "0bbea06cac562a7a7b5d8bee30ccfa1c2eba8b7153c2106d0ed610ea3e03cf2d", "Created": "2015-12-15T06:26:05.624302049Z", "Path": "/bin/sh", "Args": [ "-c", "while true ;do echo hello docker ; sleep 2; done" ], "State": { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false
......
显示容器的详细信息;
$ docker kill [option] container
$ docker wait container
lin@ubuntu:~$ docker search (image name)
lin@ubuntu:~$ docker history (image name)
lin@ubuntu:~$ docker push (path)
在这个之前你需要注册,然后新建你的仓库地址,才可以push;