目录
参考文件:
https://mp.weixin.qq.com/s/IEa9DfUiep33G9PGKRe9KQ
https://mp.weixin.qq.com/s/lNU9CQ5heATDw1AuwDTQlg
https://blog.csdn.net/Z_Grant/article/details/101076012
参考视频:
https://www.bilibili.com/video/BV1jz411q7f4?p=7
目录
一、简介
0、沙箱机制
沙箱机制
- 1.沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响.
- 2.沙箱具有非常良好的独立性、隔离性,所以能够搭建一些具有高风险的软件进行测试.
1、Docker架构
1.1> Docker包括三个基本概念 :镜像(Image)、容器(Container)、仓库(Respository)
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
1.2> 容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
容器 | 对象 |
镜像 | 类 |
如图所示:
概念 | 说明 |
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用,是镜像运行时的实体。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker Registry | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。 通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
二、docker的安装
1、Ubuntu系统
#先下载python(最好先换源)
sudo apt install python3
#安装pip
sudo apt install python3-pip
#安装docker
sudo apt-get install docker.io
#创建软连接
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
#下载docker-compose
sudo apt install docker-compose
#开启docker
sudo systemctl start docker.service
sudo systemctl start docker.socket
2、CentOS系统
直接挂载课程配套的CentOS7.x镜像
# yum包更新到最新
sudo yum update
# 安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动驱动依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置yum源为aliyun
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker
sudo yum install docker-ce
# 安装后查看docker版本
docker -v
设置ustc的镜像
# ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共的服务。
https://lug.ustc.edu.cn/wikl/mirrors/help/docker
# 编辑文件
vi /etc/docker/daemon.json
# 在该文件中输入如下内容:
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
# 启动docker服务
systemctl start docker
# 查看状态
systemctl status docker
三、docker命令
当前docker版本信息查询
$ docker version
3.1 关于镜像的操作
(1)镜像的搜索
$ docker search XXXX
(2)镜像下载
$ docker pull XXXX
(3)查看本地镜像
$ docker images
(4)删除本地镜像
$ docker rmi 镜像名
3.2 容器的基本操作
3.2.1> 查看容器命令
# 查看正在运行的容器
$ sudo docker ps
# 查看所有容器
$ sudo docker ps -a
# 查看最后一次运行的容器
$ sudo docker ps -l
# 查看停止的容器
$ sudo docker ps -f status=exited
3.2.2> 创建与启动容器
创建容器常用的参数说明:
创建容器命令:
$ sudo docker run
- -i:表示运行容器
- -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
- --name:为创建的容器命名
- -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机的目录)。可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主上做修改,然后共享到容器上。
- -d:在run后边加上 -d 参数,则会创建一个守护容器在后台运行(这样创建容以后不会自动登录容器,如果只加 -i -t两个参数,创建后就会自动进入容器)。
- -p:端口映射,前者是宿主机端口,后者为容器内的映射端口。可以多喝 -p 做多个端口映射。
# 交互式方式创建容器:
$ sudo docker -it --name=容器名 镜像名称:标签 /bin/bash
注意:这时我们通过ps命令查看,发现看到的启动的容器,状态为启动状态
# 退出当前容器:
命令:exit
# 守护式方式创建容器:
$ docker run -di --name=容器名称 镜像名称:标签
# 登录守护式容器方式:
$ docker exec -it 容器名称(或者容器ID) /bin/bash
3.2.3> 宿主机和容器之间的拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令(不管你的容器是停止,还是运行的都可以进行拷贝)
$ sudo docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝宿主机上
$ sudo docker cp 容器名称:容器目录 需要拷贝的文件或目录
3.2.4> 目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器 添加 -v 参数 后边为 宿主机:容器目录,例如
$ sudo docker -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多级目录,可能会出现权限不足的提示。
这个因为CentOS中的安全模式selinux把权限禁止了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题。
3.2.5> 查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据:
$ sudo docker inspect 容器名称(容器ID)
也可以直接执行下面的命令直接输出IP地址:
$ sudo docker inspect --format='{{.NetworkSettings.IPSddress}}' 容器名称(容器ID)
3.2.6> 删除容器
删除指定容器:
$ sudo docker rm 容器名称(容器ID)
================================================================================================
================================================================================================
================================================================================================
具体示例:
(1) 创建容器:
$ docker run -itd --nane=指定容器的名称 使用的镜像名
-i:表示以交互模式运行容器
-d:表示后台运行容器,并返回容器ID
-t:为容器重新分配一个伪输入终端;
(2) 查看运行的容器
$ sudo docker ps
# 注意 同一个镜像可以assign到多个容器上
(3) 停止容器
$ docker stop 容器名/容器ID
(4) 重启容器
$ docker restart 容器名/容器ID
(5) 删除容器
$ docker rm 容器名/容器ID
3.3 容器的保存
(1)进入容器
docker exec -it 容器名/容器ID /bin/bash
(2)保存
对通过同一镜像创建的不同容器,操作之后,可以保存为一个新的镜像
3.4 对容器操作
------端口映射
(1)创建一个有端口映射的容器
$ docker run -itd -p 宿主机端口:容器端口 镜像名
访问宿主机的90端口就是nginx喽
四、使用docker-compose编排镜像
docker 提供了一个命令行工具 docker-compose 帮助完成镜像的编排, 要使用 docker-compose , 需要先编写一个 docker-compose.yml
文件, yaml 是一种常用配置文件格
yml :是一个可读性高,用来表达数据序列的格式
参考文献:docker-compose详解
五、更换docker源
由于本来的源太慢了。。。。。,使用阿里的加速源。【容器镜像服务】
- 登录之后,提供一个URL
配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
六,搭建靶机
两个开源的项目:
【vulhub靶机说明:】
# 进入某一个漏洞/环境的目录
cd flask/ssti
# 自动化编译环境
docker-compose build
# 启动整个环境
docker-compose up -d
#每个环境目录下都有相应的说明文件,请阅读该文件,进行漏洞/环境测试。
#测试完成后,删除整个环境
docker-compose down -v
【实列】
进入要搭建的环境的目录查看yml文件
使用docker-compose build
编译环境,然后启动环境
yang@yang-machine:~/baji/vulhub-master/joomla/CVE-2017-8917$ sudo docker-compose up -d
Pulling mysql (mysql:5)...
5: Pulling from library/mysql
8f91359f1fff: Pull complete
6bbb1c853362: Pull complete
e6e554c0af6f: Pull complete
f391c1a77330: Pull complete
414a8a88eabc: Pull complete
fee78658f4dd: Pull complete
9568f6bff01b: Pull complete
76041efb6f83: Pull complete
ea54dbd83183: Pull complete
566857d8f022: Pull complete
01c09495c6e7: Pull complete
Digest: sha256:f7985e36c668bb862a0e506f4ef9acdd1254cdf690469816f99633898895f7fa
Status: Downloaded newer image for mysql:5
Pulling web (vulhub/joomla:3.7.0)...
3.7.0: Pulling from vulhub/joomla
5e6ec7f28fb7: Pull complete
cf165947b5b7: Pull complete
7bd37682846d: Pull complete
99daf8e838e1: Pull complete
ae320713efba: Pull complete
ebcb99c48d8c: Pull complete
9867e71b4ab6: Pull complete
936eb418164a: Pull complete
bc298e7adaf7: Pull complete
ccd61b587bcd: Pull complete
b2d4b347f67c: Pull complete
56e9dde34152: Pull complete
9ad99b17eb78: Pull complete
f0b49b0a34a7: Pull complete
bc8d2ddd1ca2: Pull complete
cc87e0e6b730: Pull complete
80c164075256: Pull complete
1bb70ad75826: Pull complete
b30d9e1dab0d: Pull complete
c7e4f22b689f: Pull complete
5093ee2098f3: Pull complete
Digest: sha256:8b38262a5bfd3e8f56415e369c0970a736e31d1138fb9fe0343f88435d43574d
Status: Downloaded newer image for vulhub/joomla:3.7.0
Creating cve20178917_mysql_1 ...
Creating cve20178917_mysql_1 ... done
Creating cve20178917_web_1 ...
Creating cve20178917_web_1 ... done
yang@yang-machine:~/baji/vulhub-master/joomla/CVE-2017-8917$
查看是否成功启动
访问测试是否成功
测试完成后,删除整个环境
$ docker-compose down -v |
$ sudo docker rmi 镜像ID |
参考文献:
https://blog.csdn.net/Z_Grant/article/details/101076012
https://mp.weixin.qq.com/s/IEa9DfUiep33G9PGKRe9KQ
https://mp.weixin.qq.com/s/lNU9CQ5heATDw1AuwDTQlg
七、应用部署
7.1 MySQL部署
参考视频:https://www.bilibili.com/video/BV1jz411q7f4?p=11
(1)拉取mysql镜像
$ sudo docker pull centos/mysql-57-centos7
(2)创建容器
$ sudo docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=ROOT centos/mysql-57-centos7
- -p:代表端口映射,格式为 :宿主机映射端口:容器运行端口
- -e:代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登录密码
(3)进去mysql容器
$ sudo docker exec -it tensquare_mysql /bin/bash
(4)登录mysql
$ sudo mysql -u root -p
(5)远程登录mysql
连接宿主机的IP,指定端口为33306
7.2 tomcat部署
参考视频:https://www.bilibili.com/video/BV1jz411q7f4?p=12
(1)拉取镜像
$ sudo docker pull tomcat:7-jre7
(2)创建容器
创建容器 -p 表示地址映射
$ sudo docker run -di --name=mytomcat -p 9000:8000 -v /usr/local/webapps:/usr/loacl/tomcat/webapps tomcat:7-jre7
7.3 Nginx部署
参考视频:https://www.bilibili.com/video/BV1jz411q7f4?p=13
(1)拉取镜像
$ sudo docker pull nginx
(2)创建Nginx容器
$ sudo docker run -di --name=mynginx -p 80:80 nginx
7.4 Redis部署
参考视频:https://www.bilibili.com/video/BV1jz411q7f4?p=14
(1)拉取镜像
$ sudo docker pull redis
(2)创建容器
$ sudo docker run -di --name=myredis -p 6375:6375 redis
(3)远程连接CentOS容器中的redis
八、迁移与备份
8.1 容器保存为镜像
我们可以通过以下命令将容器保存为镜像
这样可以将已经部署好的容器保存为镜像,方便已经配置好环境的移植。
$ docker commit 容器名称 镜像名称
8.2 镜像备份
我们可以通过以下命令将镜像保存为tar文件
$ docker save -o 要保存的tar文件 镜像
8.3 镜像恢复与迁移
首先我们先删除mynginx_img镜像,然后执行此命令进行恢复
$ docker load -i mynginx.tar
-i:输入文件
执行后再次查看镜像,可以看到镜像已经恢复了