容器架构-Docker-03
今日内容:
-
一、容器自动化Dockerfile
手动自定义镜像,就像加工流水线,需要一直进行重复的操作:
需要使用Dockerfile来让它自动化运行
1.1 手动实现-创建tengine镜像
目标:先手动创建tengine镜像,了解流程
1.1.1 启动Ubuntu容器
1.1.2 配置apt源并安装软件
1.1.3 编译安装tengine
1.1.4 启动测试
1.1.5 清理镜像
1.1.6 生成镜像
1.1.7 运行容器(重要)
运行手动创建的自定义镜像注意事项:⭐
启动容器,要有个服务在前台阻塞住,自定义的容器中没有配置的,需要手动指定
启动容器
检查
1.1.8 日志重定向
目前自定义的容器日志存放在容器的/app/tools/tengine/logs/
目录中
关于日志的处理,有两种方案:
- 方案01 日志目录挂载到宿主机的某个目录中.
- 方法02 把日志软连接到/dev/stdout 和/dev/stderr中,未来可以通过docker logs 查看日志
这里采用方案二实现:
修改完需要重启容器
测试
1.2 Dockerfile介绍
1.2.1 Dockerfile的概述
应用场景:
- 通过1个文件Dockerfile,docker build可以自动化生成自定义镜像
为何使用Dockerfile:
- 我们目前都是手动拉取镜像,手动进行配置,手动安装依赖,手动编译安装,创建用户….,这个过程类似于命令行使用ansible模块(繁琐,不方便重复执行).
- 书写Dockerfile把之前手动创建自定义镜像的过程,通过Dockerfile里面的指令实现,类似于书写playbook.
1.2.2 Dockerfile格式
Dokerfile主要分为四部分:
- 指定基础镜像(FROM)
- 自定义镜像信息(LABLE)
- 对于镜像的处理指令(RUN)
- 容器启动后的入口命令(CMD)
1.2.3 使用dockerfile
创建Dockerfile并生成自动镜像
使用镜像运行容器
1.2.4 Dockerfile中的指令
开头部分
指令 |
含义 |
应用 |
建议 |
FROM |
指定基本镜像 |
FROM ubuntu:20.04 |
尽量少写ubuntu或ubuntu:latest,尽量指定具体的版本 |
LABEL |
用于指定容器的属性信息,作者,个人联系方式(邮件).. |
LABEL maintainer=”lidao996” |
推荐使用LABEL,不推荐使用下面的MAINTAINER |
MAINTAINER |
不再使用,推荐使用LABEL 个人信息 |
|
|
ENV |
用于创建Dockerfile中使用的变量 |
ENV Tengine_Version空格2.3.3 |
创建变量定义软件版本 |
中间部分
指令 |
含义 |
应用 |
建议 |
RUN |
制作镜像过程中需要的执行命令 |
RUN 系统命令即可 |
不建议使用连续多个RUN |
ADD |
把指定文件或目录拷贝到容器中(指定目录),会解压压缩包 |
ADD restart.tar.gz空格/app/code/restart/ |
拷贝压缩包 |
COPY |
把指定文件或目录拷贝到容器中(指定目录),不支持解压 |
CP nginx.conf空格/etc/nginx/nginx.conf |
拷贝文件或目录 |
WORKDIR |
指定 容器 的默认工作目录 |
WORKDIR /app/code/restart/ ADD restart.tar.gz空. |
一般配合ADD,COPY使用 |
VOLUME |
挂载数据卷 |
VOLUME /usr/share/nginx/html |
创建随机数据卷挂载容器的目录.未来推荐docker run的时候指定 -v即可. |
结尾部分
指令 |
含义 |
应用 |
建议 |
EXPOSE |
指定镜像要对外暴露的端口 |
EXPOSE 80 |
用于指定一个或多个容器的端口. 未来这个端口可以被-p 识别.xxxx:80 |
CMD |
指定容器的入口命令,入口命令可以在docker run的时候替换 |
CMD [“nginx”,”-g”,”daemon off;”] |
建议使用 |
ENTRYPOINT |
指定容器的入口命令,入口命令在不可以在docker run的时候替换 |
ENTRYPOINT [“executable”,”param1”, “param2”] |
使用不多 |
CMD和ENTRYPOINT的区别:
共同点:
- 运行容器的时候默认运行CMD或ENTRYPOINT后面的命令
区别:
- CMD:run的时候可以替换,如果指定了命令内容,cmd内容就会被替换
- ENTRYPOINT:run的时候无法替换,如果指定了命令内容,仅成为entrypoint命令的参数而已.
案例:
1.3 自动实现-创建Tengine镜像
目录准备
编写Dockerfile
运行Docerfile创建镜像
运行容器,并测试
1.4 案例
1.4.1 Dockerfile ENV使用变量
在Dockerfile中,可以使用ENV指令来定义变量,如
用变量的方法改写1.3的代码
构建
1.4.2 多服务镜像nginx+php
流程:
- 基础镜像:centos:7
- 配置yum源.
- 安装Nginx
- 安装php软件包
- 站点目录,传输代码.修改所有者
- 写CMD入口脚本(给权限,注意格式 )
编写Dockerfile
入口脚本文件
离线包ngx-dep-php72w.tar.gz
的获取方法
执行Dockerfile
测试运行
1.4.3 使用上面的镜像部署可道云
主配置文件
子配置文件
下载可道云源码
编写Dockerfile
现在总共是这些文件
运行Dockerfile
测试
浏览器访问:http://10.0.0.82:32775![image-20240529121302947](../../../img/image-20240529121302947.png)
里面要求连接数据库,连172.16.1.51添加用户即可
1.4.4 多阶段提交
目前使用多节点提交实现:
编译安装一些软件的时候,一般是先安装各种依赖,然后开始编译安装,编译安装一般会生成新的命令.
- 1个镜像负责编译安装,生成命令.(临时)
- 1个镜像上一个镜像的命令复制过来+服务必要的配置.
使用最后生成镜像,Dockerfile如下:
构建镜像
可见TEMP的镜像并没有image保存
运行容器
1.5 Dockerfile小结
生产环境应用建议 |
说明 |
尽量保证每个镜像功能单一 |
尽量避免多个服务运行在同一个镜像中. |
选择合适的基础镜像 |
不一定都要从头做(系统,ngx,tengine,tomcat,jdkՎՎʢ) |
注释与说明 |
添加一定的注释和镜像属性信息(LABEL) |
指定版本号 |
使用镜像的时候指定版本,nginx:latest php:latest nginx:1.20.2-alpine |
减少镜像层数/步骤 |
尽可能合并RUN,ADD,COPY |
记得收尾 |
清理垃圾,记得清理缓存,临时文件,压缩包…. |
合理使用.dockerignore |
构建的忽略的文件(了解),少传输些文件. |
未来应用的时候,镜像做好后存放在镜像仓库中
分层次存储