docker



 

下面再运行$ sudo docker run -d apache2命令来启动运行apachecontainer,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\8(_0U~)2USF[SAH1[6XX{XX.png

说明:这条命令是在这个镜像上运行一个容器。

 

再运行sudo docker logs \
9d4d3566e55c0b8829086e9be2040751017989a47b5411c9c4f170ab865afcef 
命令,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\U0DPO}799_H~WFYKPBIEN8J.png

说明:这条命令是查看指定docker容器的运行日志。

 

再运行sudo docker inspect –format=’{{.NetworkSetting.IPAddress}}’\   9d4d3566e55c0b8829086e9be2040751017989a47b5411c9c4f170ab865afcef命令,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\@XO[7C[%1$IG}9FC8U3FQ[1.png

说明:这条命令是查看当前docker容器被分配的ip地址,以便后续浏览器访问时使用

 

最后在浏览器中输入地址http://172.17.0.13访问apache的见面:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\~U{G{67YFJS3L@U9OZ04LVW.png

从最终的结果可以看到从docker中运行的apache已经成功启动,并且可以运行访问了。

Docker的高级部分

(一)Docker-machine

简介

在传统方式下构建docker环境你需要在你电脑上下载并安装一个docker引擎。这样既费时也费力,而docker-machine的出现使这件事情变的很轻松了。Docker machine 能够在你自己的电脑上,云环境上和数据中心里构建自己的Docker 主机(Docker host)。这构建出的docker主机里面已经自动包含了docker 引擎(Docker Engine) 和配置好的docker 客户端(Docker client)

Docker-machine的安装和使用
  1. 接下来讲一下docker machinelinux上的安装

首相讲一下docker machineLinux系统上的安装方式:

   运行如下命令即可:

$ curl -L https://github.com/docker/machine/releases/download/v0.5.3/docker-machine_linux-amd64 >/usr/local/bin/docker-machine && \

chmod +x /usr/local/bin/docker-machine

   说明:运行chmod +x /usr/local/bin/docker-machine命令来修改文件的可执行权限。安装完docker-machine文件我们还要下载virtual-box并安装到linux系统上,因为docker-machie核心的一部分是依靠virtualBox虚拟机的,它每创建一个machine就是创建了一个virtualbox的虚拟机然后docker引擎在这个虚拟机上运行的。

 

1.运行docker-machine create 命令:

$sudo docker-machine create –d virtualbox another2

说明: C:\Users\Administrator\Desktop\6WT_0ZW2F4QP~NK6GSBRZ@1.png

说明:这条命令是说创建了一个名称为another2的虚拟机,使用的内核是virtualbox

2.运行:docker-machine env another2命令来查看another2的环境变量

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\1A6P75`I}Y(~WN35%WSU}%B.png

 

3.运行:docker-machine ssh another命令连接到another

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\POG$0G)M5{$KK)_S`@WTMVN.png

接下来操作新建的docker-machine就像操作一个有了docker enginelinux系统一样。

二 讲一下docker-machinewindows上的安装,这个安装相对来说比较简单。去官网上直接下载docker-tools,然后直接一步一步安装就可以了。Docker-tools包含了docker-machinedocker-compose。安装完成后桌面上会出现Docker Quickstart Terminal的快捷方式图标。双击它之后会打开docker-tools的终端,如下图:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\VRGEM@A]F}PX280[BCHTILU.png

 

剩下的部分和上面的是一样的这里就不再重复了。

()Docker-swarm

简介:

docker-swarmdocker集群的构建和管理工具,docker swarm提供了本地的集群能力把一组docker单点服务器组成一台超级的虚拟docker服务器。可以用swarm来管理这个超级的docker服务器,可以把最后的应用部署到这个超级docker服务器上。下面就讲一下docker swarm的部署过程,docker swarm集群的部署方式有多种,这里讲一种最最简单的部署方式,这种方式产环境有一定的局限性,这里使用的而是docker-machine来部署:

Docker-swarm的安装和使用

第一步,查询当前环境中有的docker-machine

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\YPQ)[LQ[RMGVF(UVOC_941T.png

 

 

第二步:创建一个名字为localdocker-machine

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\U$(R}[~52A[PX%[6ME[QU]L.png

 

第三步:给docker-machine设置环境变量:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\8TXVL69$C%$@ZBMJRHM`(R1.png

 

第四步:在docker-hub上下载swarm镜像,来管理docker集群:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\$1OJ9P_FOV%SZ@}2(UF(6MN.png

 

第五步:创建docker-swarm管理节点,命令格式如下:

docker-machine create \
        -d virtualbox \
        --swarm \
        --swarm-master \
        --swarm-discovery token://<TOKEN-FROM-ABOVE> \
        swarm-master

这里的token-from-abovefe0cc96a72cf04dba8c1c4aa79536ec3

 

 

 

 

 

 

运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\`H9E8$4OL[)I1`K~N}FQQT5.png

这样docker-swarm master节点创建成功。

 

第六步:创建一个docker-swarm的节点docker-node,命令格式如下,这里我们创建两个节点agent-00,agent01

   docker-machine create \
    -d virtualbox \
    --swarm \
    --swarm-discovery token://<TOKEN-FROM-ABOVE> \
 swarm-agent-00

运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\Y]FG8YLDS@QS4_3]52S%P~K.png

表示docker-agent00节点创建成功,docker-agent01的节点创建步骤和docker-agent00的方式相同。经过这六步docker-swarm集群创建成功,它本身包含一个docker-master和两个节点,分别是docker-agent-00docker-agent-01这两个节点。

 

 

 

 

 

 

 

 

 

 

 

 

下面我们运行一下docker info命令来查看一下docker-swarm的详细信息。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\9J{[[H2ZINYJ`DK{MA}C6FB.png

可以看到这三个节点的信息都显示在这里了。

()Docker-compose

简介:

一个分布式系统是由很多在一起工作的小应用组成的。Docker把这些应用转换成单独的容器并且把他们连接到一起。为了更加方便的创建和管理这些container而产生了docker compose。在没有docker compose之前每个容器都是单独手动创建的。而docker compose可以更加方便的通过单个文件来生产,组装和运行这些。所以只要你有这个docker compose的配置文件就可以在任何时间,任何地点和任何环境来构建你的服务。

docker compose的安装和使用

第一步先下载docker-compose安装文件,运行如下命令:

curl -Lhttps://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

第二步修改可执行目录的运行权限:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\$BCN2A{B{[8F)(A9%[GW$LX.png

第三步运行docker-compose --version命令来查看docker-compse的当前版本。如果运行成功说明docker-compose安装成功,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\G9NR}2[0I[%}V3[5Z4BQVM6.png

接下来我们使用docker-compose来构建一个基于Pythonweb应用,后天数据库用的是redis

第一步我们先创建一个叫composetest的目录,然后进入这个目录构建项目,运行如下命令:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\UHNVT`EJWQUG8@A09{0C0AC.png

 

第二步在你的工程目录中创建app.py文件,文件内容如下:

from flask import Flask
from redis import Redis
 
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
 
@app.route('/')
defhello():
    redis.incr('hits')
    return'Hello World! I have been seen %s times.' % redis.get('hits')
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
 
第三步再创建另个文件名叫requirements.txt文件内容如下:
flask
redis
说明:这两个文件都是运行python环境需要的文件,和docker环境无关,所以这里不做详细介绍,照做就可以了。
 
第四步通过dockerfile来构建一个docker镜像,需要创建一个dockerfile内容如下:
FROM python:2.7
ADD . /code
WORKDIR/code
RUNpip install -r requirements.txt
CMDpython app.py
说明:FROM python:2.7安装python:2.7镜像,
      ADD . /code 这个是添加 code文件夹 
      WORKDIR /code是把当前的工作目录移动到/code目录下
      RUNpip install -r requirements.txt 这个命令是吧requirement.txt中包含的软件安装到本地环境中。这里使用的安装工具是pip,如果在您的本机linux环境中没有需要另行安装。
      CMDpython app.py 这个命令是用python环境来编译app.py脚本。
 
第五步通过运行命令来构建容器:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\@KNX9R29ZRWQ(6`8J3X22)X.png

说明:构建的容器名称叫web利用当前目录下的dockerfile文件来构建的。
 
第六步定义服务
下面在我们的工程目录中定义一个docker-compose.yml文件内容如下:
web:
  build: .
  ports:
   -"5000:5000"
  volumes:
   - .:/code
  links:
   - redis
redis:
  image: redis
说明:这里构建了两个服务webredisbuild .表示利用当前目录的dockerfile来构建服务。Posts: -“5000:5000”表示对外开发的端口号为5000,volumes表示共享的容器卷轴是/code路径。Links:-redis是表示和redis镜像做链接,images:redis表示从docker hub上下载redis镜像。
 
第七步使用compose来构建和运行你的应用
运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\1W_5]X%Q@(])}SD0{4MR5NM.png

说明:这里使用docker-compose up命令还构建service环境,在构建过程中会用到docker-compose.yml文件。

 

第八步查看已经构建好的进程

使用docker-compose ps命令查看构件好的服务:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\[}(OP%L0C[GR2OXPQ1MG86N.png

能看到如图所示的结构,证明两个服务构建成功了。

Docker的应用部分

简介:

这章我们使用docker来搭建一个简单的应用,来更深入的理解dacker知识。这个应用就是使用nginx+tomcat-redis来实现负载均衡和session共享。并且把这个应用部署到dockerimage中,以方便后续的使用。下面介绍一下整体的实现思路:

先从docker hub上下载一个最新的ubuntu镜像文件,然后通过加载容器(container)进入到这个镜像(image)当中。进入到image当中后,后续的操作就和在linux中的操作完全相同。在这个过程中,通过-p参数来指定容器(container)Linux主机(docker host)之间的端口对应关系,通过这种设定就可以达到你在外部访问Linux主机的IP+端口号,就能自动的映射到容器的IP+端口号所对应的服务,并且可指定多个对应关系。通过-v可以指定Linux主机的目录和容器的目录对应关系,这种设定可以很好的实现docker主机和容器内部的文件共享。只要在一方改变对应目录内的内容,另一边的目录内容也会随着改变。下面详细介绍一下:

应用搭建:

第一步:下载最新的ubuntu镜像文件:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\(C`AHX(]N{1S8L033VWB%{F.png

说明:因为这里已经有ubuntu的镜像文件,所以直接下载最新的。如果没有会在docker hub上下载。

 

 

第二步:通过容器登录到ubuntu镜像中,并且在目录中创建一个shareDir目录,这个目录用于和linux主机的目录共享,所以同时在linux主机根目录下也创建一个shareDir目录:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\`N`TKTLO1(A09FHLE2XP3PC.png

 

第三步:通过docker ps –a 命令查询刚才关闭的container,这步的作用是通过container id 来把刚才的操作提交到ubuntu:latest镜像文件中,来更新镜像文件。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\@]KP11%{QQ`~[~)6)~(@_8N.png

 

第四步:通过docker commit 命令和container id来修改镜像文件。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\M`OA@RE[XJ7H6OANKQ)M6N5.png

 

第五步:通过命令再次打开ubuntu:latest镜像,可以看到新创建的shareDir目录已经保存到了镜像中:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\OGJ@IZ07%PHCKL)X9[XA[{K.png

 

第六步:再次通过命令打开ubuntu:latest镜像,在打开的过程中通过-p参数指定端口的映射关系这里指定Linux主机的8889端口和容器的80端口相对应,指定Linux主机的8082端口和容器的8080端口相对应,这样通过Linux主机的ip+端口:8889号就可以访问容器内80端口号对应的服务。所以访问8082端口号就可以访问8080端口号对应的服务。-v /shareDir/:/shareDir/ 指定了linux服务器的/shareDir/路径和容器的/shareDir/路径相对应。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\6@FQ]FR2(T@2B]Z{@M5}[MO.png

docker主机(docker host)shareDir目录下创建demo文件

 

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\EHQ@KZA7[XQ(QD_SRUFKB1T.png

通过容器(container)进入到dacker镜像(image)中,在shareDir目录下也能看见Demo文件。这就实现了docker镜像(image)docker主机(host)之间共享一个文件夹。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\5]_HT6O7LW5DU7DU26%97}7.png

第七步:下面讲一下在container中构建nginx,首先先更新本地的apt-get库来获得最新的库文件。

 

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\~~)L8U81WQYLY))YDD}1H}U.png

在通过apt-get install nginx命令来安装nginx程序。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\M@G0I1[2`E_L4`CA@H7B4@3.png

再运行nginx start命令来启动服务

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\$`K5LV}8Q$HZERO(LXY6}WC.png

接下来安装wget,通过apt-get install wget命令

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\)1ITI96{LJQ)SRQQ]GXKJ`Q.png

接下来我在容器内部通过wget命令来访问nginx的默认页面:命令为

Wget http://localhost/

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\O74FURY@ZE)MKW[YC)I6JHK.png

可以看到已经可以访问到镜像容器(image container)内的nginx服务,证明服务已经正常启动。

第八步:接下来我们查看一下容器(container)IP地址:

首先我们先通过docker ps命令来查询当前正在运行的container容器结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\I@9}V~SJ0FCT@}E]DVA3`84.png

从查询的结果中可以看到,当前只有一个容器(container)在运行。可以看到已经映射的端口8889->80协议是tcp协议和8082->8080协议是tcp协议。

接下来通过docker inspect + container id命令来查看docker 镜像的详细信息,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\ONBBW@D7%%Y[0RWBJKMKTPY.png

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\TVS88RH)P(IO001V00MNJW5.png

从上面的结果可以看到分配给容器(container)IP172.17.0.1,下面我们在linux主机(docker host)内通过172.17.0.1:80的地址来访问nginx服务看一下效果。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\_]E13TPI@1N]Q_`5I1L~(58.png

下面我们再看一下在linux主机外部通过8889端口来访问docker容器内服务的示例:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\JH0[~Q5M77~8O`Z8KJTM2CF.png

可以看到因为linux主机(docker host)ip192.168.56.146,所以访问地址是http://192.168.56.146:8889/可以成功访问容器内的服务。

第九步:再部署一个tomcat服务和jdk通过8082端口可以访问服务

先在linux主机把apache-tomcat包和jdk包拷贝到共享的shareDir目录下,这样在docker容器内也能看到这两个包

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\K58{CV_K}S6GWOGK}(ICCDB.png

 

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\@2[HSH}NQNRH}M@O_A_O5J0.png

 

    接下来在容器(container)内的usr目录下创建tomcat目录和java目录,然后把这两个包分别解压缩到这两个目录下。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\}[R6D5{8R8F3]5]GCG{8FVE.png

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\H3`OZ49}ABVHBA__UW2H_K5.png 说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\V~HII2LQHX_LUAZ8U7QHHA8.png

etc/profile文件中添加如下配置,来配置linuxjava环境变量:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\%[TU]R3VH84]TBKB_N$BRIO.png

添加完以后再linux主机根目录下执行. /etc/profile命令来使得当前的配置生效,然后再执行java –version命令可以查看当前运行的java的版本。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\)S21XM(3}X@4NU6)DQPP0V0.png

然后进入到tomcat目录下执行bin/startup.sh命令来启动tomcat服务。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\54B5FU`PLAX4GFUJ8)4XZ68.png

通过wget命令查看服务是否启动成功,wget http://localhost:8080/

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\5`YZW{(8IA`ETMYHCF$U0)F.png

可以看到服务已经启动成功,下面在linux主机(docker host)内通过容器的ip+端口号来访问容器内的服务:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\Y0BAIY}8{Y)O[LE)PKP)C)X.png

下面通过映射出来的端口在linux主机(docker host)外访问容器内的服务:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\IH67A2H7$2BFXU0{S4K$@Y5.png

可以看到通过映射出来的端口号是8082,通过http://192.168.56.146:8082就可以访问到容器(container)内的服务。

 

第九步:结束

8082

 

8889

 
     通过上面的例子可以看到已经成功的建立了容器的两个端口和linux主机的两个端口的对应关系,在Linux主机外部通过这两个端口就可以访问容器内的服务,大家也能看到在容器内部构建服务的过程和在Linux构建服务的过程是一致的。所以关于后续构建负载均很的过程和tomcatsession共享的过程可以参考我以前写的相关文档,执行步骤只要和文档内完全相同就没有问题。构建后的系统架构图如下:



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


构建完这个系统后不要忘记命令docker commit把新构建的container提交到ubuntu:latest镜像文件中,以保存当前的修改。命令格式为docker commit + container id

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\7ZP@0Z@$NF}0KE0FZBQIA7E.png

这样就保存到了原来的镜像里面了。

    但是这种把所有服务都安装到一个docker 容器中的做法是不科学的,正确的做法是把不同的服务安装到不同的docker容器中,然后使用Link的方式把这些docker容器都连接起来。这样的做法即增加了服务的稳定性也增加了服务的安全性,我会在后续的文档中把这种搭建方式补充上。按照这种方式部署完以后,这个系统架构图是这样的:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


总结

    本文档在最开始介绍了一些docker的基础知识,其中包括docker的安装、docker容器和镜像的创建、通过dockerfile来构建一个简单的apache服务。接下来介绍的docker的高级部分,首先是docker-machine,包括安装docker-machine,可以使用docker-machine来安装具有docker环境的虚拟机,达到快速部署的目的。然后是docker-swarm,介绍了通过docker-machine来构建docker-swarm集群,构建的docker-swarm集群可以对这些docker-machine节点进行管理。最后讲了docker-compose,这个是一个批量化构建docker容器的工具,讲了它的一般使用。同时也可以通过docker-compose来操作docker集群。Docker-compose操作docker集群的方法是先登录到docker集群的管理节点上,然后创建docker-compose.yml文件。之后再执行docker-compose up命令,这样在docker-compose.yml中配置的docker容器会自动安装到集群中的节点中。这样就可以节省了很多单个节点安装所浪费的时间。最后通过一个案例讲解了怎样在docker容器内部搭建不同服务和并且通过外网可以访问。

 

下面再运行$ sudo docker run -d apache2命令来启动运行apachecontainer,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\8(_0U~)2USF[SAH1[6XX{XX.png

说明:这条命令是在这个镜像上运行一个容器。

 

再运行sudo docker logs \
9d4d3566e55c0b8829086e9be2040751017989a47b5411c9c4f170ab865afcef 
命令,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\U0DPO}799_H~WFYKPBIEN8J.png

说明:这条命令是查看指定docker容器的运行日志。

 

再运行sudo docker inspect –format=’{{.NetworkSetting.IPAddress}}’\   9d4d3566e55c0b8829086e9be2040751017989a47b5411c9c4f170ab865afcef命令,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\@XO[7C[%1$IG}9FC8U3FQ[1.png

说明:这条命令是查看当前docker容器被分配的ip地址,以便后续浏览器访问时使用

 

最后在浏览器中输入地址http://172.17.0.13访问apache的见面:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\~U{G{67YFJS3L@U9OZ04LVW.png

从最终的结果可以看到从docker中运行的apache已经成功启动,并且可以运行访问了。

Docker的高级部分

(一)Docker-machine

简介

在传统方式下构建docker环境你需要在你电脑上下载并安装一个docker引擎。这样既费时也费力,而docker-machine的出现使这件事情变的很轻松了。Docker machine 能够在你自己的电脑上,云环境上和数据中心里构建自己的Docker 主机(Docker host)。这构建出的docker主机里面已经自动包含了docker 引擎(Docker Engine) 和配置好的docker 客户端(Docker client)

Docker-machine的安装和使用
  1. 接下来讲一下docker machinelinux上的安装

首相讲一下docker machineLinux系统上的安装方式:

   运行如下命令即可:

$ curl -L https://github.com/docker/machine/releases/download/v0.5.3/docker-machine_linux-amd64 >/usr/local/bin/docker-machine && \

chmod +x /usr/local/bin/docker-machine

   说明:运行chmod +x /usr/local/bin/docker-machine命令来修改文件的可执行权限。安装完docker-machine文件我们还要下载virtual-box并安装到linux系统上,因为docker-machie核心的一部分是依靠virtualBox虚拟机的,它每创建一个machine就是创建了一个virtualbox的虚拟机然后docker引擎在这个虚拟机上运行的。

 

1.运行docker-machine create 命令:

$sudo docker-machine create –d virtualbox another2

说明: C:\Users\Administrator\Desktop\6WT_0ZW2F4QP~NK6GSBRZ@1.png

说明:这条命令是说创建了一个名称为another2的虚拟机,使用的内核是virtualbox

2.运行:docker-machine env another2命令来查看another2的环境变量

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\1A6P75`I}Y(~WN35%WSU}%B.png

 

3.运行:docker-machine ssh another命令连接到another

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\POG$0G)M5{$KK)_S`@WTMVN.png

接下来操作新建的docker-machine就像操作一个有了docker enginelinux系统一样。

二 讲一下docker-machinewindows上的安装,这个安装相对来说比较简单。去官网上直接下载docker-tools,然后直接一步一步安装就可以了。Docker-tools包含了docker-machinedocker-compose。安装完成后桌面上会出现Docker Quickstart Terminal的快捷方式图标。双击它之后会打开docker-tools的终端,如下图:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\VRGEM@A]F}PX280[BCHTILU.png

 

剩下的部分和上面的是一样的这里就不再重复了。

()Docker-swarm

简介:

docker-swarmdocker集群的构建和管理工具,docker swarm提供了本地的集群能力把一组docker单点服务器组成一台超级的虚拟docker服务器。可以用swarm来管理这个超级的docker服务器,可以把最后的应用部署到这个超级docker服务器上。下面就讲一下docker swarm的部署过程,docker swarm集群的部署方式有多种,这里讲一种最最简单的部署方式,这种方式产环境有一定的局限性,这里使用的而是docker-machine来部署:

Docker-swarm的安装和使用

第一步,查询当前环境中有的docker-machine

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\YPQ)[LQ[RMGVF(UVOC_941T.png

 

 

第二步:创建一个名字为localdocker-machine

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\U$(R}[~52A[PX%[6ME[QU]L.png

 

第三步:给docker-machine设置环境变量:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\8TXVL69$C%$@ZBMJRHM`(R1.png

 

第四步:在docker-hub上下载swarm镜像,来管理docker集群:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\$1OJ9P_FOV%SZ@}2(UF(6MN.png

 

第五步:创建docker-swarm管理节点,命令格式如下:

docker-machine create \
        -d virtualbox \
        --swarm \
        --swarm-master \
        --swarm-discovery token://<TOKEN-FROM-ABOVE> \
        swarm-master

这里的token-from-abovefe0cc96a72cf04dba8c1c4aa79536ec3

 

 

 

 

 

 

运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\`H9E8$4OL[)I1`K~N}FQQT5.png

这样docker-swarm master节点创建成功。

 

第六步:创建一个docker-swarm的节点docker-node,命令格式如下,这里我们创建两个节点agent-00,agent01

   docker-machine create \
    -d virtualbox \
    --swarm \
    --swarm-discovery token://<TOKEN-FROM-ABOVE> \
 swarm-agent-00

运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\Y]FG8YLDS@QS4_3]52S%P~K.png

表示docker-agent00节点创建成功,docker-agent01的节点创建步骤和docker-agent00的方式相同。经过这六步docker-swarm集群创建成功,它本身包含一个docker-master和两个节点,分别是docker-agent-00docker-agent-01这两个节点。

 

 

 

 

 

 

 

 

 

 

 

 

下面我们运行一下docker info命令来查看一下docker-swarm的详细信息。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\9J{[[H2ZINYJ`DK{MA}C6FB.png

可以看到这三个节点的信息都显示在这里了。

()Docker-compose

简介:

一个分布式系统是由很多在一起工作的小应用组成的。Docker把这些应用转换成单独的容器并且把他们连接到一起。为了更加方便的创建和管理这些container而产生了docker compose。在没有docker compose之前每个容器都是单独手动创建的。而docker compose可以更加方便的通过单个文件来生产,组装和运行这些。所以只要你有这个docker compose的配置文件就可以在任何时间,任何地点和任何环境来构建你的服务。

docker compose的安装和使用

第一步先下载docker-compose安装文件,运行如下命令:

curl -Lhttps://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

第二步修改可执行目录的运行权限:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\$BCN2A{B{[8F)(A9%[GW$LX.png

第三步运行docker-compose --version命令来查看docker-compse的当前版本。如果运行成功说明docker-compose安装成功,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\G9NR}2[0I[%}V3[5Z4BQVM6.png

接下来我们使用docker-compose来构建一个基于Pythonweb应用,后天数据库用的是redis

第一步我们先创建一个叫composetest的目录,然后进入这个目录构建项目,运行如下命令:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\UHNVT`EJWQUG8@A09{0C0AC.png

 

第二步在你的工程目录中创建app.py文件,文件内容如下:

from flask import Flask
from redis import Redis
 
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
 
@app.route('/')
defhello():
    redis.incr('hits')
    return'Hello World! I have been seen %s times.' % redis.get('hits')
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
 
第三步再创建另个文件名叫requirements.txt文件内容如下:
flask
redis
说明:这两个文件都是运行python环境需要的文件,和docker环境无关,所以这里不做详细介绍,照做就可以了。
 
第四步通过dockerfile来构建一个docker镜像,需要创建一个dockerfile内容如下:
FROM python:2.7
ADD . /code
WORKDIR/code
RUNpip install -r requirements.txt
CMDpython app.py
说明:FROM python:2.7安装python:2.7镜像,
      ADD . /code 这个是添加 code文件夹 
      WORKDIR /code是把当前的工作目录移动到/code目录下
      RUNpip install -r requirements.txt 这个命令是吧requirement.txt中包含的软件安装到本地环境中。这里使用的安装工具是pip,如果在您的本机linux环境中没有需要另行安装。
      CMDpython app.py 这个命令是用python环境来编译app.py脚本。
 
第五步通过运行命令来构建容器:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\@KNX9R29ZRWQ(6`8J3X22)X.png

说明:构建的容器名称叫web利用当前目录下的dockerfile文件来构建的。
 
第六步定义服务
下面在我们的工程目录中定义一个docker-compose.yml文件内容如下:
web:
  build: .
  ports:
   -"5000:5000"
  volumes:
   - .:/code
  links:
   - redis
redis:
  image: redis
说明:这里构建了两个服务webredisbuild .表示利用当前目录的dockerfile来构建服务。Posts: -“5000:5000”表示对外开发的端口号为5000,volumes表示共享的容器卷轴是/code路径。Links:-redis是表示和redis镜像做链接,images:redis表示从docker hub上下载redis镜像。
 
第七步使用compose来构建和运行你的应用
运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\1W_5]X%Q@(])}SD0{4MR5NM.png

说明:这里使用docker-compose up命令还构建service环境,在构建过程中会用到docker-compose.yml文件。

 

第八步查看已经构建好的进程

使用docker-compose ps命令查看构件好的服务:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\[}(OP%L0C[GR2OXPQ1MG86N.png

能看到如图所示的结构,证明两个服务构建成功了。

Docker的应用部分

简介:

这章我们使用docker来搭建一个简单的应用,来更深入的理解dacker知识。这个应用就是使用nginx+tomcat-redis来实现负载均衡和session共享。并且把这个应用部署到dockerimage中,以方便后续的使用。下面介绍一下整体的实现思路:

先从docker hub上下载一个最新的ubuntu镜像文件,然后通过加载容器(container)进入到这个镜像(image)当中。进入到image当中后,后续的操作就和在linux中的操作完全相同。在这个过程中,通过-p参数来指定容器(container)Linux主机(docker host)之间的端口对应关系,通过这种设定就可以达到你在外部访问Linux主机的IP+端口号,就能自动的映射到容器的IP+端口号所对应的服务,并且可指定多个对应关系。通过-v可以指定Linux主机的目录和容器的目录对应关系,这种设定可以很好的实现docker主机和容器内部的文件共享。只要在一方改变对应目录内的内容,另一边的目录内容也会随着改变。下面详细介绍一下:

应用搭建:

第一步:下载最新的ubuntu镜像文件:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\(C`AHX(]N{1S8L033VWB%{F.png

说明:因为这里已经有ubuntu的镜像文件,所以直接下载最新的。如果没有会在docker hub上下载。

 

 

第二步:通过容器登录到ubuntu镜像中,并且在目录中创建一个shareDir目录,这个目录用于和linux主机的目录共享,所以同时在linux主机根目录下也创建一个shareDir目录:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\`N`TKTLO1(A09FHLE2XP3PC.png

 

第三步:通过docker ps –a 命令查询刚才关闭的container,这步的作用是通过container id 来把刚才的操作提交到ubuntu:latest镜像文件中,来更新镜像文件。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\@]KP11%{QQ`~[~)6)~(@_8N.png

 

第四步:通过docker commit 命令和container id来修改镜像文件。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\M`OA@RE[XJ7H6OANKQ)M6N5.png

 

第五步:通过命令再次打开ubuntu:latest镜像,可以看到新创建的shareDir目录已经保存到了镜像中:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\OGJ@IZ07%PHCKL)X9[XA[{K.png

 

第六步:再次通过命令打开ubuntu:latest镜像,在打开的过程中通过-p参数指定端口的映射关系这里指定Linux主机的8889端口和容器的80端口相对应,指定Linux主机的8082端口和容器的8080端口相对应,这样通过Linux主机的ip+端口:8889号就可以访问容器内80端口号对应的服务。所以访问8082端口号就可以访问8080端口号对应的服务。-v /shareDir/:/shareDir/ 指定了linux服务器的/shareDir/路径和容器的/shareDir/路径相对应。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\6@FQ]FR2(T@2B]Z{@M5}[MO.png

docker主机(docker host)shareDir目录下创建demo文件

 

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\EHQ@KZA7[XQ(QD_SRUFKB1T.png

通过容器(container)进入到dacker镜像(image)中,在shareDir目录下也能看见Demo文件。这就实现了docker镜像(image)docker主机(host)之间共享一个文件夹。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\5]_HT6O7LW5DU7DU26%97}7.png

第七步:下面讲一下在container中构建nginx,首先先更新本地的apt-get库来获得最新的库文件。

 

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\~~)L8U81WQYLY))YDD}1H}U.png

在通过apt-get install nginx命令来安装nginx程序。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\M@G0I1[2`E_L4`CA@H7B4@3.png

再运行nginx start命令来启动服务

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\$`K5LV}8Q$HZERO(LXY6}WC.png

接下来安装wget,通过apt-get install wget命令

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\)1ITI96{LJQ)SRQQ]GXKJ`Q.png

接下来我在容器内部通过wget命令来访问nginx的默认页面:命令为

Wget http://localhost/

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\O74FURY@ZE)MKW[YC)I6JHK.png

可以看到已经可以访问到镜像容器(image container)内的nginx服务,证明服务已经正常启动。

第八步:接下来我们查看一下容器(container)IP地址:

首先我们先通过docker ps命令来查询当前正在运行的container容器结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\I@9}V~SJ0FCT@}E]DVA3`84.png

从查询的结果中可以看到,当前只有一个容器(container)在运行。可以看到已经映射的端口8889->80协议是tcp协议和8082->8080协议是tcp协议。

接下来通过docker inspect + container id命令来查看docker 镜像的详细信息,运行结果如下:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\ONBBW@D7%%Y[0RWBJKMKTPY.png

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\TVS88RH)P(IO001V00MNJW5.png

从上面的结果可以看到分配给容器(container)IP172.17.0.1,下面我们在linux主机(docker host)内通过172.17.0.1:80的地址来访问nginx服务看一下效果。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\_]E13TPI@1N]Q_`5I1L~(58.png

下面我们再看一下在linux主机外部通过8889端口来访问docker容器内服务的示例:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\JH0[~Q5M77~8O`Z8KJTM2CF.png

可以看到因为linux主机(docker host)ip192.168.56.146,所以访问地址是http://192.168.56.146:8889/可以成功访问容器内的服务。

第九步:再部署一个tomcat服务和jdk通过8082端口可以访问服务

先在linux主机把apache-tomcat包和jdk包拷贝到共享的shareDir目录下,这样在docker容器内也能看到这两个包

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\K58{CV_K}S6GWOGK}(ICCDB.png

 

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\@2[HSH}NQNRH}M@O_A_O5J0.png

 

    接下来在容器(container)内的usr目录下创建tomcat目录和java目录,然后把这两个包分别解压缩到这两个目录下。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\}[R6D5{8R8F3]5]GCG{8FVE.png

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\H3`OZ49}ABVHBA__UW2H_K5.png 说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\V~HII2LQHX_LUAZ8U7QHHA8.png

etc/profile文件中添加如下配置,来配置linuxjava环境变量:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\%[TU]R3VH84]TBKB_N$BRIO.png

添加完以后再linux主机根目录下执行. /etc/profile命令来使得当前的配置生效,然后再执行java –version命令可以查看当前运行的java的版本。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\)S21XM(3}X@4NU6)DQPP0V0.png

然后进入到tomcat目录下执行bin/startup.sh命令来启动tomcat服务。

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\54B5FU`PLAX4GFUJ8)4XZ68.png

通过wget命令查看服务是否启动成功,wget http://localhost:8080/

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\5`YZW{(8IA`ETMYHCF$U0)F.png

可以看到服务已经启动成功,下面在linux主机(docker host)内通过容器的ip+端口号来访问容器内的服务:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\Y0BAIY}8{Y)O[LE)PKP)C)X.png

下面通过映射出来的端口在linux主机(docker host)外访问容器内的服务:

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\IH67A2H7$2BFXU0{S4K$@Y5.png

可以看到通过映射出来的端口号是8082,通过http://192.168.56.146:8082就可以访问到容器(container)内的服务。

 

第九步:结束

8082

 

8889

 
     通过上面的例子可以看到已经成功的建立了容器的两个端口和linux主机的两个端口的对应关系,在Linux主机外部通过这两个端口就可以访问容器内的服务,大家也能看到在容器内部构建服务的过程和在Linux构建服务的过程是一致的。所以关于后续构建负载均很的过程和tomcatsession共享的过程可以参考我以前写的相关文档,执行步骤只要和文档内完全相同就没有问题。构建后的系统架构图如下:



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


构建完这个系统后不要忘记命令docker commit把新构建的container提交到ubuntu:latest镜像文件中,以保存当前的修改。命令格式为docker commit + container id

说明: C:\Users\Administrator\AppData\Roaming\Tencent\Users\176863120\QQ\WinTemp\RichOle\7ZP@0Z@$NF}0KE0FZBQIA7E.png

这样就保存到了原来的镜像里面了。

    但是这种把所有服务都安装到一个docker 容器中的做法是不科学的,正确的做法是把不同的服务安装到不同的docker容器中,然后使用Link的方式把这些docker容器都连接起来。这样的做法即增加了服务的稳定性也增加了服务的安全性,我会在后续的文档中把这种搭建方式补充上。按照这种方式部署完以后,这个系统架构图是这样的:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


总结

    本文档在最开始介绍了一些docker的基础知识,其中包括docker的安装、docker容器和镜像的创建、通过dockerfile来构建一个简单的apache服务。接下来介绍的docker的高级部分,首先是docker-machine,包括安装docker-machine,可以使用docker-machine来安装具有docker环境的虚拟机,达到快速部署的目的。然后是docker-swarm,介绍了通过docker-machine来构建docker-swarm集群,构建的docker-swarm集群可以对这些docker-machine节点进行管理。最后讲了docker-compose,这个是一个批量化构建docker容器的工具,讲了它的一般使用。同时也可以通过docker-compose来操作docker集群。Docker-compose操作docker集群的方法是先登录到docker集群的管理节点上,然后创建docker-compose.yml文件。之后再执行docker-compose up命令,这样在docker-compose.yml中配置的docker容器会自动安装到集群中的节点中。这样就可以节省了很多单个节点安装所浪费的时间。最后通过一个案例讲解了怎样在docker容器内部搭建不同服务和并且通过外网可以访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值