docekrfile详解!!!

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文介绍了Dockerfile的基本语法和使用方法,通过实例展示了如何编写Dockerfile来构建自定义的CentOS 7.9.2009 + Nginx、Python3应用、Tomcat等镜像。文章还讲解了Dockerfile的分段构建优化技巧,并详细说明了多阶段构建的过程,包括构建基础镜像、JDK基础镜像、Tomcat镜像及业务镜像,最后讨论了数据库的部署方式。

[TOC]

1.dockerfile语法

非容器化部署

1662084864398

容器化部署,优化思路等

宿主机nginx,转发流量给多个容器

1. 宿主机的nginx,提供多域名的虚拟主机匹配,将请求,转发给后端节点

# 后端单节点的部署
# 反向代理,升级到负载均衡

upstream wordpress_pool{
    # 超快速,实现业务的,弹性扩缩容,看懂1111
    server  http://172.17.0.2:80; # 容器1
    server     http://172.17.0.3:80; # 容器2
    # server     http://172.17.0.4:80  # 容器3 业务流量加大了,后端节点多一点
    # server     http://172.17.0.5:80  # 容器4 业务流量加大了,后端节点多一点
    # server     http://172.17.0.6:80  # 容器5 业务流量加大了,后端节点多一点
}
server{
listen 80;
server_name wordpress.linux0224.com;

    location / {
    proxy_pass http://wordpress_pool;
    # 转发请求头的参数,保留客户端的原始请求信息
    }

}

# 同上,业务发布过程

server{
listen 80;
server_name yunpan.linux0224.com;

    location / {
    proxy_pass http://172.17.0.3:8444;
    # 转发请求头的参数,保留客户端的原始请求信息
    }

}

1662085868573

纯容器化的部署过程

nginx

应用
都是基于容器去跑的

阿里云服务器, 公网ip  123.206.16.61



入口
↓
都是docker0网段的局域网ip (172.17.0.1)


介入层是谁?nginx  ,容器 nginx_lb       172.17.0.2

# 反向代理,升级到负载均衡

upstream wordpress_pool{
   
    # 超快速,实现业务的,弹性扩缩容,看懂1111
    server  http://172.17.0.3:80; # 容器1
    server     http://172.17.0.4:80; # 容器2
    # server     http://172.17.0.4:80  # 容器3 业务流量加大了,后端节点多一点
    # server     http://172.17.0.5:80  # 容器4 业务流量加大了,后端节点多一点
    # server     http://172.17.0.6:80  # 容器5 业务流量加大了,后端节点多一点
}

server{
   
listen 80;
server_name wordpress.linux0224.com;

    location / {
   
    proxy_pass http://wordpress_pool;
    # 转发请求头的参数,保留客户端的原始请求信息
    }

}



↓



后端节点的其他容器    ,一组后端wordpress节点
wordpres_asxasx  172.17.0.3
wordpres_Asdasdasd  172.17.0.4
wordpres_qweqweqwe  172.17.0.5
wordpres_werwerewr  172.17.0.6

容器化部署nginx和后端的方式

1662086567933

开始dockerfile学习

带着疑问,为什么要写dockerfile ?

伏笔,要讲昨天部署的云盘笔记,改造为dockerfile构建 云盘镜像

换一个主机,docker主机,再创建云盘运行环境
笔记      纯linux命令  ,shell脚本,
再跑一边,进入docker容器内,自定制的操作,写成脚本dockerfile

你的镜像从哪来的?

1662088035978

wordpress镜像?
docker pull wordpress  # 制作一个wordpress ,docker hub



云盘镜像,源代码+ 运行环境。
思路就是
1. 手工部署流程,选择发行版
2. 如定制运行环境,依赖包的安装

你是怎么制作wordpress镜像的?

wordpress镜像?
docker pull wordpress  # 制作一个wordpress ,docker hub

你是怎么制作nginx运行容器的?

docker pull nginx  # debian + nginx


# 选择更合适的 ,更熟练系统去维护

# docker最佳镜像,用ubuntu?centos?还是debian?

# 团队里的运维,大家都会一个发行版,目的要能干活,能产出 


