51Testing软件测试论坛
标题:
docker 常用命令汇总
[打印本页]
作者:
一纸荒年
时间:
2018-4-11 14:22
标题:
docker 常用命令汇总
最近在学习docker技术,将大部分命令(23条)都执行了一遍,做个汇总,做个备忘录。
Docker优势
1、 快速搭建兼容性测试环境
从Docker的镜像与容器技术特点可以预见,当被测应用要求在各类Web服务器、中间件、数据库的组合环境
中得到充分验证时,可以快速地利用基础Docker镜像创建各类容器,装载相应的技术组件并快速启动运行,
测试人员省去了大量花在测试环境搭建上的时间。
2、 快速搭建复杂分布式测试环境
Docker的轻量虚拟化特点决定了它可以在一台机器上(甚至是测试人员的一台笔记本电脑上)轻松搭建出成
百上千个分布式节点的容器环境,从而模拟以前需要耗费大量时间和机器资源才能搭建出来的分布式复杂测
试环境。
3、 持续集成
Docker可以快速创建和撤销容器,在持续集成的环境中,可以频繁和快速地进行部署和验证工作。
docker常用命令
总的来说分为以下几种:
• 容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
• 容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
• 容器rootfs命令 — docker [commit|cp|diff]
• 镜像仓库 — docker [login|pull|push|search]
• 本地镜像管理 — docker [images|rmi|tag|build|history|save|import]
• 其他命令 — docker [info|version]
1、 列出机器上的镜像(images)
docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests :显示镜像的摘要信息;
-f :显示满足条件的镜像;
--format :指定返回值的模板文件;
--no-trunc :显示完整的镜像信息;
-q :只显示镜像ID。
列出本地镜像中REPOSITORY为ubuntu的镜像列表
root@runoob:~# docker images ubuntu
其中我们可以根据repository来判断这个镜像是来自哪个服务器,如果没有 / 则表示官方镜像,类似于usernam
e/repos_name表示Github的个人公共库,类似于regsistory.example.com:5000/repos_name则表示的是私服。
2、 在docker index中搜索image(search)
Usage: docker search TERM
# docker search seanlo
搜索的范围是官方镜像和所有个人公共镜像。
3、 从docker registry server 中下拉image或repository(pull)
Usage: docker pull [OPTIONS] NAME[:TAG]
# docker pull centos #只会下载tag为latest的镜像
# docker pull centos:centos6
当然也可以从某个人的公共仓库(包括自己是私人仓库)拉取,形如
docker pull username/repository<:tag_name> :
# docker pull seanlook/centos:centos6
如果你没有网络,或者从其他私服获取镜像,形如
docker pull registry.domain.com:5000/repos:<tag_name>
# docker pull dl.dockerpool.com:5000/mongo:latest
4、 推送一个image或repository到registry(push)
与上面的pull对应,可以推送到Docker Hub的Public、Private以及私服,但不能推送到Top Level Repository。
# docker push seanlook/mongo
# docker push registry.tp-link.net:5000/mongo:2014-10-27
registry.tp-link.NET也可以写成IP,172.29.88.222。
在repository不存在的情况下,命令行下push上去的会为我们创建为私有库,然而通过浏览器创建的默认为公共库。
5、 从image启动一个container(run)
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-u:指定容器的用户
-P:指定容器暴露的端口
-v: 给容器挂载存储卷,挂载到容器的某个目录
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/Container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
案例1:使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
# docker run --name mynginx -d nginx:latest
案例2:使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
# docker run -P -d nginx:latest
案例3:使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
# runoob@runoob:~$ docker run -it nginx:latest /bin/bash
# root@b8573233d675:/#
案例4、运行一个简单的容器,其中需要包含控制台管理,这个容器一执行就会进入到默认的线程”/bin/bash”,
直接进入控制台操作。当退出控制后后,容器会被终止。
# docker run -i -t centos6.8
案例5、我们希望一个容器在它的进程结束后,立马自动删除。
# docker run -it --rm centos6.8
这时候我们进入了容器的控制台,当我们在容器内部exit退出控制台的时候,容器将被终止,同时自动删除。
案例6、运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,还能用控制台管理.
# docker run -d --restart=always centos6.8 ping
www.docker.com
这个容器将永久在后台执行,因为ping这个线程不会停止。如果你把ping这个线程终止了,那么容器会重启继
续执行ping功能
案例7、我们需要让server-http容器连接server-db容器
# docker run -d --name=server-http --link=server-db centos6.8-httpd /usr/bin/httpd --DFOREGROUND
这时候,我们执行了apache的服务器让它不断的在后台执行,同时,在php里配置mysql的服务器名称为”ser
ver-db”,直接用server-db命名就可以了。不需要输入ip地址之类的。我们的server-http指定连接了server-d
b。server-db在server-http里会被当做一个DNS解析来获取相应的连接ip。
案例8、我们要将宿主机的数据库目录/server/mysql-data挂载到server-db上
# docker run -d --name=server-db -p 3306:3306 -v /server/mysql-data:/mysql-data centos6.8-mysql /usr/
bin/mysql_safe –d
这时候,你会发现,在server-db根目录下你会发现有一个新的文件夹mysql-data,同时里面的文件内容和宿
主机下/server/mysql-data一样。
6、 将一个container固化为一个新的image(commit)
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。
runoob@runoob:~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
请注意,当你反复去commit一个容器的时候,每次都会得到一个新的IMAGE ID,假如后面的repository:tag
没有变,通过docker images可以看到,之前提交的那份镜像的repository:tag就会变成:,所以尽量避免反复
提交。
虽然产生了一个新的image,并且你可以看到大小有100MB,但从commit过程很快就可以知道实际上它并没
有独立占用100MB的硬盘空间,而只是在旧镜像的基础上修改,它们共享大部分公共的“片”。
7、 开启/停止/重启container(start/stop/restart)
容器可以通过run新建一个来运行,也可以重新start已经停止的container,但start不能够再指定容器启动时
运行的指令,因为docker只能有一个前台进程。
容器stop(或Ctrl+D)时,会在保存当前容器的状态之后退出,下次start时保有上次关闭时更改。而且每次
进入attach进去的界面是一样的,与第一次run启动或commit提交的时刻相同。
docker stop $CONTAINER_ID
docker restart $CONTAINER_ID
8、 连接到正在运行中的container(attach)
attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。
# docker attach --sig-proxy=false $CONTAINER_ID
9、 查看image或container的底层信息(inspect)
inspect的对象可以是image、运行中的container和停止的container。
查看容器的内部IP
# docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID
172.17.42.35
10、 删除一个或多个container、image(rm、rmi)
你可能在使用过程中会build或commit许多镜像,无用的镜像需要删除。但删除这些镜像是有一些条件的:
• 同一个IMAGE ID可能会有多个TAG(可能还在不同的仓库),首先你要根据这些 image names 来删除标
签,当删除最后一个tag的时候就会自动删除镜像;
• 承上,如果要删除的多个IMAGE NAME在同一个REPOSITORY,可以通过docker rmi 来同时删除剩下的T
AG;若在不同Repo则还是需要手动逐个删除TAG;
• 还存在由这个镜像启动的container时(即便已经停止),也无法删除镜像;
删除容器
docker rm <container_id/contaner_name>
• -f选项用来强制删除
• --no-prune选项会保留被删除镜像中未打标签的父镜像。
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2