置顶

docker渗透工具镜像,实用docker镜像

作者:hacker | 分类:黑客教程 | 浏览:106 | 日期:2022年09月26日

目录:

docker怎么将宿主机系统生成镜像

初次安装部署好docker后,大多数镜像可以从DockerHub 提取,但是大多数人都希望自己可以完全自定义一个镜像,那么这里需要一个第三方工具 febootstrap

epel6的源提供febootstrap的RPM包

yum install docker-io febootstrap -y

service docker start

chkconfig docker --level35 on

复制代码

*** CentOS6.6镜像目录

febootstrap -i yum -i iputils -i iproute -i bash -i vim-minimal -i coreutils -i tar -i net-tools centos6 base a href="" target="_blank";/a -u a href="" target="_blank";/a

复制代码

-i 表示镜像里面安装的RPM包(包括一些人为有必要的软件包)

centos6 表示镜像的版本说明

base 表示生成的镜像目录

后面之后了系统安装源和更新源为USTC

安装执行后,会开始一系列的RPM包下载安装,过程与yum类似,安装完成后当前目录会多了base目录,里面就是一个镜像的系统文件

进入base目录等于进入镜像的根目录

[root@image ~]# cd base/

[root@image base]# ls

bin boot dev etc home lib lib64 media mnt opt proc root *** in selinux srv sys tmp usr var

复制代码

可以像一般的系统文件一样先做一些修改配置,例如配置第三方yum源等等

把base目录把所有文件打包成二进制文件后导入docker创建为镜像

cd ~/root/base/ tar -c . | docker import - centos6:base

复制代码

docker images 可以查看镜像的信息

一个基本centos镜像创建完毕,下面再利用Dokcerfile *** mysql镜像

cat Dockerfile

FROM centos6:base

MAINTAINER Lion "lioncui@163.com"

VOLUME /var/lib/mysql

RUN yum install mysql-server mysql -y

RUN echo -ne "NETWORKING=yes\\nHOSTNAME=mysql" /etc/sysconfig/network

RUN echo -ne "bind-address = 0.0.0.0\\ndefault-storage-engine=innodb\\ninnodb_file_per_table\\n\

collation-server=utf8_general_ci\\ninit-connect='SET NAMES utf8'\\ncharacter-set-server = utf8" insert

RUN sed -i "/user=mysql/r insert" /etc/my.cnf rm -f insert

RUN echo -ne "/usr/bin/mysql_install_db\\n/usr/bin/mysqld_safe" /opt/mysql_start

RUN chmod 777 /opt/mysql_start

ENV PATH /usr/local/ *** in:/usr/local/bin:/ *** in:/bin:/usr/ *** in:/usr/bin:

WORKDIR /opt

EXPOSE 3306

CMD /bin/sh -c mysql_start

复制代码

FROM 声明以centos:base镜像为基础

MAINTAINER 声明镜像的维护者信息

VOLUME 挂载本地目录到容器里/var/lib/mysql目录(这是mysql默认的数据保存目录)

由于我希望数据可以持久化防止因为容器误删除而丢失,所以映射到宿主本地目录

RUN 在镜像中执行安装mysql

在新镜像中写入HOSTNAME信息,因为mysql启动过程需要network文件

在my.cnf配置文件插入一些修改配置

创建启动脚本

声明环境变量

制定默认工作目录

EXPOSE 声明容器需要暴露的端口号

CMD 是指镜像生成容器后自动执行的命令,类似docker exec,这里是自动启动mysql服务

根据Dockerfile创建mysql服务镜像

docker build --rm=true -t mysql:frist .

查看镜像的树状关系可以发现,mysql:frist是以centos:base为父镜像

如何使用docker来 *** 我现在正在使用的系统的镜像

在使用Dockerdocker渗透工具镜像的过程中docker渗透工具镜像docker渗透工具镜像我们除了从Docker Hub上下载已经做好的镜像,很多时候需要我们自己 *** 镜像。下面想在这个文章中说明一下镜像的 *** *** 。