# nginx ,以及一堆配置文件,要放入容器里去跑 centos7.9

# 要定制化的镜像都有十来个
# 一句话,dockerfile的学习,将你之前容器化手工部署操作,改造为doickerfiel脚本
# 建议操作,也是这么来


#  docker pull centgos:7.9
#  docker run -it  xxxx
#  yum install xxx
#  配置文件放进来

# 定制化镜像的过程

又是美好的一天

写dockerfile的思路,就是记录下你如何手工提交一个自定义镜像的过程思路。

语法讲解

2.dockerfile小试身手

构建思路

伏笔,待会自己手工将云盘部署,写成dockerfile,一键构建镜像,一键发布运行。

1662088835779

先熟悉dockerfile语法

看看官网的脚本语法

1662089192170

新手写dockerfile的思路
1. 先想好需求,手工进入容器,正常执行安装步骤,确保运行正常
2.将你部署的命令,以及涉及的配置文件,整理为笔记
3.将配置文件放到一个xx文件夹
4.改写dockerfile
5.测试构建镜像

1662089383327

1662090230233

CMD

1662090400624

运行容器时,替换CMD

1662090545468

EXPOSE参数

1662090813330

ADD-COPY

1662091002341

再dockerfile 部署环境脚本的时候

如yum源替换的需求 切换某个目录的时候

WORKDIR /etc/yum.respos.d/ ,不能!!!

执行配置文件替换 ,替换现有的repo,centos源,替换为阿里云源,sed命令

RUN sed xxxxxxxxxx

ENV

设置容器运行时的环境变量

1662091326366

USER,WORKDIR

1662091536073

一些实践命令,VOLUME,CMD,ENTRYPOINT,结合dockerfile实践学习

----解释,写时复制(还是容器,镜像的本质关系)-----

也叫联合文件系统(更多细节理论,看博客)

1662093349286

1.根据官网的dockerfile示例,学一学如何构建镜像

遍看语法,遍看应用

django,python web模块,部署python代码的运行环境

# 需求,基于dockerfile,构建 python3的运行环境,安装好的一个django模块
# 跑一个能运行django 页面的 平台,代码生成



# 思路,手工部署的逻辑
1. 基础运行系统环境,centos
2. 编译,rpm,yum  ,yum install python3 python3-devel 
3. 安装python3的模块  ,  pip3  install  django

看懂3333,下一步,转化为 dockerfile,思考如何写

1662093825562

基于dockerfile 构建镜像

dockerfile构建结果解读

1662094156060

Removing intermediate container 3bc7e1d8dd26
 ---> 21522cdfa2d8
Step 6/7 : EXPOSE 8000
 ---> Running in 383c1c6d83a4
Removing intermediate container 383c1c6d83a4
 ---> 81aa4ffcf562
Step 7/7 : CMD [ "/bin/bash" ]
 ---> Running in 34bed0d03961
Removing intermediate container 34bed0d03961
 ---> 2064400fdf7a
Successfully built 2064400fdf7a
Successfully tagged test-django-1:latest

构建的镜像查看

[root@docker-200 /guanfang-dockerfile/django_centos7]#docker history test-django-1:latest 
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
2064400fdf7a   4 minutes ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
81aa4ffcf562   4 minutes ago    /bin/sh -c #(nop)  EXPOSE 8000                  0B        
21522cdfa2d8   4 minutes ago    /bin/sh -c yum -y install python-pip python-…   98.8MB    
fc93086f2485   4 minutes ago    /bin/sh -c yum -y install epel-release          182MB     
5808863f13d5   4 minutes ago    /bin/sh -c yum -y update; yum clean all         160MB     
4d1e3d809848   38 minutes ago   /bin/sh -c #(nop)  MAINTAINER The CentOS Pro…   0B        
eeb6ee3f44bd   11 months ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      11 months ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      11 months ago    /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB     
[root@docker-200 /guanfang-dockerfile/django_centos7]#
[root@docker-200 /guanfang-dockerfile/django_centos7]#

如何用这个构建好的django镜像

1.官网给这个镜像环境,提供了 git,你可以去下载源码,  提供 Python-django
你可以用django命令去创建 web源码环境


