关于docker技术的学习
一、docker的介绍
1、什么是docker
Docker是一种轻量虚拟化的容器技术,提供类似虚拟机的隔离功能。 Docker 容器将软件以及它运行
安装所需的一切文件(代码、运行时、系统工具、系统库)打包到一起,这就保证了不管是在什么样的
运行环境,总是能以相同的方式运行。一次镜像,处处运行。
每个容器内运行一个应用,不同的容器之间相互隔离,容器之间也可以建立通信机制。容器的创建和停
止都十分快速,资源需求远远低于虚拟机。
2、Docker与虚拟机的比较
传统虚拟机技术:
虚拟机(Virtual machine)就是带环境安装的一种解决方案。
传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如Vmware和VirtualBox),创建虚拟机
(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用程序。应用程序
对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文
件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,
操作系统和硬件三者之间的逻辑不变。
简言之,传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。
Win10 | VMWare | Centos7 | 各种cpu、内存网络额配置+各种软件 | 虚拟机实例 |
---|---|---|---|---|
虚拟机的缺点:
1 资源占用多
2 冗余步骤多
3 启动慢
容器虚拟化技术
由于前面虚拟机存在某些缺点,Linux发展出了另一种虚拟化技术:
操作系统级的虚拟化:内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。docker
以及其他容器技术就属于此范畴。
容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部
文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具
有可移植性和一致性。
Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所
有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所
需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机操作系统,体积小,运行速度快。
//每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资
源。
3、虚拟机与容器之对比
1-传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。 而docker容器是在操作系统层面上实现虚拟化,直接复用本地主机操作系统,更加轻量。
2- 容器和宿主机共享内核,如果容器中的应用导致Linux内核崩溃,那么整个系统可能就会崩溃。这与虚拟机是不同的。虚拟机并没有与主机共享内核 ,虚拟机崩溃一般不会导致宿主机崩溃。
4、要素
Docker的三大核心概念:镜像、容器、仓库
镜像:类似虚拟机的镜像、用俗话说就是安装文件。 iso image
容器:类似linux系统环境,运行和隔离应用。容器是从镜像创建应用运行实例,可以将其启动、开始、停止、删除、而这些容器都是相互隔离、互不可见的。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。
仓库:类似代码仓库,是Docker集中存放镜像文件的场所。
三者的关系
5、工作原理
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。可以对比mysql。
二、docker部署
1.docker常用命令
启动docker:
$sudo systemctl start docker
$sudo systemctl enable docker
卸载docker,容器
yum remove docker-ce //删除安装包
rm -rf /var/lib/docker //删除镜像、容器、配置文件等内容
sudo docker rm -f CONTAINER ID //删除指定容器
sudo docker container prune //删除所有处于终止状态的的容器
sudo docker system prune -a //删除所有镜像
搜索镜像 :
docker search 关键字
获取镜像:
docker pull 仓库名称[:标签]
查看获取的镜像信息:
docker images
创建容器并运行·:
docker run --name 容器名 -d -p 9002:80 镜像
sudo docker start CONTAINER ID //启动已停止的容器
docker start 容器id //启动容器
查看容器状态:
docker ps #查看正在运行的容器
docker ps -a #查看所有容器
进入容器
docker exec -it 容器ID/名称 /bin/bash
或
docker exec -it 容器ID/名称 sh
退出容器
exit
停止容器:
sudo docker stop CONTAINER ID
将文件从主机复制到docker
sudo docker cp file CONTAINER ID:Destination_directory
下面是进行docker安装已经靶场的安装测试
2.1 安装docker。
2.1.1 使用官方安装脚本自动安装
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内 daocloud 一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
2.1.2 手动安装
安装 Docker Engine-Community
使用 Docker 仓库进行安装
设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
使用以下命令来设置稳定的仓库
使用官方源地址(比较慢)
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
可以选择国内的一些源地址:
阿里云
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清华大学源
$ sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
2.2 安装Docker Engine-Community
命令:
$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
2.2.1 docker启动
$sudo systemctl start docker
$sudo systemctl enable docker
通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community 。
$ sudo docker run hello-world
2.3卸载docker
卸载 docker
删除安装包:
yum remove docker-ce
删除镜像、容器、配置文件等内容:
rm -rf /var/lib/docker
2.4利用docker技术部署靶场
1.搜索镜像
命令:docker search 关键字
使用docker search命令搜索官房仓库中的共享镜像。
2.获取镜像
命令:docker pull 仓库名称[:标签]
对于Docker镜像来说,如果下载镜像时不指定标签,默认会下载仓库中最新版本的镜像,即选择
标签latest。
[root@Samba-hhn1~]#docker pull area39/pikachu
镜像加速
-
镜像加速 镜像拉取速度慢,可以使用镜像加速 1. 打开docker/daemon.json vi /etc/docker/daemon.json 2. 指定镜像 { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } ailiyuun:https://个人ID.mirror.aliyuncs.com 3. 重启docker systemctl daemon-reload systemctl restart docker
阿里云镜像加速获速获取:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
查看获取的镜像信息
#:docker images
创建容器并运行
[root@Samba-hhn1~]#docker run --name piakchu -d -p 9002:80 area39/pikachu
//CentOS8下需要开户
docker run 命令创建窗口时,Docker在后台的标准运行过程如下。
(1)检查本地是否存在指定的镜像,若镜像不存在,会从公共仓库下载。
(2)利用镜像创建并启动一个容器。
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一个可读写层。
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中。
(5)分配一个地址池中的IP地址给容器。
(6)执行用户指定的应用程序。
docker run常见参数
-d:让容器在后台运行。
-p9002:80,容器的80端口,映射到宿主主机的9002端口。
-P:将容器内部使用的网络端口随机映射到我们使用的主机上。
开启IPV4转发功能
vim /usr/lib/sysctl.d/00-system.conf
#添加如下代码:
net.ipv4.ip_forward=1
重启网卡
systemctl restart network
映射多个端口
[root@Samba-hhn1~]#docker run --name piakchu2 -d -p 9003:80 -p 3306:3306 area39/pikachu
//再创建一个Pikachup容器,将MySQL的3306端口也映射到宿主机上,可以从外网访问MySQL服务
查看容器的运行状态
docker ps #查看正在运行的容器
docker ps -a #查看所有容器
[root@Samba-hhn1 ~]# docker ps -a
启动容器:
runoob@runoob:~#docker start 474e431cc706//启动容器
进入容器
命令格式:docker exec -it 容器ID/名称 /bin/bash
另一种进入终端的格式:
docker exec -it 容器ID/名称 sh
如果缺少终端则会报错
--docker run 和 docker exec 的差异
docker run :根据镜像创建一个容器并运行一个命令,操作的对象是镜像;
docker exec :在运行的容器中执行命令,操作的对象是容器。
docker run的操作过程:
runoob@runoob:~#docker pull training/webapp#载入镜像
runoob@runoob:~#docker ps -a
runoob@runoob:~#docker start 474e431cc706//启动容器
docker exec的操作过程:
runoob@runoob:~#docker exec- it 474e431cc706 /bin/bash
退出容器
exit
停止容器
sudo docker stop CONTAINER ID
将文件从主机复制到docker
sudo docker cp file CONTAINER ID:Destination_directory
windows访问测试:
靶场部署成功。
2.5使用Vulhub一键搭建漏洞测试靶场
1.安装工具
yum install -y python3
curl -s https://bootstrap.pypa.io/pip/3.6/get-pip.py | python3
pip install docker-compose
安装pip:
yum install -y epel-release
yum-config-manager --enable epel
yum install python-pip
网站下载漏洞源码:https://vulhub.org/#/docs/download-vulhub/
传入centos7,解压
进入随机一个漏洞的目录下面
cd flask/ssti
安装docker-compose命令命令
1、curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose //下载最新版的 docker-compose 二进制执行文件。
2、chmod +x /usr/local/bin/docker-compose //chmod +x /usr/local/bin/docker-compose
3、docker-compose --version
编译漏洞环境
docker-compose up -d
访问测试
部署成功