序言
欲穷千里目,更上一层楼。
在调试漏洞的过程中会密切地和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的iddocker 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"] |