Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。我们也可以从他的样子看出来:
他是一个小鲸鱼上面满满的载着一些箱子,你可以想象成集装箱。我们在后面所有部署的程序,都在独立的存在在这些集装箱里面,docker则是承载和管理这些集装箱的东西。
为什么使用docker?
理由很简单,就是方便,便于管理,用了的人都说好用。在多系统的分布式项目中,往往传统的部署发包等操作,那是让每个上线的程序员恨的牙痒呀。通常都是通宵奋战,上生产解决各种部署发包问题。但是有了docker就能一键上线和一键部署多个产品。
容器、镜像和仓的基本概念
大家对仓库这个不会太陌生,很多做开发的代码保存的远端就是仓库,镜像就是我们的仓库代码,容器就是运行代码的地方,在没有使用docker的时候,我们需要一个服务器,然后安装环境,在上线我的网站,要是换成另外的网站就需要另外的目录,这样一多了就容易造成混,久而久之越来越多的网站,管理起来就更麻烦。docker就是完美解决了这个问题,他把我运行的每一个网站都放在一个独立的小盒子里,docker不是容器,而是管理容器的东西,很多人会搞混这两个概念。
服务器上的docker安装
大部分的 centen OS
和
liunx
安装的教程大家可以很轻松的搜索到,所以我就直接上服务器的安装了(win10有个坑,最好建议不要在win10下装,你不买服务器,开个虚拟机也好)
介绍一下基本命令(下面的都是在腾讯的服务器上实现的):
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
就能到下面的情形:
现在我们就来进入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,下载最多的就是了:
然后直接找 Tag 选择你的版本,然后就可以直接复制后面的命令进行镜像的拉取:
拉取镜像
docker pull XXX # 选择你拉取的版本
docker pull -a XXX # 拉取所有的版本
把远端的镜像保存到本地,如果你是使用的 docker search XXX
的话,搜索结果会有多个版本,你要根据你自己的要求选择版本,要是不知道的话可以直接拉取,默认是安装最新的版本:
我们试着来pull一下--ok
当然也可以在docker.hub中的tag命令复制下来安装,使用images查看当前的mysql的所有镜像可以看到一个5.7和一个最新版本。
查看安装完成的镜像
docker image -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
docker images --digests :显示镜像的摘要信息;
docker images -f :显示满足条件的镜像;
docker images --format :指定返回值的模板文件;
docker images --no-trunc :显示完整的镜像信息;
docker images -q :只显示镜像ID。
上面这么多是最全的,但是就使用一个 docker images
就够用了:
这里就是我们的全部镜像文件。
创建容器(运行镜像)
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
使用工具看看是否连接上:
测试成功!
接下来我们讲解一下这里面的基本命令含义:
-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
docker run -d -p'80:80' -p'13306:3306' --name=labs acgpiano/sqli-labs
这里的p指的是启动的端口,映射了两个端口,一个是Apache服务的,一个是mysql服务的,#13306是宿主机端口,3306是容器中的端口
查看运行的docker:
我顺便删了我们的mysql服务,不然端口冲突了
访问网站的80端口:
成功使用!
现在我们进入sqli-labs的容器
docker exec -it 容器的号 /bin/bash # 进入某个容器的shell
Ctrl + P + Q #退出但是不关闭容器,直接使用excit的话是会直接关闭
sqli-labs的配置文件在 /var/www/html
里,我们cd进去:
后续的所有操作你可以按照你的喜好来做
这是我对docker的一点理解,可能会有一些错误,希望表哥们看到后能够告诉我一下,还有就是!转载一定要注明出处!