? Dockerfile其实就是我们用来构建Docker镜像的源码,当然这不是所谓的编程源码,而是一些命令的集合,只要理解它的逻辑和语法格式,就可以很容易的编写Dockerfile。简单点说,Dockerfile可以让用户个性化定制Docker镜像。因为工作环境中的需求各式各样,网络上的镜像很难满足实际的需求。
? 参考文档:https://docs.docker.com/engine/reference/builder/
? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。
? docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用 -f 标志指向文件系统中任何位置的Dockerfile。
? Dockerfile由一行行命令语句组成,并且支持以#开头的注释行,Dockerfile分为四部分:基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令。
? Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以 # 字符开头则被视为注释。可以在Docker文件中使用 RUN , CMD , FROM , EXPOSE , ENV 等指令。
? Dockerfile的常用命令如下:
命令 | 说明 |
---|---|
FROM | 指定基础镜像,必须为第一个命令 |
MAINTAINER | 维护者(作者)信息 |
ENV | 设置环境变量 |
RUN | 构建镜像时执行的命令 |
CMD | 构建容器后调用,也就是在容器启动时才进行调用。 |
ENTRYPOINT | 指定运行容器启动过程执行命令,覆盖CMD参数;ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。 |
ADD | 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget |
COPY | 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源 |
WORKDIR | 工作目录,类似于cd命令 |
ARG | 用于指定传递给构建运行时的变量 |
VOLUMN | 用于指定持久化目录 |
EXPOSE | 指定于外界交互的端口 |
USER | 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户 |
? docker build命令用于使用 Dockerfile 创建镜像,对应语法如下:
docker build [OPTIONS] PATH | URL | -
? 常用参数有下面这些:
? build命令参数特别多。这里只给大家介绍几个常用的参数,如果小伙伴们想了解更多内容,请参考docker官网手册。
? 1,**–build-arg=[] 😗*设置镜像创建时的变量;
? 2,**-f 😗*指定要使用的Dockerfile路径;
? 3,**–rm 😗*设置镜像成功后删除中间容器;
? 4,–tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
? 下面编写一个Dockerfile,指定系统时间为上海时区:
FROM mysql:5.7.31
# 作者信息
MAINTAINER mysql from date UTC by Asia/Shanghai "dream21th@dream21th.com"
ENV TZ Asia/Shanghai
? 进入到编写的Dockerfile所在目录,执行下面操作构建镜像:
[root@localhost mysql]# docker build -t dream21th/mysql:5.7.31 .
? 构建镜像成功之后,查看镜像列表:
[root@localhost mysql]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dream21th/mysql 5.7.31 e8a0308ad537 About a minute ago 448MB
? 使用下面指令启动一个容器:
[root@localhost mysql]# docker run -p 3306:3306 --name dream21th-mysql -v /data/mysql:/etc/mysql -v /data/mysql/logs:/logs -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='!QAZ@WSX#EDC' -d dream21th/mysql:5.7.31
? 通过下面指令分别查看宿主机和容器的时间,发现时间一致:
[root@localhost mysql]# date
2022年 06月 24日 星期五 08:12:47 CST
[root@localhost mysql]# docker exec -it dream21th-mysql /bin/bash
root@4f6c18d98166:/# date
Fri Jun 24 08:12:57 CST 2022
root@4f6c18d98166:/# exit
exit
? 本部分我们来通过用Dockerfile的生成微服务的部署,先将一个微服务的应用上传到服务器,并在相同的目录新建一个Dockerfile文件,Dockerfile文件代码的内容如下:
FROM openjdk:8-alpine3.9
# 作者信息
MAINTAINER dream21th Docker springboot "dream21th@dream21th.com"
#修改镜像为东八区时间
ENV TZ Asia/Shanghai
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 9100
ENV JAVA_OPTS "-Xms800m -Xmx800m"
# 指定启动的环境
ENV SPRING_PROFILES_ACTIVE "dev"
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar --spring.profiles.active=${SPRING_PROFILES_ACTIVE}
? 执行下面指令构建镜像:
[root@localhost microappb]# docker build --rm -t dream21th/micro-app-b:v1 --build-arg JAR_FILE=micro-app-b.jar .
[root@localhost microappb]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dream21th/micro-app-b v1 3beaf4020dff 39 seconds ago 138MB
? 通过下面指令启动一个服务镜像,并查看镜像日志,可以看到启动的环境是我们在命令里面显示加上的uat环境:
[root@localhost microappb]# docker run -itd --name MicroAppB -v /data/micro-app-b/log:/home/ops/app/micro-app-b/log -e SPRING_PROFILES_ACTIVE=uat -p 9100:9100 dream21th/micro-app-b:v1
3bb882872fbe12731268927478753098c62c4c47141b196cacf6a3d42edfafcd
[root@localhost microappb]# docker logs -f MicroAppB
? 到宿主机的挂载日志的目录,也可以看到日志的相关信息:
? 编写docker-compose.yml文件:
version: '3'
services:
lagou-mysql:
build:
context: ./mysql
environment:
MYSQL_ROOT_PASSWORD: admin
restart: always
container_name: dream21th-mysql
volumes:
- /data/mysql/data:/var/lib/mysql
ports:
- 3306:3306
networks:
dream21th-net:
micro-app-b:
build:
context: ./microappb
environment:
- "SPRING_PROFILES_ACTIVE=uat"
restart: always
container_name: microAppB
volumes:
- /data/micro-app-b/log:/home/ops/app/micro-app-b/log
ports:
- 9100:9100
networks:
dream21th-net:
networks:
dream21th-net:
? mysql文件夹下面文件只有Dockerfile,文件内容:
FROM mysql:5.7.31
# 作者信息
MAINTAINER mysql from date UTC by Asia/Shanghai "dream21th@dream21th.com"
ENV TZ Asia/Shanghai
? microappb文件夹里面内容micro-app-b.jar和Dockerfile。
FROM openjdk:8-alpine3.9
# 作者信息
MAINTAINER dream21th Docker springboot "dream21th@dream21th.com"
#修改镜像为东八区时间
ENV TZ Asia/Shanghai
ARG JAR_FILE
COPY micro-app-b.jar app.jar
#COPY start.sh start.sh
EXPOSE 9100
#ENTRYPOINT ["sh","start.sh"]
ENV JAVA_OPTS "-Xms800m -Xmx800m"
ENV SPRING_PROFILES_ACTIVE "dev"
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar --spring.profiles.active=${SPRING_PROFILES_ACTIVE}
[root@localhost app]# TAG=v1 docker-compose build
Building lagou-mysql
Step 1/3 : FROM mysql:5.7.31
---> 42cdba9f1b08
Step 2/3 : MAINTAINER mysql from date UTC by Asia/Shanghai "dream21th@dream21th.com"
---> Running in cf82b91a7858
Removing intermediate container cf82b91a7858
---> 63a7a5f11fde
Step 3/3 : ENV TZ Asia/Shanghai
---> Running in 0585992b8c1d
Removing intermediate container 0585992b8c1d
---> 7d740e419929
Successfully built 7d740e419929
Successfully tagged app_lagou-mysql:latest
Building micro-app-b
Step 1/9 : FROM openjdk:8-alpine3.9
---> a3562aa0b991
Step 2/9 : MAINTAINER dream21th Docker springboot "dream21th@dream21th.com"
---> Running in c1a8dd573b60
Removing intermediate container c1a8dd573b60
---> fb4f6ba95403
Step 3/9 : ENV TZ Asia/Shanghai
---> Running in 36a7408db8ec
Removing intermediate container 36a7408db8ec
---> 217adbd54217
Step 4/9 : ARG JAR_FILE
---> Running in 30a4bad5bc9b
Removing intermediate container 30a4bad5bc9b
---> a3397010f5bb
Step 5/9 : COPY micro-app-b.jar app.jar
---> 37bbf0668828
Step 6/9 : EXPOSE 9100
---> Running in 6e4db0b5b9cc
Removing intermediate container 6e4db0b5b9cc
---> 5b321d515abe
Step 7/9 : ENV JAVA_OPTS "-Xms800m -Xmx800m"
---> Running in a78bfa9103ec
Removing intermediate container a78bfa9103ec
---> aae4f5920d1e
Step 8/9 : ENV SPRING_PROFILES_ACTIVE "dev"
---> Running in 7808e96123dc
Removing intermediate container 7808e96123dc
---> 700091138d9a
Step 9/9 : ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar --spring.profiles.active=${SPRING_PROFILES_ACTIVE}
---> Running in b691b41d06b0
Removing intermediate container b691b41d06b0
---> 04213956c926
Successfully built 04213956c926
Successfully tagged app_micro-app-b:latest
? 在docker-compose.yml文件所在目录执行上面方法,镜像构建成功。
[root@localhost app]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
app_micro-app-b latest 04213956c926 7 minutes ago 138MB
app_lagou-mysql latest 7d740e419929 7 minutes ago 448MB
? 执行下面指令启动容器:
[root@localhost app]# docker-compose up
Creating dream21th-mysql ... done
Creating microAppB ... done
Attaching to dream21th-mysql, microAppB
? 在某些时刻可以指定docker-compose的入参:
[root@localhost app]# TAG=v1 docker-compose build