Dockerfile介绍
DockerFile是Docker用于支持快速构建自定义镜像的一种文本文件,使用一种自带的语法规范。DockerFile的详细规范详见DockerFile最佳实践官方文档。
构建Dockerfile时,需要新建名为Dockerfile的文本类型文件(无后缀),Docker默认仅能支持识别名为Dockerfile的文件,一个目录下只能有一个Dockerfile文件。
Dockerfile的构成
以下为后续部署时会用到的常用命令:
- FROM:定制镜像的基础镜像。一般来说,定制镜像会基于某种官方镜像进行修改,比如以Nginx镜像为基础,定制用于部署前端项目的镜像。
- RUN:构建镜像时执行的命令。
- COPY:将主机上的某个文件复制到镜像中。用法为COPY <SRC> <DST>,前后分别指源路径与目标路径。
- ENTRYPOINT:配置容器启动后执行的命令。
- EXPOSE:声明端口。
以下为Dockerfile支持的其他命令用法:
- ADD:与COPY用法类似,会自动解压。
- CMD:在运行时执行命令。
- ENV:定义环境变量。
- ARG:定义只在构建时有效的环境变量。
- VOLUME:定义匿名数据卷。
- WORKDIR:指定工作目录。
- USER:用于指定执行命令的用户和用户组。
- HELTHCHECK:用于指定某个程序或指令来监控容器的运行状态。
- ONBUILD:用于延迟构建命令的执行,即仅在镜像被引用(FROM)时才会被执行。
DockerFile的使用
在构建完Dockerfile后,使用如下命令构建镜像:
# -t用于指定构建镜像的名字
# 最后的 . 为上下文路径
docker build -t <IMAGE NAME> .
使用指令时需注意:
指令最后的小数点为上下文路径,Docker构建时需要指定目录,将目录下的文件一起打包给docker引擎使用,小数点即为指定Dockerfile所在目录。“."不能省略。
指令build执行时所在路径必须与Dockerfile在同一路径下。
Dockerfile的同目录下最好不要有和该镜像无关的文件。
使用Docker部署MySQL
MySQL的部署相对比较简单,官方提供了完整的MySQL镜像,因此无需使用Dockerfile进行编辑,因此只需要执行如下指令即可:
docker pull mysql
docker run -d -p <主机启动mysql端口号>:3306 -v <主机中数据存放路径>:/var/lib/mysql -v <mysql配置文件路径>:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=<密码> --name <容器名> mysql
其中docker run中的参数选项较多,docker run的具体参数用法详见Docker的安装&配置阿里云加速与常用指令。
在上面的例子中,在/root目录下创建了mysql文件夹,并在该文件夹中分别创建了/root/mysql/data文件夹用于存放数据,/root/mysql/conf文件作为mysql的配置文件。
首先拉取官方提供的mysql镜像。
-d指定进程将在后台运行。
-p指定mysql服务所对应的主机端口,在容器中,mysql默认启动于3306端口,如果主机3306端口被占用或者想将mysql部署于其他端口,则直接在run指令中修改映射的主机端口即可。
-v将容器路径与主机路径进行映射,mysql作为持久化数据库,需要将数据存放在主机中。如果不建立映射的话,如果mysql容器异常终止,则数据也会丢失。因此建立映射后,重启服务后数据也不会随容器终止而消失。
同理,通过-v建立映射也可以将本地的mysql配置文件映射到容器中。
-e用于指定mysql服务的管理员密码。该步骤不可省略,运行mysql容器必须在run指令中设置密码,否则容器无法正常启动。
进行以上步骤后,mysql服务则通过docker正常启动了。后续为了避免重复输入指定,可以编写脚本,便于重启mysql服务。
#!/bin/bash
docker kill mysqlContainer
docker rm mysqlContainer
docker run -d -p 3306:3306 -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysqlContainer mysql
使用Dockerfile部署SpringBoot项目
Dockerfile
FROM openjdk:11
COPY *.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
构建SpringBoot所需镜像,首先需要依赖于java环境。在Docker中,推荐使用openjdk作为java环境镜像,通过tag指定jdk版本。
使用COPY指令将当前目录下打包好的jar包复制到容器中的根目录下。
使用EXPOSE指令声明开放的端口,Springboot默认启动于8080端口,如果有修改则与SpringBoot项目保持一致即可。
使用ENTRYPOINT指令声明在容器启动后需要执行的指令。在本镜像中设置启动后自动运行打包好的jar包。
构建并运行镜像
docker build -t <镜像名> .
docker run -d -p <主机端口号>:<容器中项目运行的端口号> -v <主机路径>:<容器中路径> --name <容器名> <镜像名>
注意:需将项目jar包与Dockerfile放在同目录下,并在该目录下执行指令。
通过-p可以修改SpringBoot项目所启动的端口号。通过这种方式可以避免在项目开发时修改启动端口,可以在部署时再进行分配,更为灵活。
如果需要的话,可以通过-v指令建立映射,例如项目中包含上传并保存文件到服务器的需求,此时可以将主机的目录与容器中目录建立映射,防止容器终止后数据丢失。
可以添加"-e TZ="Asia/Shanghai"指定设置容器内时区。如果项目中有定时运行的功能则需要将时区与当前地区设置一致。
自动部署脚本
#!/bin/bash
docker kill <容器名>
docker rm <容器名>
docker rmi <镜像名>
docker build -t <镜像名> .
docker run -d -p <主机端口号>:<容器中项目运行的端口号> -v <主机路径>:<容器中路径> --name <容器名> <镜像名>
在项目开发中,需要随时部署最新版本,因此可以使用如上脚本保存指令,通过脚本随时部署新项目。只需要将jar包更新为新版本,然后运行脚本即可。
使用Dockerfile部署Vue项目
Dockerfile
FROM nginx
COPY <本地nginx配置文件> /etc/nginx/conf.d/default.conf
COPY dist/ /usr/share/nginx/html/
注意:需将vue项目打包的dist文件夹与当前Dockerfile放在同一目录下,如有配置文件则也需要放到该目录下。
自动部署脚本
#!/bin/bash
docker kill <容器名>
docker rm <容器名>
docker rmi <镜像名>
docker build -t <镜像名> .
docker run -d -p <主机端口>:8080 --name <容器名> <镜像名>
配置文件default.conf
由于本人主要负责开发后端,对于前端vue项目仅仅为入门水平,对于nginx配置不太了解,这里只放上曾经项目中的配置文件,仅供参考。
server {
listen <项目启动端口>;
server_name <服务器公网ip>;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api{
proxy_pass http://<服务器公网ip>:<后端端口>/;
}
}