Docker入门(四):Dockerfile

目录

1. Dockerfile

1.1 定义

1.2 Docker执行Dockerfile的大致流程

1.3 练习:手动生成一个tomcat镜像

1.4 Dockerfile参数说明

1.5 示例:Dockerfile生成Tomcat镜像

1.6 示例:把前文大练习jforum的场景,编写成两个Dockerfile文件,并正确启动它们

1.7 注意事项

2. 镜像转移/镜像的导出和导入

2.1 针对镜像

2.2 针对容器

2.3 注意事项

3. 研发流程

3.1 相关概念

3.2 流程图示

3.3 常见的研发流程

4. 思考


1. Dockerfile

1.1 定义

(1)DockerFile

软件的原材料。Dockerfile定义了进程需要的一切东西。涉及的内容包括执行代码或者是文件,环境变量,依赖包,运行时环境,动态链接库等。

(2)Docker镜像

软件的交付品。用Dockerfile定义一个文件后,运行docker build时会产生一个Docker镜像。

(3)Docker容器

软件的运行态。

1.2 Docker执行Dockerfile的大致流程

(1)docker从基础镜像运行一个容器

(2)执行一条指令并对容器做出修改

(3)执行类似docker commit的操作,提交一个新的镜像层

(4)docker再基于刚提交的镜像,运行一个新容器

(5)执行dockerfile中的下一条指令,直到所有指令都执行完成

1.3 练习:手动生成一个tomcat镜像

本质上,dockerfile就是分层次的执行每一个步骤,把我们手动修改的过程记录下来,然后生成一个最终的镜像。

1.4 Dockerfile参数说明

(1)FROM:指明构建的新镜像是来自哪个基础镜像

(2)MAINTAINER:指明镜像维护者和联系方式

(3)RUN:执行什么命令

(4)EXPOSE:声明容器运行的服务端口(后面那个?)

(5)ENV:构建镜像过程中设置环境变量

(6)ADD:将宿主机上的目录或文件拷贝到镜像中(会自动解压)

(7)COPY:作用与ADD类似,但不支持自动下载和解压

(8)CMD:指定一个容器启动时要运行的命令。

        Dockerfile中可以有多个CMD,但只有最后一个生效。

        CMD会被docker run之后的参数替换。

(9)ENTRYPOINT

作用与CMD类似,区别是:由ENTRYPOINT启动的程序不会被docker run命令行执行的参数所覆盖,而且这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序。

(10) VOLUME

容器数据卷,指定容器挂载点到宿主机自动生成的目录或者其他容器。(数据保存和持久化工作,通常不放在dockerfile里,更常见的还是命令docker run的时候用 -v 指定)

(11)WORKDIR

相当于cd命令,切换目录路径

1.5 示例:Dockerfile生成Tomcat镜像

(1)下载两个安装包 tomcat和jdk

wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.41/bin/apache-tomcat-9.0.41.tar.gz

链接失效的话,直接官网下:https://tomcat/apache.org —>Deployer版本

wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz"

(2)创建一个新目录,将上述两个包解压到新目录下

mv命令将目录改名为: tomcat9和jdk8

(3)在上述新建的目录下,创建一个Dockerfile: vim Dockerfile

#First Dockerfile from Sheryl

#使用的基础镜像

FROM centos

#创建目录

RUN mkdir -p /root/tomcat

#把当前目录下的jdk文件夹添加到镜像

ADD tomcat9 /root/tomcat/tomcat9

ADD jdk8 /root/do_tomcat/jdk8

ENV JAVA_HOME /root/do_tomcat/jdk8

ENV CATALINA_HOME /root/tomcat/tomcat9

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

#暴露8080端口

EXPOSE 8080

#设置启动命令

ENTRYPOINT ["/root/tomcat/tomcat9/bin/catalina.sh", "run"]

(4)根据Dockerfile和命令,构建镜像

docker build -t 新镜像名 .

-t:新镜像名字和标签

.:最后的 . 不要忽略,表示在当前路径下查找名为Dockerfile的文件并构建,Dockerfile文件中所涉及到的路径均为当前路径

-f: 指定要使用的Dockerfile文件所在的路径,跟点.对应

(5)第四步跑完之后,看提示信息,成功的话,docker images会看到新生成的镜像。

1.6 示例:把前文大练习jforum的场景,编写成两个Dockerfile文件,并正确启动它们

(1)准备tomcat_Dockerfile

1)将要放到tomcat容器的war包放到一个文件夹下(文件夹下不要有其他无关的文件,因为最终都会被加载到新镜像里)

2)在上述文件夹下,vim创建Dockerfile文件(名字就是Dockerfile),内容为:

FROM tomcat

WORKDIR /usr/local/tomcat/webapps

ADD jforum-2.1.9.war jforum-2.1.9.war        //将宿主机上的目录或文件拷贝到镜像中(会自动解压)

3)docker build -t 新镜像名 .

4)生成新镜像,用新镜像启动新容器

(2)准备mysql_Dockerfile

1)新建一个文件夹,存放:jforum.sql

2)新建 create.sql,用于一些针对数据库的操作:

CREATE DATABASE jforum;

Use jforum;

source /jforum.sql;

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;

flush privileges;

(3)新建 set.sh

#!/bin/bash

set -e

#启动mysql

service mysql start

sleep 3

echo 'service mysql status'

#导入数据