*** 镜像的方式主要有两种docker渗透工具镜像

通过docker commit *** 镜像

通过docker build *** 镜像

这两种方式都是通过改进已有的镜像来达到自己的目的。 *** 基础镜像,会在另外一篇文章“从零开始 *** 基础镜像”中介绍。

docker commit

docker commit 是往版本控制系统里提交一次变更。使用这种方式 *** 镜像,本质上是运行一个基础镜像,然后在基础镜像上进行软件安装和修改。最后再将改动提交到版本系统中。

选择基础镜像

基础镜像的选择要结合自己的需求。可以选择已有的应用镜像来改造,也可以选择Ubuntu,Debian,OpenSuse这类基础系统镜像

我们以ubuntu为例子来说明

步骤1:运行ubuntu 镜像

docker run -i -t ubuntu /bin/bash

步骤2:安装软件并修改软件配置, 比如:安装apache2

apt-get -yqq update

apt-get -y install apache2

安装完成后,对apache2进行配置和修改

步骤3:退出docker并保存镜像

使用“exit”命令退出容器

运行docker comit 命令, 进行保存

docker commit 61412230ae46 own-apache2

docker commit 命令参数说明

命令格式

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS:

-a, --author= 提交的镜像作者

-c, --change=[] Apply Dockerfile instruction to the created image, 没用过

-m, --message= 提交时的说明文字

-p, --pause=true 在commit时,将container 暂停

CONTAINER:

可以使用container 的名字或者ID

REPOSITORY

指定镜像仓库,上述例子中,指定的是本地存储

可以指定远程镜像仓库,如docker hub。也可自建仓库来存放image

TAG:

镜像TAG

docker build

使用docker build创建镜像需要编写Dockerfile.

步骤:

编写自己的Dcokerfile

运行docker build 命令打包镜像

仍然以apache打包为例子。以下是Dockerfile的例子

FROM ubuntu:latest

MAINTAINER sky

#Add 163 mirror for apt

