这篇博客主要罗列了一些docker的基本命令和一些进阶命令,以及一些命令的详解:
-
基本命令
1、先添加当前用户到docker组(非root用户) 用户lin
不添加用户的话,每次执行docker 都需要使用sudo,所以进行添加一下,方便操作;
sudo gpasswd -a lin docker
2、查看docker信息 docker version | docker info
lin@ubuntu:~$ docker info
3、安装镜像 pull
ubuntu15.10为例,镜像可以从docker hub 寻找,根据自己的需要进行镜像系统和版本的安装
lin@ubuntu:~$ docker pull u
buntu:15.10
4、查看安装镜像 docker images
lin@ubuntu:~$ docker images
5、运行容器 docker run
所有的容器运行命令主要为 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
6、后台(background)运行 -d
更多的时候,需要让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 查看
7、查看日志 docker logs[container ID or name]
lin@ubuntu:~$ docker logs $myjob
hello docker
8、进入容器 attach
在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach 命令或 nsenter 工具等。
lin@ubuntu:~$ docker attach myubuntu1 root@0fec10a4f28a:/#
docker exec -it myubuntu1 /bin/bash
9、查看正在运行的容器 docker ps
lin@ubuntu:~$ docker ps
10、查看所有容器 docker ps -a
lin@ubuntu:~$ docker ps -a
使用如下命令查看程序最近一次的运行情况
$ docker ps -l
11、停止/启动容器 docker stop/start[continer ID or name]
lin@ubuntu:~$ docker stop $myjob
e34198448f878c1f1cff3d34f2707f137962fc622919c35a9059d11232629f7e
lin@ubuntu:~$ docker start $myjob
e34198448f878c1f1cff3d34f2707f137962fc622919c35a9059d11232629f7e
使用restart命令,会先停止该容器再重新启动
12、导入导出容器 export/import
-
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 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
13、从tar文件中载入镜像或者仓库到stdin。 load
$ docker load -i example.tar
14、保存镜像为tar文件并发送到stdout save
$ docker save image
15、将容器的状态提交为镜像 comint
保存后用docker images 查看会多出这个镜像
lin@ubuntu:~$ docker commit $myjob myjob1
764c656f5fc53db19194226cbb84b28bc0c53c9199367b19641fbf87aaa00090
16、删除容器 rm
lin@ubuntu:~$ docker rm $myjob
e34198448f878c1f1cff3d34f2707f137962fc622919c35a9059d11232629f7e
lin@ubuntu:~$ docker rm $(docker ps -a)
删除所有的未运行的容器
lin@ubuntu:~$ docker rm $(docker ps -a -q)
*注意:这个命令其实会试图删除所有的包括还在运行中的容器,不过就像上面提过的 docker rm
默认并不会删除运行中的容器。
17、删除镜像 rmi
lin@ubuntu:~$ docker rmi imageId
*注意:在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。
docker images 可以列出本地所有的镜像,其中很可能会包含有很多中间状态的未打过标签的镜像,大量占据着磁盘空间。清理所有未打过标签的本地镜像
删除所有未打过标签的本地镜像
$ sudo docker rmi $(docker images -q -f "dangling=true")
18、给镜像打标签
$
docker tag imageId/name ouruser/sinatra:devel
以上这些基本命令差不多在普通的操作中已经够用;
-
进阶命令:
1、构建镜像 build命令
$ docker build [option] path|url
还有一些docker提供的额外选项可以使用 docker build --help命令查看
2、diff 对比命令
docker还提供了一个非常强大的命令 diff,他可以列出容器内发生变化的文件和内容目录。这些变化包括添加,删除,修改。
$ docker diff container
3、cp命令
从容器内复制文件到指定的路径上,cp
$ docker cp container:path hostpath
把容器里面的test拷贝到本地
lin@ubuntu:~$ docker cp
0bbea06cac56:/test /test
4、用login命令登录到docker registry服务器
$ docker login [option] [server]
登录自己主机的registry使用
$ docker login localhost:8080
5、docker inpect 命令可以收集有关容器和镜像的底层信息。
这些信息包括
-
容器实例的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
......
显示容器的详细信息;
6、停止容器主进程 kill
$ docker kill [option] container
7、阻塞对指定容器的其他调用方法,直到容器停止后退出阻塞。 wait
$ docker wait container
8、在registry中寻找自己需要的镜像
lin@ubuntu:~$ docker search (image name)
9、查看镜像历史版本
lin@ubuntu:~$ docker history (image name)
10、把镜像推送到registry path 不能是根目录必须是user/image 例如 lin/myjob1
lin@ubuntu:~$ docker push (path)
在这个之前你需要注册,然后新建你的仓库地址,才可以push;