Docker在服务器的部署和使用【通过】
2020-05-02 11:31:56 Author: forum.90sec.com(查看原文) 阅读量:389 收藏

Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。我们也可以从他的样子看出来:

image

他是一个小鲸鱼上面满满的载着一些箱子,你可以想象成集装箱。我们在后面所有部署的程序,都在独立的存在在这些集装箱里面,docker则是承载和管理这些集装箱的东西。

为什么使用docker?

理由很简单,就是方便,便于管理,用了的人都说好用。在多系统的分布式项目中,往往传统的部署发包等操作,那是让每个上线的程序员恨的牙痒呀。通常都是通宵奋战,上生产解决各种部署发包问题。但是有了docker就能一键上线和一键部署多个产品。

容器、镜像和仓的基本概念

大家对仓库这个不会太陌生,很多做开发的代码保存的远端就是仓库,镜像就是我们的仓库代码,容器就是运行代码的地方,在没有使用docker的时候,我们需要一个服务器,然后安装环境,在上线我的网站,要是换成另外的网站就需要另外的目录,这样一多了就容易造成混,久而久之越来越多的网站,管理起来就更麻烦。docker就是完美解决了这个问题,他把我运行的每一个网站都放在一个独立的小盒子里,docker不是容器,而是管理容器的东西,很多人会搞混这两个概念。

image

服务器上的docker安装

大部分的 centen OS liunx 安装的教程大家可以很轻松的搜索到,所以我就直接上服务器的安装了(win10有个坑,最好建议不要在win10下装,你不买服务器,开个虚拟机也好)

image

介绍一下基本命令(下面的都是在腾讯的服务器上实现的):

yum install docker # 安装docker

vim /etc/docker/daemon.json #修改docker仓库地址,也叫做镜像加速,把{ “registry-mirrors”: [“https://registry.docker-cn.com”], “live-restore”: true } 复制进去就可以了。

docker # 查看是否安装成功

service docker start # 设置开机自动启动

建议在这之前先把服务器升一下级,避免有些组件不适配

一切就绪以后我们输入 docker -h 就能到下面的情形:

image

现在我们就来进入docker的实战:

docker的基本命令

拉取镜像

docker search XXX # 搜索XXX的镜像

docker search XXX --automated :只列出 automated build类型的镜像;

docker search XXX --no-trunc :显示完整的镜像描述;

docker search XXX -s :列出收藏数不小于指定值的镜像。

使用过Vm的同学应该知道什么是镜像,简单的来说就是源文件的复制的东西,复制的就是镜像,在使用VM的时候我们安装的镜像也是源文件的复制,不过就变成了系统的复制了。镜像的安装呢我们最好去docker.hub查找官方的镜像,比如你要装mysql,你就搜索mysql,下载最多的就是了:

image

然后直接找 Tag 选择你的版本,然后就可以直接复制后面的命令进行镜像的拉取:

image

拉取镜像

docker pull XXX # 选择你拉取的版本
docker pull -a XXX # 拉取所有的版本

把远端的镜像保存到本地,如果你是使用的 docker search XXX 的话,搜索结果会有多个版本,你要根据你自己的要求选择版本,要是不知道的话可以直接拉取,默认是安装最新的版本:

image

我们试着来pull一下--ok

image

当然也可以在docker.hub中的tag命令复制下来安装,使用images查看当前的mysql的所有镜像可以看到一个5.7和一个最新版本。

image

查看安装完成的镜像

docker image -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);

docker images --digests :显示镜像的摘要信息;

docker images -f :显示满足条件的镜像;

docker images --format :指定返回值的模板文件;

docker images --no-trunc :显示完整的镜像信息;

docker images -q :只显示镜像ID。

上面这么多是最全的,但是就使用一个 docker images 就够用了:

image

这里就是我们的全部镜像文件。

创建容器(运行镜像)

docker run  -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

docker run -d: 后台运行容器,并返回容器ID;

docker run -i: 以交互模式运行容器,通常与 -t 同时使用;

docker run -P: 随机端口映射,容器内部端口随机映射到主机的高端口

docker run -p: 指定端口映射,格式为:主机(宿主)端口:容器端口

docker run -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

docker run --name="nginx-lb": 为容器指定一个名称;

docker run --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

docker run --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

docker run -h "mars": 指定容器的hostname;

docker run -e username="ritchie": 设置环境变量;

docker run --env-file=[]: 从指定文件读入环境变量;

docker run --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

docker run -m :设置容器使用内存最大值;

docker run --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

docker run --link=[]: 添加链接到另一个容器;

docker run --expose=[]: 开放一个端口或一组端口;

docker run --volume , -v: 绑定一个卷

这是docker的核心命令,也是我们使用最多的命令,在讲这些以前我们先来看看 docker的两种容器类型:

交互型容器 :交互型的容器就是和我们们可以操作这个容器,常见的有kali容器和mysql这类需要使用的,需要我们进行交互操作的

守护型容器 :这类的话就是部署着就行了,不太需要进行操作(个人理解)

我们接下来创建一个交互式容器,来部署mysql

命令为: docker run -d --name=mysql -p'外网连接地址:内网地址' --restart always --privileged=true -e MYSQL_ROOT_PASSWORD="admin" mysql

使用工具看看是否连接上:

image

测试成功!

接下来我们讲解一下这里面的基本命令含义:

-d

这是表示我们的容器改怎么运行,-d是后台运行,也就是不使用交互模式

--name

我们为我们运行的容器设置一个别称,你可以改成任何你想要的名字

-p

选择你映射的端口,什么是映射,以Mysql来说,在服务器上的mysql运行的端口为80,外网访问的端口为3306,这个时候就是本地的80端口映射的外网的3306端口,我们就可以通过外网的3306来操作本地的80端口

--restart always

设置开机自启动

--privileged=true

提升权限

-e MYSQL_ROOT_PASSWORD="admin"

这个就是设置你的root用户的密码为admin,当然除此以外你还可以创建用户-- -e MYSQL_USER='你想要的名字' ,再设置密码 -e MYSQL_你设置的名字_PASSWORD=''

mysql

这个是你想要使用的镜像版本,我这里使用的是最想的mysql,你也可以选择对应的版本

这就是在服务器上创建交互型容器的基本方式,其实还由其他的配置我没写出来,接下来看交互型容器的创建

交互型容器

我们这里以sqli-labs作为环境,首先呢sqli-labs最为一个开源的SQL注入靶场,很多人都喜欢用,我们就可以使用我们的搜索方式进行操作,和上面的一样,先搜索在pull,在run就可以了,我不重复:

docker serach sqli-labs

docker pull XXX
image
docker  run -d -p'80:80' -p'13306:3306' --name=labs  acgpiano/sqli-labs

这里的p指的是启动的端口,映射了两个端口,一个是Apache服务的,一个是mysql服务的,#13306是宿主机端口,3306是容器中的端口
查看运行的docker:

image

我顺便删了我们的mysql服务,不然端口冲突了

访问网站的80端口:

image
image

成功使用!

现在我们进入sqli-labs的容器

docker exec -it 容器的号 /bin/bash # 进入某个容器的shell

Ctrl + P + Q #退出但是不关闭容器,直接使用excit的话是会直接关闭
image

sqli-labs的配置文件在 /var/www/html 里,我们cd进去:

image

后续的所有操作你可以按照你的喜好来做

这是我对docker的一点理解,可能会有一些错误,希望表哥们看到后能够告诉我一下,还有就是!转载一定要注明出处!


文章来源: https://forum.90sec.com/t/topic/1004
如有侵权请联系:admin#unsafe.sh