2. 官网给的这个python镜像,只是个环境,需要你自己去创建python网站代码,再提交去使用,维护

# 开发一个django平台代码流程如下

[root@ab4946068db5 opt]# django-admin startproject myblog


# 开发一个欢迎页面
[root@ab4946068db5 myblog]# cd /opt/myblog

[root@ab4946068db5 ~]# vi /opt/myblog/myblog/urls.py
from django.conf.urls import url
from django.contrib import admin


from django.http import HttpResponse
import datetime

def hello_0224(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.  welcome  linux 0224  ~~~~</body></html>" % now
    return HttpResponse(html)


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'hello_0224',hello_0224)
]



# 修改django配置文件,允许所有地址访问
[root@ab4946068db5 myblog]# vi /opt/myblog/myblog/settings.py 

     28 ALLOWED_HOSTS = ['*']


# 尝试启动页面
[root@ab4946068db5 ~]# python /opt/myblog/manage.py runserver 0.0.0.0:8000


#  至此,代码放入了该镜像里
#并且,可以正确启动项目了

# 定制一个镜像,直接docker run 运行,且端口映射,再windows中可以访问到这个系统


# 1.提交这个容器
[root@docker-200 /my-django]#docker commit ab4 welcome-linux-python  
sha256:21c7812027556210e230d76052ff75744f1673232696d5454a0a57b0b39d877e
[root@docker-200 /my-django]#

# 2.开发启动脚本
[root@docker-200 /my-django]#cat start-django.sh 
python /opt/myblog/manage.py runserver 0.0.0.0:8000
[root@docker-200 /my-django]#



# 3.基于镜像,创建容器实例,运行这个代码程序
# - 不用脚本启
docker run -d  -p 8000:8000  welcome-linux-python python /opt/myblog/manage.py runserver 0.0.0.0:8000




# - 用脚本启该怎么办(容器里没这个脚本)

# 想办法,脚本放入容器
#  -v 更省事

docker run -d -v /my-django/:/my_django   -p 8000:8000 welcome-linux-python bash /my_django/start-django.sh



# (定制化写入到镜像里)

1662095456963

1662095776222

运行自定义的镜像,启动django网站(原理流程分析)

http://10.0.0.200:8000/hello_0224  自己开发的一个路由


创建django的后台账户密码
再多学几个容器内的python命令操作

# 数据表生成,为的admin后台页面的数据生成
[root@026ce6466ac9 myblog]# python manage.py makemigrations
No changes detected


# 数据迁移,写入到sqllit数据库
[root@026ce6466ac9 myblog]# python manage.py migrate     

# 此时可以创建用户(记录到数据表里)
[root@026ce6466ac9 myblog]# python ./manage.py createsuperuser
Username (leave blank to use 'root'): chaoge
Email address: yc_uuu@163.com
Password: 
Password (again): 
Superuser created successfully.

http://10.0.0.200:8000/hello_0224  自己开发的一个路由

http://10.0.0.200:8000/admin

1662096528368

----下午开始-----

上午的python镜像使用逻辑还可以改进。
代码,脚本,都不应该放入容器。
(代码写死放入再了镜像里)
都基于数据映射维护。

镜像应该是无状态的!
镜像,只提供一个运行环境(为何官方给你的dockerfile只有环境)




=====================
有状态的应也应该做好数据卷功能





# 镜像作用

镜像只提供程序运行环境,代码,配置等,有状态的文件,放在外面

1662105539833

1.准备一个纯净的python运行环境即可
[root@docker-200 ~]#docker images test-django-1
REPOSITORY      TAG       IMAGE ID       CREATED       SIZE
test-django-1   latest    2064400fdf7a   3 hours ago   645MB
[root@docker-200 ~]#




2.准备好数据物料,配置文件,脚本,源码等

- 把源码数据拿出来
[root@docker-200 ~]#docker cp 026ce6466ac9:/opt/myblog  /opt/
[root@docker-200 ~]#ls /opt/myblog/
db.sqlite3  manage.py  myblog


- 启动脚本
[root@docker-200 ~]#ls /opt/myblog/
db.sqlite3  manage.py  myblog  start-django.sh
[root@docker-200 ~]#

