这段时间在学习docker,过程中用到了不少命令,为了记录和分享我会将docker的命令一一做个简单的介绍。
docker自2013年以来在国内就非常火热,docker是一个操作系统层的虚拟化实现,docker核心解决的问题是利用LXC来实现类似VM功能,从而利用更加节省的硬件资源提供更多的计算资源。docker采用的是C/S架构,在自己的机器上可以同时安装服务器和客户端。话不多说,下面将进入实践阶段。
------------------------------------------------------------------------------------------------------------------------------
关于docker的安装自行解决,在这之前先介绍一下我的操作环境:
- OS: Ubuntu16.04
- docker: 1.1版本。
- 从上图可以看出目前为止Commands下有42条命令,诸如attach、build等。
1.
- 使用attach命令可以附到一个已经运行容器的输入界面,然后会执行你输入的命令。首先使用docker start web1启动容器web1,使用docker ps查看正在运行的容器。再使用docker attach [container name | ID]打开一个正在运行的容器界面。
- 当在root@4b89bd8b5e96:/#环境下运行exit命令时会退出容器,回到Ubuntu环境。
2.
- 使用build可以从dockerfile建立一个镜像,dockerfile其实就是一个脚本文件,自动化建立镜像的命令集合,具体使用方法可以参考这里。命令规范:docker build -t [container name] 'dockerfile path'
- 使用-t参数可以指定镜像的tag,'.' 代表当前目录。
3.
- 当你对一个容器做了修改之后,退出容器之后,如果想保存这个修改,可以使用commit命令提交一个新的镜像,这类似于Github。
- 图中的4b89bd8b5e96为镜像的ID,ubuntu/test:16.04位镜像的名字和版本,之后再用docker images命令看一下刚创建的镜像。
4.
- 这个命令用来在docker和本地的文件系统之间传输数据。方便容器的数据导出到本机文件系统。只要是容器里的数据不管容器是start还是stop都可以使用sudo docker cp 'container ID | NAME:/path ' 'file/path/in/local'命令把容器里的数据导出到本地。
- 也可以使用sudo docker cp'file/path/in/local' 'container ID | NAME:/path ' 把本地的数据导入到一个容器中,同样与容器状态无关。如下图:
5.
- 使用docker create命令创建的容器是处于停止状态的,要启动容器需要使用docker start命令。
- 上图中参数-it表示以终端的交互方式进行,--name指定容器名称。用docker ps命令没有显示,说明容器没有启动,使用docker ps -a显示所有容器(包括stop状态的容器)可以看到名为hello-create的容器。
6.
- 使用docker diff 'container ID | NAME'命令可以列出容器内的文件状态列表清单,清单中的文件有三种状态:[-A add -C change -D delete]
7.
- 使用docker events命令可以从服务器获得事件的实时时间。
- 命令显示了从'20160724'到'20160725'之间的事件记录。
8.
-----docker exec负责容器启动以后执行其他命令,可以执行交互式命令,可以执行后台型命令。
- 交互型命令 docker exec -ti web1 /bin/bash
- exec与命令1中的attach区别:exec运行'exit'命令时容器不会退出,从docker ps可以看出。而下图的'exit'命令退出了容器:
- 后台型命令 docker exec -d web1 mkdir -p /test/testexec
- 上图中,以exec -d方式创建了一个文件夹testexec,再用exec交互型命令进行查看。
- 将容器的文件系统打包成.tar结构,相当于是容器的快照操作,无论容器的状态如何都可以进行,如果把导出的.tar文件导入到新的容器的话可以实现容器的迁移。注意export是持久化容器而不是镜像,下文的save是持久化镜像。
- 有两种写法:
- docker export 'CONTAINER ID | NAME' > '/path/name_file.tar'
- docker export -o '/path/name_file.tar' 'CONTAINER ID | NAME'
- 需要以root权限运行
10.
- docker history命令显示镜像的历史。
11.
- 使用docker images可以列出目前所有镜像。
12.
- 使用docker import命令可以从本地导入base镜像,用于创建容器。openVZ提供了能够下载的镜像。
13.
- 用docker info查看docker系统信息。
14.
- docker inspect返回容器或者镜像的底层信息。
- 还可以使用-f参数获取指定值,例如:
15.
- 使用docker kill 'ID | NAME'杀死一个正在运行的容器。
16.
- 与下文的save命令对应,用于导入save持久化的镜像。
- 你既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息,而镜像存储文件将保存完整记录,size也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
17.
- 登录到自己的Docker register,你需要注册Docker Hub。
18.
- 从Docker register注销登录
19.
- 使用docker logs 'CONTAINER ID | NAME'可以查看容器的终端日志信息。
20.
- 当docker启动时,它会在宿主机器上创建一个名为docker0的虚拟网络接口。
21.
- 与下文的unpause对应,docker pause命令会暂停掉容器里的所有进程。
- 可以使用docker stats查看资源使用状况:
22.
- 使用docker port 'CONTAINER ID | NAME'命令可以查看容器端口和宿主机端口的映射。
- 也可以使用docker ps查看端口映射。
- 使用docker port 'CONTAINER ID | NAME'命令之前需要以docker run -p 参数启动容器suspicious_panini。
23.
- 使用docker ps列出正在运行的容器相关参数,加-a 列出所有包括关闭的容器。
24.
- 使用docker pull 'image NAME'从Docker Hub上下载镜像到本地。
- 使用docker images命令查看没有hello-world镜像,于是使用docker pull hello-world从Docker Hub上下载之。
25.
- 使用docker push 'image name'命令之前你必须先注册,它可以推送镜像到Docker Hub或者私有仓库中。注意'image name'命名规范是'xx/xx',可以利用docker tag命令解决。
- 上图中docker tag命令把'hello-world'镜像tag成'dockeryyx/hello-world'。可以去Docker Hub上查看镜像了:
26.
- 使用docker rename 'old_name' 'new_name'命令重命名一个容器。
27.
- 使用docker restart 'CONTAINER ID | NAME'命令可以重启一个容器。
- 可以看到使用restart命令之容器web1的STATUS由'Up About an hour'变成了'Up 5 seconds'。
28.
- 使用docker rm'CONTAINER ID | NAME'删除一个容器。要删除所有容器需要使用docker rm $(docker ps -a -q),不过移除容器之前最好先使用docker stop命令,当然你也可以加一个-f删除一个正在运行的容器。
29.
- 使用docker rmi 'image name'命令删除一个镜像。同样删除多个镜像使用docker rmi $(docker images -a -q)。注意在删除镜像之前先删除依赖镜像的容器。
30.
- 使用docker run -it 'CONTAINER ID | NAME' COMMAND命令运行一个容器。使用run命令运行完COMMAND之后容器就会关闭。需要使用docker ps -a才能看见容器。
31.
- 与上文的load对应,用于持久化一个镜像,不是容器。
- 可以看出busybox镜像被归档为busybox1.tar了。
32.
- 使用docker search 'image name'命令从Docker Hub上搜寻镜像。
33.
- 使用docker start 'CONTAINER ID | NAME'+ 命令启动一个或者多个容器。
- 由上图可以看出一开始使用docker ps显示正在运行的容器没有结果,使用docker ps -a查看到有两个容器分别为elated_mccarthy、web1。之后把第一个容器改名为test。使用docker start test web1命令同时启动两个容器。再使用docker ps查看正在运行的容器发现只显示一个容器web1。细想一下原来我使用的test容器的命令是docker run -it ubuntu echo ubuntu。run命令之后会关闭容器。要使用docker ps -a才能显示全。
34.
- 使用docker stats命令能查看资源的使用情况。
- 之后会出现:
- 要使用Ctrl+C结束之。
35.
- 使用docker stop 'CONTAINER ID | NAME'+ 命令关闭一个或者多个容器。
36.
- 给镜像打标记。tag之后会出现同名不同tag现象。
37.
- 使用docker top 显示运行容器的进程状态。
38.
- 取消暂停容器里的所有进程。
39.
- 使用docker update [options] CONTAINER [CONTAINER...]更新一个或者多个容器。
- 图中改变了容器web1的内存为500MB,使用docker stats命令查看为524.3MB,因为docker stats查看的是docker的CPU、memory、IO等资源使用情况,包括容器web1,所以多出来的24.3MB是除了update指定的500MB之外IO和CPU使用总量。
40.
- 使用docker version显示docker的版本客户端和服务器相关信息。
41.
- 使用docker volume [OPTIONS] [COMMAND]可以实现对容器卷的管理。先help一下:
- 图中Commands显示了可以对卷进行删除和建立等操作。
- 说道volume不得不涉及到docker采用的文件系统UFS(union file system)。UFS是一个由只读层和读写层组成的文件系统,docker镜像就是由多个文件系统(只读层)组成,当你启动容器时,docker会在只读层上添加一个读写层来保存你对docker镜像的更改,对docker镜像更改完之后如果不进行commit操作,下次再启动这个镜像时,上次所做的修改将会被丢弃。这个时候如果想上次操作不被丢弃,volume可以满足你的需求。通过在启动容器时挂载一个volume专门来保存你对docker镜像所做的修改,下次启动时再把volume挂载到启动的容器上就可以继续上次的操作了。volume还有其他一些功能,比如容器间的数据共享、作为数据容器、数据备份、还原等。
- 上图的data目录位于容器根目录下用于保存更改数据。如果启动容器不使用-v参数指定volume,docker会默认创建一个位于'/var/lib/docker'目录下的卷,通过docker volume ls查看创建的默认volume列表:
42.
- 使用docker wait [CONTAINER] [CONTAINER...]目录可以阻塞一个或者多个正在运行的容器对其他方法的调用,知道容器stop而退出阻塞。
- 上图中可以看到阻塞一个在运行的容器test之后,执行的'docker ps'、'docker info'命令没有被执行。阻塞一个已经停止的容器web1之后返回的是退出代码0。
- 完事儿,命令解释的不是很全还望多多担待,大家遇到不明白的命令可以使用'docker COMMANDS --help'自己对照英文看一下,我以后会逐步添加更细致的命令解释。