什么是DockerFile
Dockerfile是一个创建镜像所有命令的文本文件,包含了一条条指令和说明,每条指令构建一层,通过docker build命令,根据Dockerfile的内容构建镜像。
因此每一条指令的内容就是描述该层如何构建。
有了dockerfile文件,我们就可以定制自己的docker镜像规则,只需要在dockerfile上添加或者修改指令,就可生成docker镜像。
Dockerfile常用指令介绍
FROM
指定基础镜像。
MAINTAINER
维护这信息
RUN
执行命令,每执行一条RUN命令,添加一个新的镜像层。
shell 格式
RUN <命令>
比如:RUN echo ‘
Hello, Docker!
’ > /usr/share/nginx/html/index.html
exec格式
RUN [“可执行文件”, “参数1”, “参数2”]
run可以写多个,每一个指令都会建立一层,比如:
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/release/redis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
COPY
复制文本
COPY <源路径> … <目标路径>
- 源路径:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go的filepath.Match规则,例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/ - 目标路径 :容器内的指定路径,该路径不用事先建好,路径不存在会自动创建。
ADD
高级复制文件。
ADD指令和COPY的使用格式类似(同样需求下,官方推荐使用COPY);功能也类似,不同之处如下:
- ADD的优点:在执行<源文件>为tar压缩文件时,对于压缩格式为gzip、bzip2以及xz的情况下,会自动复制并解压到<目标路径>。
- ADD的缺点:在不解压的前提下,无法复制tar压缩文件。会令镜像构建缓冲失效,从而可能会令镜像构建变得比较缓慢。
具体是否使用,可以根据是否需要自动解压来决定。
CMD
类似于RUN指令,用于运行程序,但是二者运行的时间点不同。
参数会被docker run指定的参数覆盖。
- CMD在docker run时运行。
- RUN是在docker build时运行。
ENTRYPOINT
类似于CMD指令,但其不会被docker run的命令行参数指定的数据覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序。
但是如果运行docker run时使用了 –entrypoint选项,将覆盖ENTRYPOINT指令指定的程序。
优点:在执行docker run的时候可以指定ENTRYPOINT运行所需的参数。
注意:如果Dockerfile中存在多个ENTRYPOINT指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>", "<param1>", "<param2>", ...]
示例:
ENTRYPOINT ["java","-jar","/httpUtils-0.0.1-SNAPSHOT.jar"]
使用示例
假设已经通过Dockerfile构建了nginx:test 镜像。
Dockerfile文件如下:
FROM nginx
ENTRYPOINT ["nginx", "-c"]
# 容器运行时的固定定参
CMD ["/etc/nginx/nginx.conf"]
不传参运行
$ docker run nginx:test
容器内会默认运行如下命令:
nginx -c /etc/nginx/nginx.conf
传参数运行
docker run nginx:test -c /etc/nginx/new.conf
容器内部会默认运行如下命令:
nginx -c /etc/nginx/new.conf
ENV
设置环境变量,定义环境变量,在后续的指令中可以使用ENV定义好的环境变量。
格式:
ENV
ENV = =…
VOLUME
定义匿名数据卷,在启动容器时忘记挂载数据卷时会自动挂载匿名卷。
作用:
- 避免重要的数据因容器重启而丢失,这是非常致命的。
- 避免容器不断变大。
格式:
VOLUME [“<路径1>”, “<路径2>” …]
VOLUME <路径>
在启动容器docker run的时候,我们可以通过 -v 参数修改挂载点。
EXPOSE
仅仅只是声明对外暴露的端口,也就是外部访问端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,方便配置映射。
- 在运行时使用指定端口映射时,也就是docker run -P 时,会覆盖EXPOSE的端口。
格式:
EXPOSE <端口1> [<端口2>…]
DockerFile构建本地java项目
准备
[root@localhost gxm]# cd /root
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 20.10.11
API version: 1.41
Go version: go1.16.9
Git commit: dea9396
Built: Thu Nov 18 00:36:58 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.11
API version: 1.41 (minimum version 1.12)
Go version: go1.16.9
Git commit: 847da18
Built: Thu Nov 18 00:35:20 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.12
GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@localhost ~]#
修改docker服务的对外端口
- 修改docker.service的对外端口号
打开/usr/lib/systemd/system下的docker.service文件;
把ExecStart配置项改成:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
- 后台服务重新加载服务配置文件
systemctl daemon-reload - 重启docker服务
systemctl restart docker
IDEA连接docker
构建镜像
dockerfile-maven-plugin插件
步骤1
准备一个maven项目,用来部署测试。
在pom.xml添加dockerfile-maven-plugin插件,并做相应的配置:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.7</version>
</plugin>
步骤2
在项目的根路径创建一个名为DockerFile的文件。
文件内容如下:
FROM openjdk:8-jdk-alpine
MAINTAINER docker
WORKDIR /
# 把target下的httpUtils-0.0.1-SNAPSHOT.jar拷贝的docker的/目录下
ADD target/httpUtils-0.0.1-SNAPSHOT.jar /httpUtils-0.0.1-SNAPSHOT.jar
# 对外暴露的端口
EXPOSE 8097
ENTRYPOINT ["java","-jar","/httpUtils-0.0.1-SNAPSHOT.jar"]
步骤3
通过插件将生成好的镜像部署到服务器上。
打包之前先 maven clean,然后maven package。
执行idea的docker任务启动就可以了,镜像会被部署到docker中并启动。
如果出现下面的连接docker失败的问题,重启idea即可。
重启后,可以看到docker中的镜像已经启动成功了。
只发布镜像到服务器,linux服务器上手动启动容器
注意文件名称必须为:Dockerfile,这样idea才能识别。
[root@localhost ~]# docker container run -d --name httpUtil-test -p 8090:8080 httputils-docker:test
483af2bd813169f1a171866b20cf77edbeab8313424f8c56f1faecde54c7f311
[root@localhost ~]#
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100204.html