mysql < /create.sql

echo '3. 导入数据完毕...'

sleep 3

echo 'service mysql status'

tail -f /dev/null

(4)新建 mysql_Dockerfile

FROM mysql:5.7

#设置免密登录

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes

#将所需文件放到容器中

COPY setup.sh /setup.sh

COPY create.sql /create.sql

COPY jforum.sql /jforum.sql

#设置容器启动时执行的命令

CMD [“sh”, "/setup.sh"]

(5) docker build -t 新镜像名 .

(6)生成新镜像,用新镜像启动新容器

1.7 注意事项

(1)docker history 镜像名:查看镜像的详细构建信息/过程

(2)上面练习一中,启动centos容器时为什么没用 -v 数据卷,因为在配置构建新镜像之后,其他人使用新镜像时没有对应的数据卷的话,会出错。所以Dockerfile构建时,避免使用数据卷。

(3)一般不在Dockerfile里进行解压命令,因为解压文件名不可控。都是解压好并改好名字后,再建Dockerfile。

(4)手动生成tomcat镜像时,docker run 命令行中的 - -privileged=true 是给予管理员权限,/usr/sbin/init 是给超级管理员用的

(5)大练习中,因为Dockerfile里无法执行mysql命令,所以需要把mysql相关的命令(登录,加载数据文件等)写到另外的脚本create.sql里。

(6)Dockerfile文件创建好之后,很多内容都配置好了,生成镜像后,就可以根据镜像快速的启动容器 (docker run),命令行就不需要加很多参数了。

(7)Dockerfile中,参数比如RUN 后面的路径是容器/镜像里的,不会自动创建,要自己mkdir。 注意创建的目录和其他句子中用到的目录要一致,否则会报错。

(8)RUN后面接的是Linux本身的一些命令。ADD将服务器里某个目录的内容,添加到容器里面,后面接的是容器里的路径。

(9)Dockerfile文件里的内容,都是针对容器来说的,就是在容器里执行的。

(10)如何对待错误?要看报错内容,查看日志。

(11)只要没有语法错误,打镜像一般都是能成功的。

但是如果有错误,那在之后的启动/运行容器过程中,就会报错。

有时候run 一开始是成功的,但是过了一会儿ps -a看,exited了,说明前面可能还没执行到错误的地方。此时, docker logs -f 容器ID  来查看具体的日志信息。

2. 镜像转移/镜像的导出和导入

2.1 针对镜像

docker save && docker load        建议!

从镜像中导出tar文件

2.2 针对容器

docker export && docker import

2.3 注意事项

(1)save是从镜像中导出tar文件,export是从容器中导出。

(2)export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,跟Dockerfile信息对应),不能进行回滚操作。

而save是依据镜像来的,所以导入时可以完整保留每一层layer信息。

(3)若只想备份images, 使用save和load。

若是在启动容器后,容器内容有变化,需要备份,则使用export和import。

3. 研发流程

3.1 相关概念

(1)CI 持续集成

关于开发每次提交的代码是否是正确的,强调的是代码层面的实现是否完成,是否是可工作的软件(集成测试通过,每次合并代码都不影响有的功能,需要高度的自动化测试介入,减少人工介入)

(2)CD 持续交付

关注需求是否完全实现,是否可以给用户演示,强调的是可发布的产品增量(实现了具有价值的某些用户故事)

(3)CD 持续部署

最终发布生产的业务,可让用户使用

3.2 流程图示

(1)Design:Atlassian JIRA 需求管理

(2)Development:

        (重要!)git 代码版本管理

(3)SCM:

        sonarqube代码审核

        Gotea源代码管理

(4)Build

(5)Package Repo

        Nexus构建管理

        Harbor镜像管理

(6)Deploy

        GoCD持续部署

        (重要!)Jenkins持续部署

        Shell

        Dockerfile

(7)Dev

(8)Test

        Jmeter压力测试

        Selenium UI测试

(9)Prod

(10)Ops

        Errbot

        其他工具

        Atlassian JIRA 项目管理

        (重要!)Swagger 接口管理

        Zabbix持续监控

        Prometheus持续监控

        Grafana监控展示

        ELK日志监控

3.3 常见的研发流程

(1)开发实现了某部分需求,把代码推送到git仓库中。

(2)在Jenkins中,通过插件配置与git的关系,并获取提交记录。

(3)在Jenkins中,通过编译命令,把源代码打成war或者jar。

(4)在Jenkins中,通过shell插件,根据事先写好的Dockerfile生成镜像(Dockerfile中会包含业务代码的发布及启动命令,根据不同的业务和中间件会有不同的写法,根据实际业务情况来编写)。

(5)在Jenkins中,通过shell插件,把生成的镜像推送到制品库中(Registry)。

(6)在Jenkins中,通过shell插件,获取最新镜像并生成容器,完成发布。

4. 思考

(1)了解研发流程每个环节的工具,具体都是用来做什么的!

(2)注册一个GitHub账号

(3)通过Docker构建一个Jenkind容器并启动,完成部署

(4)安装一个JAVA的IDE,用idea

(5)完成两个dockerfile的编写(jforum)

(6)熟悉docker compose

(7)熟悉 yml的编写规范 (现在最流行的对数据的处理,yml和json)

(重要!)VMWare/Docker容器

(重要!)maven持续集成

(8)Jenkins持续集成

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值