Docker第四章:Dockerfile、微服务、网络连接、compose容器编排、容器监控
Dockerfile
是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本、
执行流程
1:docker从基础镜像运行一个容器
2:执行一条指令并对容器作出修改
3:执行类似docker commit的操作提交一个新的镜像层
4:docker再基于刚提交的镜像运行一个新容器
5:执行dockerfile中的下一条指令直到所有指令都执行完成
保留字简介
FROM:基础镜像,当前镜像是基于哪个镜像的,指定一个已存在的镜像作为base,第一行必须是FROM
MAINTAINER:镜像维护者的姓名和邮箱
RUN:docker build时运行
shell格式——等同于在终端操作的shell命令,如RUN yum -y insatll vim
exec格式——RUN ["./test.php", "dev", "offline"]等价于RUN ./test.php dev offine
EXPOSE:当前容器对外暴露的端口
WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录
USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是root
ENV:用来在构建镜像过程中设置环境变量,例如下
ENV MY_PATH /usr/mytest——定义
WORKDIR $MY_PATH——即WORKDIR /usr/mytest
ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY:类似ADD,拷贝文件和目录到镜像中
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:docker run时运行,指定容器启动后要干的事情,语法与RUN相似,分shell与exec
注意点:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
例图中57800e5b1cbf为tomcat镜像,被run后的/bin/bash参数所覆盖,因此导致服务启动失败
ENTRYPOINT:与CMD类似,但是ENTRYPOINT不会被docker run之后的命令覆盖,而且这些命令参数会被当作参数传给ENTRYPOINT指令指定的程序
dockerfile例子学习——配一个vim+ifconfig+jdk对应环境
1:docker pull docker pull centos:7.6.1810
2:下一个jdk版本——jdk-8u351-linux-x64.tar.gz
3:新建dockerfile文件
FROM centos:7.6.1810 MAINTAINER zyt<zyt@126.com> ENV MYPATH /usr/local WORKDIR $MYPATH #安装vim编辑器 RUN yum -y install vim #安装ifconfig命令查看网络IP RUN yum -y install net-tools #安装java8及lib库 RUN yum -y install glibc.i686 RUN mkdir /usr/local/java #ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置 ADD jdk-8u351-linux-x64.tar.gz /usr/local/java/ #配置java环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_351 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH EXPOSE 80 CMD echo $MYPATH CMD echo "success--------------ok" CMD /bin/bash
4:执行docker build -t centosjava8:1.5 .
5:docker run -it 镜像id——运行容器实例进行验证
Docker部署微服务
1:通过IDEA新建一个普通微服务模块——具体流程参考相应流程,内部对外端口设置为6060,将maven package后的包放到docker服务器中
2:新建Dockerfile
# 基础镜像使用java FROM java:8 # 作者 MAINTAINER zzyy # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp VOLUME /tmp # 将jar包添加到容器中并更名为zzyy_docker.jar ADD helloworld-0.0.1-SNAPSHOT.jar zzyy_docker.jar # 运行jar包 RUN bash -c 'touch /zzyy_docker.jar' ENTRYPOINT ["java","-jar","/zzyy_docker.jar"] #暴露6001端口作为微服务 EXPOSE 6060,
3:docker build -t zzyy_docker:1.6 .
4:docker run -p 6060:6060 ac285be59dde
5:登录对应IP:6060/对应路由
docker网络
Docker服务默认会创建一个docker0网桥(其中有一个docker0内部接口),该桥接网络的名称为docker0。它在内核层连通了其它的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP和子网掩码,让主机和容器之间可以通过网桥相互通信。
docker network ls
bridge模式:使用--network bridge指定,默认使用docker0
host模式:使用--network host指定
container模式:使用--network container:NAME或者容器ID指定
none模式:使用--network none指定
docker自定义网络
1:docker network create zyt_network——新开一个终端,建一个network
2:docker run -d -p 8081:8080 --network zyt_network --name tomcat81 billygoo/tomcat8-jdk8;docker run -d -p 8082:8080 --network zyt_network --name tomcat82 billygoo/tomcat8-jdk8
3:docker exec -it tomcat81 bash;docker exec -it tomcat82 bash
4:在tomcat81与tomcat82中输入ip addr,获得以下两图
5:在tomcat1中ping 172.19.0.2与ping tomcat2都成功;反之在tomcat2中ping tomcat1也成功
Docker-Compose
是Docker官方的开源项目,负责实现对Docker容器集群的快速编排,新版本的Docker会自带Docker-Compose
配置常用字段
常用命令
Portainer(轻量级监控)
一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境
CIG容器重量级监控(CAdvisor+InfluxDB+Granfana)
CAdvisor:一个容器资源监控工具,包括容器的内存,CPU,网络IO,磁盘IO等监控,同时提供了一个WEB页面用于查看容器的实时运行状态。CAdvisor默认存储2分钟数据,而且只是针对单物理机
InfluxDB:时序数据库,专门用于存储时序相关数据,很适合存储CAdvisor数据
Granfana:一个开源的数据监控分析可视化平台,支持多数据源配置