ADD sources.list /etc/apt/sources.listADD .bashrc /root/.bashrcENV DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q --fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/*# Setup environmnt for apache's init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pidENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \ s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \ s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \' '{}' ';'EXPOSE 80CMD ["apache2", "-DFOREGROUND"]

编辑完成后,在与Dockerfile同一目录下运行docker build 命令

docker build -t apache-img .

如果没有命令出错,docker build会持续运行直到镜像创建完成

而创建的过程本质上是运行一个镜像,然后在镜像中按序执行在Dockerfile中的命令,直到执行结束。

如果中间有命令执行失败,镜像创建会停止。这时就需要看log,并修改Dockerfile,然后再次执行docker build

注:两种镜像创建方式的对比:

docker commit

docker build

难度相对容易,适合新手和对Linux不熟悉的用户相对难,要求有一定的linux和脚本基础知识

文档化

文档化在通过其docker渗透工具镜像他文件来实现

Dockerfile本身就是比较好的文档,可读和可理解性比较强。也可配合其他文档带来详细说明

升级,维护

后续升级和维护麻烦,需要再次运行镜像并对内部软件进行升级或者安装新软件增加特性

后续升级和维护会相对简单,可以直接在dockerfile中更改并增加新特性

具体选择哪种方式来 *** 镜像需要结合实际情况来选择

Dockerfile 关键字详解

FROM

FROM用来指定基础包。在上面的例子中,基础包用的是ubuntu。

MAINTAINER

镜像作者信息,或者维护人员信息

ADD

将文件拷贝到Container内文件系统对应的路径

格式 ADD src file dst file

所有拷贝到Container中的文件和文件夹权限为0755,uid和gid为0

如果需要修改owner用户或者权限,需要使用RUN进行修改

ADD文件,文件路径要在docker buildPATH中指定的PATH下

RUN

创建镜像时执行

ENV

用来设置环境变量

EXPOSE

Container内部服务开启的端口

主机上如果要使用,还需要在启动Container时,做host-container的商品映射

使用EXPOSE后,一些自动化布署工具可以直接读取这个信息,自动进行端口映射

EXPOSE可以有多条,指定多个端口

WORKDIR

切换工作目录,可进行多次切换(相当于cd命令)

切换目录对RUN,CMD,ENTRYPOINT有效

USER

执行container的用户,如未指定,则默认使用root用户

ENTRYPOINT

Container启动时执行的命令,一个Dockerfile中只能有一条ENTRYPOINT

ENTRYPOINT没有CMD的可替换特性

CMD

Container 启动时执行的命令,一个Dockerfile 中只能有一条CMD命令,如果有多条则只执行最后一条CMD

如果有多条命令希望在启动后执行,可以考虑使用shell 脚本

与ENTRYPOINT的区别

CMD的主要用途是为可执行的container提供默认命令

CMD在运行时是可替换的,比如

在ubuntu中,CMD指定的是/bin/bash。默认情况下运行ubuntu,container中的/bin/bash会被执行

如果使用docker run指定运行命令,那CMD会被替换掉

如:docker run ubuntu /bin/echo "this is a echo". 这时,container 启动后会执行echo 而不是/bin/bash了

ENTRYPOINT是不会替换的,如果在ubuntu镜像中加入ENTRYPOINT,那ENTRYPOINT在启动后会先被执行

CMD可以为ENTRYPOINT来提供参数

例子:

FROM ubuntu:14.10

ENTRYPOINT ["top", "-b"]

CMD ["-c"]

VOLUME

语法:VOLUME [PATH]

VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移

可以将本地文件夹或者其他Container的文件夹挂载到Container中

怎么在服务器上 *** docker镜像

步骤1:为我们的容器创建之一个镜像

# 以 centos 镜像作为基础镜像,我们启动自己的容器并在其中执行/bin/bash命令

# 注:-t -i 参数用于创建一个虚拟的命令行。

sudo docker run -t -i centos /bin/bash

现在我们已经成功的运行了自己的之一个容器,并且进入到容器的命令行界面中。在容器中,我们执行下面的命令:

yum -y update # 更新软件包

yum install which # 安装which命令

yum install git # 安装Git

安装完成后,按 Ctrl + d 来退出容器的命令行。

# 执行sudo docker ps -a,可以看到被我们终止的容器

CONTAINER ID IMAGE COMMAND CREATED……

da9031d3568f centos:6.4 /bin/bash 5 minutes ago…..

把我们所做的改变提交到一个新的容器:

# 这里我们创建一个自己的基础容器,容器中安装好了文章中所需的常用工具。读者的容器 id 可能与文章中的有所不同,以上一步 docker ps -a 的结果为准。

sudo docker commit da90 custom/base

容器成功提交后,执行 sudo docker images ,我们会看到刚才提交的容器(如下面的结果所示)。我们就以这个容器为基础容器,再来创建一个新的容器。

REPOSITORY TAG IMAGE ID CREATED

custom/base latest 05b6cecd370b 2 minutes ago

centos 6.4 539c0211cd76 10 months ago

centos latest 539c0211cd76 10 months ago…

步骤2:创建新的容器,并安装 apache

# 以 custom/base 容器为基础,运行一个新的容器。

sudo docker run -t -i custom/base /bin/bash

# 安装 httpd

yum install httpd

步骤3:再次提交新的容器

按 Ctrl + d 来退出容器的命令行,然后执行命令:

# 这个命令会把步骤2中我们安装 httpd 带来的改变提交到新的名为 custom/httpd 的容器镜像中。你的容器 id 可能会和文章中有所不同,以 sudo docker ps -a 命令的结果为准。

sudo docker commit aa6e2fc0b94c custom/httpd

你应该已经发现了,我们创建了一个带有 http 服务器并可以复用的容器镜像。你可以根据这种思想,为自己所需的每个组件都创建一个容器,然后把这些容器复用于开发环境或者生产环境。

步骤7:运行 http 服务器

# -v will Mount a volume from VM to the container which was also shared from host to Vagrant VM.

# -v 参数把主机共享给虚拟机的一个卷挂载到容器中

# -p forward VM port 80 to container port 80; VM port 80 is mapped to host port 8080 in Vagrantfile

# -p 参数把虚拟机的80端口映射到容器的80端口;虚拟机的80端口在 Vagrantfile 中被绑定到主机的8080端口,也就是:主机8080-虚拟机80-容器80

sudo docker run -t -i -p 80:80 -v /vagrant/htdocs:/var/www/html custom/httpd /bin/bash

# 启动 Apache

apachectl -k start

docker基础镜像是什么意思

镜像是 Docker 运行容器的前提,Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

对于docker镜像,官方的定义如下: An image is a read-only template with instructions for creating a Docker container. Often, an image is based on another image, with some additional customization. For example, you may build an image which is based on the ubuntu image, but installs the Apache web server and your application, as well as the configuration details needed to make your application run.‘ 映像是一个只读模板,带有创建Docker容器的指令。通常,一个映像是基于另一个映像的,还需要进行一些额外的定制。例如,您可以构建一个基于ubuntu映像的映像,但是安装Apache web服务器和您的应用程序,以及使您的应用程序运行所需的配置细节。

Docker如何创建镜像

如何通过dockerhistory命令来对docker镜像进行反向工程推测它们的Dockerfiledocker渗透工具镜像,从而在对不同的Docker镜像反向工程获取Dockerfile之后合并成一个。常言道,“不要重复发明轮子!”在使用docker时,更好在构建docker渗透工具镜像你自己的镜像前上DockerHub寻找一些直接可以用的。把docker渗透工具镜像你的软件架构分布到一系列容器中,每一个容器只做一件事情是非常有用的。构建分布式应用的更好的基石是使用来自DockerHub的官方镜像,因为你可以信任它们的质量。在某些情况下,你可能想让一个容器做两件不同的事情。在另一些情况下,你可能想让一个Docker镜像包含来自两个不同镜像的依赖。如果你有每个镜像的Dockerfile,这是非常简单的。将它们组织到一个Dockerfile里然后build即可。但是,如果大多数时间你都在使用DockerHub上准备好的镜像,你将没有它们的源Dockerfile。我花了一些时间来找这样一个工具,它可以合并(或flatten)两个不同的我没有它们的Dockerfile的Docker镜像。即我在找一个能做下面这件事的东西:image1--\---merged_image_12/image2--尽管这个问题在之前的两个进程中被关闭了(1,2),当你想这么做时,这个问题仍然会产生。

发表评论

访客 游客 2022-09-26 · 回复该评论
76 10 months ago…步骤2:创建新的容器,并安装 apache# 以 custom/base 容器为基础,运行一个新的容器。sudo docker run -t -i custom/base /bin/bash# 安

访客 游客 2022-09-26 · 回复该评论
用户或者权限,需要使用RUN进行修改ADD文件,文件路径要在docker buildPATH中指定的PATH下RUN创建镜像时执行ENV用来设置环境变量EXPOSEContainer内部服务开启的端口主机上如果要使用,还

访客 游客 2022-09-26 · 回复该评论
TAG IMAGE ID CREATED custom/base latest 05b6cecd370b 2 minutes ago centos 6.4 539c0211cd76 10 months ago cen

访客 游客 2022-09-26 · 回复该评论
的container提供默认命令CMD在运行时是可替换的,比如在ubuntu中,CMD指定的是/bin/bash。默认情况下运行ubuntu,container中的/bin/bash会被执行如果使用docker run指定运行命令,那CMD会被替换掉如:docker run ubuntu /b

取消
微信二维码
支付宝二维码