序言
欲穷千里目,更上一层楼。
在调试漏洞的过程中会密切地和Docker打交道,总结一下Docker的操作。
基本概念
Docker包括三个基本概念:
- 镜像Image
- 容器Container
- 仓库Repository
镜像就像类,容器就像实例。
容器的实质是进程,容器进程属于自己独立的命名空间,也就是进程隔离
仓库是镜像的存储分发,默认仓库内的镜像是<仓库名>:<Tag>,默认tag是latest
对于一个ubuntu仓库来说:
ubuntu是仓库的名字,ubuntu:16.04和ubuntu:18.04则是两个不同标签代表不同版本。
仓库通常是两段式命名,例如ownername/nginx
前者是用户名,后者是镜像。
镜像
获取镜像
| 1 | docker pull [args] [域名[:端口号] /] 仓库名[:标签] | 
docker pull --help看细节
- docker仓库地址:<域名/IP>[:端口号]默认地址是docker.io
- 仓库名:<仓库名/软件名>仓库名不写,默认是library,也就是官方镜像
比如:docker pull ubuntu:18.04
完整仓库名就是:docker.io/library/ubuntu:18.04 
运行镜像
| 1 | docker run -i -t --rm ubuntu:18.04 /bin/bash | 
解读:
- -i参数是启动容器内交互式操作模式
- -t参数是在容器内开启一个终端
- --rm代表容器退出后随之将该容器删除,不必再手动rm,不支持以 docker run -d 启动的容器
- bash就是给容器的命令,这里我们希望得到交互式shell,所以打开bash
其他参数:
- -d可以让容器在后台运行
- -p暴露端口
- exit退出容器
列出镜像
| 1 | docker image ls | 

参数:
- docker image ls -q只显示image的id
- docker image ls ubuntu只显示仓库名是ubuntu的image
删除本地镜像
| 1 | docker image rm [args] <image's id/reponame/> | 
参数:
- 这里面的image's id通常可以是长ID12位,也可以仅仅是前3位短id
配合docker image ls
| 1 | docker image rm $(docker image ls -q redis) #删除所有仓库名为 redis 的镜像 | 
搜索镜像
在docker hub中搜索镜像
| 1 | docker search mysql | 
提交镜像
| 1 | docker commit -m "xxx" -a="author" 镜像id 目标镜像名:TAG | 
保存在本地
容器
新建&启动
| 1 | docker run ubuntu:18.04 /bin/echo "helloworld" | 
没有的镜像,会自动pull
守护态运行
| 1 | docker run ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" | 

会将结果打印在本地终端,这里需要启动-d参数,来让容器在后台运行:
| 1 | docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" | 

就不再会打印到本地终端。
使用docker logs 86d4eab113a908ce2ee49fa46145623d62a290a76ab3807429588f7c2868bd6来查看

输出内容会在日子里体现出来,
查看运行中的容器
| 1 | docker container ls | 

对比可以发现,刚才那一长串才是完整ID
查看容器的日志信息:
| 1 | docker container logs [id or name] | 
终止&重启容器
首先,当容器内的程序结束时,容器也将自动终止。
对于一般情况,可以使用docker container stop [id or name]来终止
终止状态的docker信息可以docker container ls -a来查看

在容器内部
exit退出并终止容器
ctrl+p+q 退出但不终止容器
对于已经停掉的容器,重新启动可以docker container start [id or name]
对于正在运行的容器,强制重新启动可以docker container restart [id or name]
删除全部容器:
| 1 | docker rm -f $(docker ps -aq) | 
进入容器
attach和exec都可以,更推荐exec
| 1 | docker container ls | 

原因:
- -it一起使用时,可以进入交互模式,并且可以看到熟悉的- linux命令提示符
容器的导出&导入
导出
| 1 | docker export id > ubuntu.tar | 

导入
| 1 | cat ubuntu.tar | docker import - test/ubuntu:v1.0 | 
也可以通过网址来import:
| 1 | $ docker import http://example.com/exampleimage.tgz example/imagerepo | 
删除容器
删除正在运行的容器
| 1 | docker container rm -f [id or name] | 
删除所有容器
| 1 | docker container prune | 
外部网络访问容器
| 1 | docker run -d -P nginx | 
-P参数的意思就是随机打开一个本地端口
查看访问日志;
| 1 | docker logs id | 
-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
| 1 | -p 55500:80 | 
意思就是本机的55500端口映射给80端口
| 1 | -p 80:80 | 
的意思就是映射全部端口。
比较:
| 1 | -p 80:80 绑定对应所有端口 | 
查看端口映射的配置
| 1 | docker port id 80 | 
查看当前所有的网络配置
·
查看容器元数据
| 1 | docker inspect 容器id | 
容器的加载
tar文件:容器的离线保存
container->image
将容器保存为镜像
| 1 | docker commit [OPTIONS] CONTAINERID [REPO:VERSION] | 
OPTIONS:
- -m: info
- -a: author
container->tar
将容器保存为tar文件
| 1 | docker export -o target.tar [ContainerID] | 
images<->tar
images<-tar
load:将tar加载为image
| 1 | docker load -i target.tar | 
加载之后为同名image
image-> tar
save:将image保存为tar文件
| 1 | docker save -o target.tar ImageID | 

额外的备忘命令
| 1 | 查看当前运行的容器 | 
容器数据卷
容器之间数据共享的技术,将容器内部的目录,挂载到宿主机上
命令挂载
-v 主机目录:容器目录
数据映射
Dockerfile
docker的构建文件,本质为命令脚本
镜像多层,命令多行
| 1 | docker build -f Dockerfile -t 镜像名:版本 . | 
常用命令
RUN
docker build时候执行
| 1 | FROM centos | 
CMD docker run 时执行
| 1 | CMD ["ls","-a"] |