DockerFile语法
DokerFile是Docker执行操作的说明书,用户可以通过编写此文件来告知Docker,如何制作镜像,制作完镜像以后要执行什么样的操作。DockeFile主要有一下几个常见的语义词汇。
FROM
FROM表示一种依赖关系。一般的,我们制作的镜像都是需要依赖于一些其他程序,比如Java程序需要有JDK或者JRE才能够正常运行;Web项目则需要一些容器才能启动,比如Tomcat或者Nginx。这些应用程序所依赖的程序包需要和我们编写的程序一起,被装进镜像中。因为实际上Docker可以被看作是一个精简版的linux系统,使用FROM相当于标记了系统中所需要的软件环境。
WORKDIR
此关键字可以指定项目的工作目录为某文件夹,如果指定的文件夹不存在,此命令会创建一个新文件夹。使用此命令指定工作文件夹后,后续脚本中使用./
或者../
使用的相对路径就以此路径为准。
EXPOSE
设置映射端口,当然也仅仅是映射端口。实际上项目启动的时候,docker run xxx的命令中也包含了端口映射关系,一般会以命令中的端口映射为准。
ARG
定义一个变量,在后续的脚本中可以使用变量名引用变量值。此变量的生命周期只能到docker build,一般的用处是可以把一些比较长的文件名用一个变量名代替,方便后面编写脚本。
ENV
定义一个变量,在后续的脚本中可以使用变量名引用变量值。此变量的生命周期可以到docker run,可以把执行指令的时候的一些参数写到这里,方便调用,比如一个常见的场景是:将JVM参数或者数据库时区等内容写入到ENV中,方便多个JAR启动的时候调用。
CMD
可以把需要执行的命令放在CMD的后面,这些命令会在docker run xxx的时候执行,因此这里的命令一般是我们的程序的启动命令,如果是java项目,这里应该是java -jar xxx,如果是其他语言的话,这里的命令可能是别的什么。要注意区分这里的CMD和后面的RUN的区别。
RUN
可以把需要执行的命令放在RUN的后面,这些命令会在docker build的时候执行,所以诸如创建文件夹之类的命令使用此关键字,可以在这里执行大多数linux shell脚本。
示范总结
下面是一个实际的脚本例子,可以结合此脚本学习DockerFile的编写过程,熟悉上面提到的语法。
项目结构大概如此,DockerFile位置在于模块的根目录,与之同级的还有src
源代码目录,target
目标文件目录。此时对应的DockerFile文件的具体内容如下。
FROM moxm/java:1.8-full
RUN mkdir -p /pig-register
WORKDIR /pig-register
ARG JAR_FILE=target/pig-register.jar
COPY ${JAR_FILE} app.jar
EXPOSE 8848
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
CMD sleep 30; java $JAVA_OPTS -jar app.jar
Docker 镜像制作
Docker Desktop安装
Docker镜像的制作,对于开发来说,这里的环境安装可以下载一个Docker官方提供的工具–Docker Desktop
,官网下载,直接安装即可,所有的选项都默认也行。
安装以后,打开此软件,需要更改一下Docker的镜像源和habor的地址。habor是一个Docker镜像远程私有仓库,本地制作的镜像如果确认没有问题,就可以提交到habor,方便后面其他人使用。
先点击设置按钮,进入设置页面。
再点击Docker Engine进入配置文件编辑页面,在 Docker Engine 文件配置内添加docker 镜像加速配置。
"insecure-registries": [
"39.162.1.200:39087"
],
"registry-mirrors": [
"https://6fe21mdq.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
修改后,点击apply,使得修改后的配置生效。
Docker 镜像制作
在IDEA中可以配置镜像的相关信息。
点击Edit Configuration
,新建一个属于DockerFile选项卡的应用。
应用新建,需要指定对应的配置文件、镜像名称和版本号等内容.
输入完毕后,点击apply保存此应用。
保存完毕后,选择指定的应用,点击运行按钮即可启动镜像,因为是第一次启动,这里会先构建镜像。
当然这里应该会立即会报错,因为这里没有执行mvn package
,所以这里没有target文件夹,也没有jar。所以要先执行mvn clean
,再执行mvn package
,生成对应的jar,然后再点击docker应用的运行按钮,这里会先创建一个Docker镜像,然后再启动一个随机名称的容器。
但是一般,我们会指定一个有意义的容器名称,所以可以把现在启动的这个容器关掉。在使用docker run
命令,指定容器名称,而且这里使用IDEA点击启动还有一个问题就是无法指定映射的端口,可以用docker run
命令来解决。一般的会使用这样的命令。
docker run -p 8848:8848 -p 9848:9848 --name docker-pig-nacos pig-nacos:1.0.8
当然,这里的镜像在docker desktop里面也可以看到,也可以启动。
这里也能设置对应应用的端口映射功能,还能设置其他的参数。
制作镜像的命令
也可以放弃图形化界面,直接使用命令制作镜像,一般制作镜像使用的是docker build。首先,在Dockerfile文件所在的文件夹使用cmd命令,然后执行如下命令即可打包镜像。
docker build -t pig-nacos:1.0.0 .
-t
制定了此docker镜像的标签,后面的.
指定了当前文件,即使用当前文件夹的Dockerfile打包镜像。
镜像上传
在命令行中执行命令,登录到habor,获取到上传权限。
docker login 192.168.5.124:9087
之后会要求输入对应habor的用户名和密码。认证身份后,可以在命令行中继续操作,标记镜像。
docker tag SOURCE_IMAGE[:TAG] 192.168.5.124:9087/pig/REPOSITORY[:TAG]
标记完毕后,执行命令,上传镜像到habor即可。
docker push 192.168.5.124:9087/pig/REPOSITORY[:TAG]
Rancher启动
rancher项目中新建Deployment即可。
在这里需要指定docker镜像的拉取位置,也就是镜像在habor中的位置。
在镜像仓库中,点击指定的镜像,然后点击拉取命令,这时候会复制一串拉取命令,但是一般会进行简单的修改,修改对比效果如下。
下面的是修改过后的,主要将前面的指令去掉,并将hash码去掉,换成docker镜像的版本号。
然后将这个内容复制到deployment的配置项中。
确认信息无误后,点击create,就可以保存运行容器。正常运行的效果如下图所示:
代码如果发生了更新,需要重新制作镜像,制作完成以后,将镜像推送到habor,然后在这里可以将rancher的scale数目改成0,再恢复到指定数目,就可以实现项目的更新。