# 脚本如下
[root@docker-200 /opt/myblog]#cat start-django.sh 
cd /opt/myblog/
python  ./manage.py  runserver 0.0.0.0:8000 







3.优化启动方式,数据映射,将物料放入容器运行,更合适的


[root@docker-200 /opt/myblog]#docker run -d  -p 8000:8000 -v /opt/myblog:/opt/myblog    test-django-1 bash /opt/myblog/start-django.sh
856694d08b4ac23429237800a4285ada06b12e9aad3155ca77fbe96765736ef9
[root@docker-200 /opt/myblog]#
[root@docker-200 /opt/myblog]#

4. 后续,对该网站的更新,只需要随意源码数据即可,

- 修改源码
- 重启容器

3.40继续

无状态的容器是指?

容器运行后,容器内产生的数据,不重要,随意,删除,创建新的容器

# 11111


哪些软件是这样的特性?容器跑了你需要的程序
nginx 最大无状态的app


nginx:1.15.1 镜像 ,转发流量 代理软件,日志  

docker run nginx:1.15.1
随意创建,删除



docker run nginx:1.15.1
docker run nginx:1.15.1
docker run nginx:1.15.1




# 再写无状态应用类的容器部署,写dockerfile一般就是

FROM centos
LABEL 

ENV
RUN 

CMD

有状态的容器该如何运行

VOLUME 关键字  ,将容器内的数据,持久化放入到宿主机

上午的python镜像使用逻辑还可以改进。
代码,脚本,都不应该放入容器。
(代码写死放入再了镜像里)
都基于数据映射维护。

镜像应该是无状态的!
镜像,只提供一个运行环境(为何官方给你的dockerfile只有环境)




=====================
有状态的应也应该做好数据卷功能


# 镜像作用

1662107365865

worepress, dockerfile

1662107694873

  • 镜像应该是只提供运行环境,源码数据都从外部映射

  • 源码数据直接打包到镜像里,以镜像作为交付标准
wordpress给的方案,是这个

部署操作如下
# 当前目录下,找到Dockerfile 去构建
# 会使用构建的历史缓存记录

[root@docker-200 /centos7]#docker build -t my-wordpress .


# 再生产下,不需要环境要下载最新的一些数据
[root@docker-200 /centos7]#docker build --no-cache -t my-wordpress .


# 如何用
[root@docker-200 /centos7]#docker run  -P my-wordpress
No DB_ENV_MYSQL_USER variable. Please link to database using alias 'db'.

# 因为wordpress,需要读取数据库,才是合理运行

# 解决办法如下



#1. 先启动mysql容器
# 看懂 1111

- 基于官网给的Dockerfile案例,部署mariadb环境,构建镜像
- 注意要给 RUN chmod +x ./fix-permissions.sh 给个权限
- 发现又猜了个坑,docker-entrypoint.sh
- 数据库持久化方案 (docker run -v /var/lib/mysql/:/var/lib/mysql/    ,dockerfile的 VOLUME 制定/var/lib/mysql/)
- 又发现需要引入数据库环境变量(docker run -e 传入   ENV指令传入  )
- 修改Dockerfile,写入 变量
ENV MYSQL_ROOT_PASSWORD='linux0224'
网络原因,先用-e参数参数的方式

- --link参数,去主动和一个容器建立链接,将对方ip,主机名写入自己的/etc/hosts

bash-4.2$ mysql -uroot -plinux0224 -h my-mariadb-server  -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
bash-4.2$ 
bash-4.2$ 
bash-4.2$ # 看懂1111
bash-4.2$ 



# 至此证明mariadb容器是运行了

# 启动wordpres,发现官网给的dockerfile,php版本,和wordpress对不上
# 修改Dockerfile,修改镜像

