Dockerfile&Docker-Compose
Dockerfile
dockerfile介绍:
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。。 Docker通过读取Dockerfile
中的指令自动生成镜像。
1.Docker远程API开放
Docker 服务端开放 Remote API,Docker服务器默认只支持本地访问,所以需要开放远程调用权限。
#编辑daemon.json
vi /etc/docker/daemon.json
#往daemon.json中添加远程端口和地址
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
#添加完后的内容
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"],
"registry-mirrors":["https://almtd3fa.mirror.aliyuncs.com"]
}
上面配置了Docker API远程访问端口,我们接下来配置自动启动:
#创建(或修改)文件/etc/systemd/system/docker.service.d/override.conf,添加内容如下
##Add this to the file for the docker daemon to use different ExecStart
parameters (more things can be added here)
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
#执行systemctl命令使得配置生效
systemctl daemon-reload
#重启Docker服务
systemctl restart docker
执行命令 netstat -ntlp 查看相应 2375 端口是否开启监听状态。
#安装net-tools
yum install net-tools
#端口查看
netstat -ntlp
2.Dockerfile文件说明
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,#
为Dockerfile 中的注释。
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM
。一个声明以#
字符开头则被视为注释。可以在Docker文件中使用 RUN
, CMD
, FROM
,EXPOSE
,ENV
等指
令。
1. FROM:指定基础镜像,必须为第一个命令
2. MAINTAINER: 维护者信息
3. RUN:构建镜像时执行的命令
4. ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
5. COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
6. CMD:构建容器后调用,也就是在容器启动时才进行调用。
7. ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
8. LABEL:用于为镜像添加元数据
9. ENV:设置环境变量
10. EXPOSE:指定于外界交互的端口
11. VOLUME:用于指定持久化目录
12. WORKDIR:工作目录,类似于cd命令
13. USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
14. ARG:用于指定传递给构建运行时的变量
15. ONBUILD:用于设置镜像触发器
以下是一个小例子:
下面是一个很形象的总结:
3.项目集成Dockerfile
项目中可以直接使用Dockerfile,基于 docker-maven-plugin 插件使用非常方便,我们在项目中首先引入依赖:
#配置奖项REPOSITORY,例如 hailtaxi/driver 可以按照如下配置添加到pom.xml中
<properties>
#镜像前部分
<docker.image.prefix>hailtaxi</docker.image.prefix>
#镜像后部分
<docker.image.name>driver</docker.image.name>
</properties>
#引入插件依赖
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!--远程Docker的地址-->
<dockerHost>http://192.168.211.145:2375</dockerHost>
<imageName>${docker.image.prefix}/${docker.image.name}</imageName>
<!--Dockerfile地址-->
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
关于插件更多参数,大家可以参考下面列表:
引入插件之后,我们需要在项目中创建 Dockerfile 配置文件,创建src/main/docker/Dockerfile
,配置如下:
#基础镜像
FROM java:8
#挂载目录
VOLUME /tmp
#将hailtaxi-driver-1.0-SNAPSHOT.jar添加到容器中
ADD hailtaxi-driver-1.0-SNAPSHOT.jar /driver.jar
#指定容器启动程序及参数
ENTRYPOINT ["java","-jar","/driver.jar"]
我们需要把自己的项目创建成镜像并发布,需要先安把当前工程打包(或者安装到Maven本地仓库):
我们接下来在maven面板中找到Plugins>docker>docker:build
,双击它,此时会创建容器。
控制台会输出镜像信息:
此时我们可以看到IDEA的 Services
中有Docker信息,可以看到服务器上的Docker镜像和容器,如下图:
我们可以选择 hailaxi/driver:lastest
右键创建容器:
此时我们需要填写容器名字以及创建容器所需的额外参数,如下图:
容器创建后,在Containers中会显示当前已经创建好的容器,点击容器,可以选择 Show Log 查看日志,如下图:
4.Idea插件集成Dockerfile
上面集成Dockerfile用到了插件包,我们可以直接使用Idea插件集成Dockerfile要更简单,操作如下:
配置完成后,点击执行,如下图:
执行完成后,在Idea的Services中会显示容器和镜像,如下图: