docker学习笔记--重基础使用

  最近一直在研究Elasticsearch,后来部门的同事遇到了一个docker集群的未受权访问漏洞,因而稍微看了一下docker进行了一下基本的入门,本文把本身学习docker的过程进行了一个详细的记录,但愿能看过本文的文章能快速入门,本文会捡着最重要的命令分类进行介绍,让不了解docker的安全从业人员快速了解docker。linux

  • Docker与KVM的区别

  说到KVM和Docker的区别,我引用一张图,因为题主不在互联网公司工做,对于KVM和Docker对于生产的适用环境理解还欠佳,若是将来有机会进入互联网工做,再把这部分补上。nginx

  不过经过架构咱们能够明显的看出KVM的隔离对于Docker要好不少,因为KVM存在Hypervisor的存在对于硬件层面的虚拟化程度是远高于docker的,基于Hypervisor咱们能够安装各类系统,系统中的文件与环境也是隔离的。而Docker却不同。应用之间大量的底层和编译环境是共享的。这是我认识的Docker与KVM但并非本文的重点,若是此处有任何错误也环境大牛来指正。redis

  • Docker公有镜像的获取

  在docker中咱们能够经过如下命令来查找共有镜像:docker

docker search nginx \\搜索公有的nginx images

  

  经过docker pull命令来获取公有镜像:shell

docker pull nginx \\获取名为nginx的镜像
  • Docker启停建立容器等经常使用命令分析

  这部分命令很是多,也很是容易混淆,我在学习这部分的时候产生过许多疑问。诸若有了start命令为什么还要有run命令。为何有些参数只能跟着run而不能跟着start,以及一些常见的一些技巧。apache

docker images  \\查看本机拥有的镜像

  然而一个镜像仅仅是镜像,他须要在容器中进行执行,因此咱们要将images转换为容器。建立一个新的容器咱们一般使用如下的组合命令:centos

docker run -idt --name newcentos centos haha.sh

参数解释:
-it 一般一块儿出现(标准输入给容器并产生一个交互性shell)
-d 在后台运行
--name 给容器起一个名字方便管理(不然你要用容器ID管理了,心态会爆炸的)
/bin/bash 生成容器后要执行的命令

连起来解释:

建立一个新容器 装载的镜像为 centos  这个容器命名为newnetos 
建立完成后执行haha.sh脚本 经过bash来管理这个容器 
而且建立完成后不进入容器(-d参数的存在)

  管理docker容器我主要用如下命令来实现:api

docker ps -a \\显示全部docker容器

  咱们能够经过attach命令来进入一个容器,进行交互式shell管理:安全

docker start newcentos \\容器必须启动 才能够attach
docker attach newcentos \\上文咱们将镜像命名为newcentos,不然咱们要跟镜像的ID

  咱们能够经过start和stop命令来启停容器,同时须要注意的是,题主在有一点是懵逼的以前。docker run包含docker creat和docker start两个阶段。因此将一个新镜像装入容器中咱们使用docker run能够一劳永逸的解决两个阶段的问题。bash

  删除容器的过程咱们须要两个阶段,中止以后删除:

docker stop newcentos \\中止容器运行
docker rm newcentos  \\删除容器

  

  • Docker端口映射

  当咱们运行一个apache镜像的时候,咱们每每但愿访问宿主机地址80或者443端口来达到访问容器中运行的apache进程。这时咱们须要将宿主机的80和443端口映射到容器中的80和443端口,一般咱们使用以下命令。

docker run -idt --name apache -p 80:80 httpd

参数解释:
-p 宿主机端口:容器端口 

  我本身做为安全人员用到-P参数比较少,主要是将宿主机的随机端口映射到容器的特定端口。

  • Docker挂载磁盘映像

  经典的docker romote api 未受权访问漏洞反弹shell通常须要挂载宿主机根目录来获取权限,这里不详细赘述。通常咱们能够挂载本机的nginx配置文件等到容器,实现相似于linux系统中/mnt的效果。

docker run -p 80:80 --name mynginx -v /www:/www -v /etc/conf/nginx.conf:/etc/nginx/nginx.conf -d nginx 

参数解释:
-v 宿主机文件目录:容器目录   
  • Docker镜像建立(commit和Dockerfile)

  咱们可能在一个centos的镜像容器中部署了各类环境如nginx,redis啊,如今我想对这个自定义的centos容器进行打包造成一个新的镜像。可使用commit和dockerfile两种方法。

docker commit -m "centos-redis" -a "legwindy" abe40a097f26 legwindy/centos-redis:v1

参数解释:
-m:一段记录
-a:做者名称
abe40a097f26:打包的容器ID,好比我在一个abe40a097f26的centos
                       image装了不少东西,那个容器ID就是abe40a097f26
(legwindy/centos-redis:v1):打包后的镜像名称,Tag值为v1

  使用dockerfile进行构建,比较复杂,我从网上找了个实例,须要了解不少语法,其实核心思想是把上面每一步操做写到文件中,使用docker build直接按照步骤去执行,如下是转载的一个dockerfile实例:

  几个关键字段:

FROM (镜像名称)
RUN (执行命令)
EXPOSE (容器要打开的端口)
ENTRYPOINT(难理解的点):能够把一个容器封装成一个应用。
CMD(难理解的点):执行的命令

  比较难理解的是ENTRYPOINT和CMD的区别,ENTRYPOINT能够把容器封装成一个应用,好比ENTRYPOINT后面接参数/usr/local/nginx后,咱们attach容器后,效果和在Linux下直接执行nginx命令的回现是相同的。CMD能够理解为接在ENTRYPOINT后的参数,当咱们撰写这么一个参数:--ENTRYPOINT /usr/local/bin/nginx后。咱们咱们使用以下命令达到的效果以下。 docker run xxxx --entrypoint /usr/local/bin/nginx help。等于在物理机中运行nginx help命令。

  关于docker的使用,学习的还比较浅,仅仅在应用层层面,跟本身目前的工做还不太相关,有机会会为你们介绍docker remote api访问漏洞的缘由和防范方法。

相关文章
相关标签/搜索