# 构建一个lnp环境,wordpress源码放外面。
# 去掉Dockerfile如下部署内容
# 
ADD scripts /scripts
RUN curl -LO http://wordpress.org/latest.tar.gz                         &&\
    tar xvzf /latest.tar.gz -C /var/www/html --strip-components=1       &&\
    rm /latest.tar.gz                                                   &&\
    chown -R apache:apache /var/www/                                    &&\
    chmod 755 /scripts/*



# 重新构建
[root@docker-200 /centos7]#docker build -t v1-wordpress .

# 准备wordpress低版本源码
wget https://wordpress.org/wordpress-5.1.14.zip
unzip wordpress-5.1.14.zip

# 注意目录映射
useradd -u 48 apache
chown -R apache.apache ./*

# 你们公司的php开发,会告诉你,这套源码需要什么php版本,你就去装这个版本
# 不会像限制这样,没人告诉你,自己乱尝试
# 升级php版本

#   DB_ENV_MYSQL_USER    
#  DB_ENV_MYSQL_PASSWORD
#   DB_ENV_MYSQL_DATABASE 

# 启动wordpress时,传入这3变量
# DB_HOST
docker run -d --link my-mariadb-server \
-e DB_ENV_MYSQL_USER='root' \
-e DB_ENV_MYSQL_PASSWORD='linux0224' \
-e DB_ENV_MYSQL_DATABASE='wordpress' \
-e DB_HOST='my-mariadb-server' \
-p 80:80 -v /centos7/other-wordpress/wordpress:/var/www/html  v1-wordpress



# 报错思路,wordpress,不知道如何链接mysql
# 修改wp-config 的文件,或者启动wordpress容器,多传入几个 mysql的链接变量即可



休息
wordpress,如何链接mariadb。



docker run -d  -e MYSQL_ROOT_PASSWORD='linux0224'  -p 3306:3306 my-mariadb


[root@docker-200 /mariadb-docker/centos7]#docker build -t my-mariadb  .
- 修改Dockerfile,重新构建

============================================================
# 最终Dockerfile如下







- 启动mariadb容器,需要注意,你宿主机是否需要用这个mysql端口,-p 
- wordpress容器去链接 mysql容器
1. 制定基础镜像

2.1 dockerfile自定义centos7.9.2009 + nginx

2.2 构建python3应用镜像

3.Dockerfile分段构建优化(面试背)

5.构建tomcat镜像(多阶段构建)

5.1 构建基础镜像centos7

5.2 构建jdk基础镜像

5.3 构建tomcat镜像

5.4 构建业务镜像

5.5 数据库配置

1. 宿主机部署
2. 容器内部署
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
缓存 NoSQL Java
java电商项目(十二)
本文接续前几个文章的项目进行讲解
93 1
|
Java Maven Docker
Docker部署可执行jar包
Docker部署可执行jar包
4462 0
|
4月前
|
Java Spring
No qualifying bean of type 'XXXXX' available
该文档描述了Spring框架中`org.springframework.beans.factory.NoSuchBeanDefinitionException`异常的处理方法,该异常是因为无法找到类型为`com.weblog.auth.mapper.UserMapper`的bean导致。解决办法包括在对应的Mapper上添加`@Mapper`注解,并在启动类上添加`@MapperScan`注解以扫描包含Mapper接口的文件夹。
195 8
|
8月前
|
NoSQL 关系型数据库 网络安全
前后端分离项目Docker部署指南(上)
前后端分离项目Docker部署指南(上)
669 1
|
8月前
|
前端开发 应用服务中间件 网络安全
前端项目部署
前端项目部署
526 0
|
缓存 Shell C语言
Dockerfile完全指南
Dockerfile完全指南
332 2
|
传感器 编解码 区块链
各国高光谱遥感观测卫星参数介绍与对比
本文对目前国内外的高光谱遥感卫星加以汇总,并对主要卫星进行参数介绍与对比~
1085 1
各国高光谱遥感观测卫星参数介绍与对比
|
Oracle Java 关系型数据库
阿里云服务器选择配置以及域名申请和绑定IP搭建教程
阿里云服务器选择以及域名申请和绑定IP搭建教程
7661 0
阿里云服务器选择配置以及域名申请和绑定IP搭建教程
|
Oracle Java 关系型数据库
|
JavaScript 前端开发 API
搭建 Vite + Vue 3 + TypeScript 的基础项目模板
搭建 Vite + Vue 3 + TypeScript 的基础项目模板
847 0