Docker学习
最近网安实践花式安装各种运算库真的麻烦,Docker可以对应用组件进行封装、部署、运行等生命周期管理,是用户的应用及其运行环境能够做到“一次封装,到处运行”。That sounds good,和Java似的,那就学学吧~
说在前面 : )
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置,比如我们的Linux内核为第0层,这是一个只读的镜像,但是我们能够在外加层,由此我们就能得到centos、ubuntu等等其他镜像。
容器的定义和镜像几乎一摸一样,也是一层一层的,区别在于容器在镜像的基础上增加了一个可写层,我们对容器的更改是写到容器的文件系统中的,所以说运行态容器为由一个可读写的文件系统「静态容器」+ 隔离的进程空间和其中的进程构成,如下图所示。
1. 安装docker
这里演示了win10下安装docker,其他操作系统可以参考官方文档
在开始图标处找到应用程序和功能
然后开启Hyper-V
下载windows安装包(大概400+M,官网下载挺快的~),直接一路next完成安装,然后重启电脑即可 : )
镜像加速
外网下载docker镜像太慢了,所以我们需要添加国内镜像,这里使用的阿里云镜像加速。
进入阿里云官网,找到镜像容器服务。
然后找到镜像加速器,下面就有各种系统的配置方法
将镜像加速器地址在docker客户端setting中设置好即可~
2. hello-world
首先从hello-world开始,直接运行如下命令
1 | docker run hello-world |
然后就会提示不能再本地找到hello-world镜像,于是就从远程(阿里云)pull下来了,于是我们就成功运行了hello-world,虽然啥也没干 : (
后面部分主要是一些命令的介绍,主要列举了一些比较常用的命令,当然更加详细的命令可以通过docker —help获得
3. docker镜像命令
3.1 镜像列表
使用docker images
命令查看当前主机上的镜像,REPOSITORY
表示镜像仓库源,TAG
表示镜像的标签,IMAGE ID
表示镜像ID号(仅显示了前12位),CREATED
表示创建的时间,SIZE
表示存储的大小
命令说明
1 | Usage: docker images [OPTIONS] [REPOSITORY[:TAG]] |
3.2 镜像查询
使用docker search
在docker hub上查找我们所需的镜像(配合可选参数能对镜像做一些筛选)
命令详细说明:
1 | Usage: docker search [OPTIONS] TERM |
3.3 镜像提交
有时我们创建好容器后,对容器进行了一些修改,我们想要固化这些修改,我们可以将当前容器又重新生成镜像,使用docker commit
命令。
1 | Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] |
举个栗子
3.4 镜像删除
使用docker rmi
删除一个或多个镜像(多个镜像只需要用空格隔开即可)
1 | Usage: docker rmi [OPTIONS] IMAGE [IMAGE...] |
如果需要删除的镜像还有容器存在使用使用强制删除
4. docker容器命令
4.1 创建容器
有了镜像文件,我们就能在镜像文件的基础上创建容器,使用docker run
命令,关于该命令的一些一些细节可以通过docker run --help
查看(帮助文档太长我就不搬上来了)
举个栗子,使用如下命令创建一个kali容器,-i
交互式操作,-t
终端,-v
添加volume(/宿主机目录:/容器内目录:rw/ro,默认为rw(可读可写),也可以使用—volume-from从其他容器继承volume,其实和手动添加没区别),--name
容器名字,-p
指定端口号(宿主机端口:容器端口)
1 | docker run -it -v /DataVolume:/DataVolume --name kali booyaabes/kali-linux-full |
4.2 删除容器
使用docker rm
命令删除容器
1 | Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...] |
4.3 启动容器
使用docker start
来启动容器
1 | Usage: docker start [OPTIONS] CONTAINER [CONTAINER...] |
4.4 停止容器
停止容器有两种方式:
- 使用
docker stop
来停止容器(同样的还有重启容器命令docker restart
) - 还可以使用
docker kill
强制停止容器
下面是两个命令是使用帮助
1 | Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...] |
4.5 退出容器
退出容器主要有两种方式:
- exit:容器退出并停止
- ctrl+P+Q:容器不停止退出
4.6 进入容器
进入容器也有两种方式:
docker attach
:直接进入容器docker exec
:在一个容器上执行命令,可以选择不进入容器而仅执行命令,当然也可以选择-it
选项进入容器,并且使用exit退出时容器并不会停止
以下是两个命令的详细说明:
1 | Usage: docker attach [OPTIONS] CONTAINER |
使用docker attch
进入容器
使用docker exec
执行命令,也可以选择打开TTY终端
4.7 拷贝容器数据
有时需要将容器中的数据拷贝到宿主机上,但是又没有使用容器数据卷,这时候我们可以使用一个简单的docker cp
命令拷贝出来。
1 | Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- |
比如我们将Linux容器中的一个文本文件拷贝到windows宿主机目录下
4.8 查看容器信息
使用docker inspect
查看容器的详细信息,返回一个类似于json串的描述
1 | Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...] |
docker还有许多内容鸭,docker file, docker compose之类的,感觉目前用不到~有机会再去学吧^_^