Dockerfile

suaxi
2021-03-24 / 0 评论 / 164 阅读 / 正在检测是否收录...

dockerfile用于构建docker镜像(命令参数脚本)

1.github dockerfile.png


1.dockerfile构建过程:

# 1.指令关键字必须大写
# 2.从上往下顺序执行
# 3.# 表示注释
# 4.每一个指令都会创建一个新的镜像层,并提交

分层镜像.png

DockerFile:构建文件,定义执行的内容

DockerImages:通过DockerFile构建生成的镜像,即最终发布和运行的产品

DockerContainer:运行镜像并提供服务


2.DockerFile指令

FROM            # 基础镜像
MAINTAINER        # 作者:姓名+邮箱
RUN                # 镜像构建时需要运行的命令
ADD                # 添加需要使用的文件(会自动解压)
WORKDIR            # 镜像工作目录
VOLUME            # 挂载目录
EXPOSE            # 暴露端口
CMD                # 指定容器启动时要运行的命令(只有最后一个才生效,可被替代)
ENTRYPOINT        # 同理CMD,但可命令可以追加,类似于StringUtils.append()
ONBUILD            # 当构建一个被继承的dockerfile时,就会运行onbuild指令(触发指令)
COPY            # 类似于ADD,将需要的文件拷贝到镜像中
ENV                # 构建时设置环境变量


3.centos 测试实例

DockerHub中大部分的镜像都是基于scratch这个基础镜像构建而来

# 1.编写dockerfile配置文件
FROM centos
MAINTAINER suaxi<281463547@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash

# 2.构建镜像
docker build -f dockerfile文件路径 -t 镜像名:[TAG] .
[root@suaxi dockerfile]# docker build -f dockerfile-centos -t mycentos:1.0 .

# 3.测试运行

2.测试运行.png

镜像构建历史:docker history 容器id

4.镜像构建历史.png


CMD和ENTRYPOINT的区别

测试CMD

# 1.编写dockerfile文件
FROM centos
CMD ["ls","-a"]

# 2.构建镜像
[root@suaxi dockerfile]# docker build -f docker-cmd-test -t cmdtest .

# 3.运行,执行了ls -a 命令
[root@suaxi dockerfile]# docker run 92054cb6235d
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 现在项追加一个 -l 命令 ls -al
[root@suaxi dockerfile]# docker run 92054cb6235d -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

# 在使用CMD指令的情况下,后追加的 -l 命令替换了之前的CMD["ls","-a"]命令,所以报错


测试ENTRYPOINT

# 1.编写dockerfile文件
FROM centos
ENTRYPOINT ["ls","-a"]

# 第2、3步的build和run与之前的一样

[root@suaxi dockerfile]# docker build -f docker-entrypoint-test -t entrypointtest .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in bf423c7dc041
Removing intermediate container bf423c7dc041
 ---> e25354d47b76
Successfully built e25354d47b76
Successfully tagged entrypointtest:latest
[root@suaxi dockerfile]# docker run e25354d47b76
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 同理追加 -l 命令
[root@suaxi dockerfile]# docker run e25354d47b76 -l
total 56
drwxr-xr-x   1 root root 4096 Mar 23 14:12 .
drwxr-xr-x   1 root root 4096 Mar 23 14:12 ..
-rwxr-xr-x   1 root root    0 Mar 23 14:12 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root  340 Mar 23 14:12 dev
drwxr-xr-x   1 root root 4096 Mar 23 14:12 etc
drwxr-xr-x   2 root root 4096 Nov  3 15:22 home
lrwxrwxrwx   1 root root    7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root 4096 Dec  4 17:37 lost+found
drwxr-xr-x   2 root root 4096 Nov  3 15:22 media
drwxr-xr-x   2 root root 4096 Nov  3 15:22 mnt
drwxr-xr-x   2 root root 4096 Nov  3 15:22 opt
dr-xr-xr-x 100 root root    0 Mar 23 14:12 proc
dr-xr-x---   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x  11 root root 4096 Dec  4 17:37 run
lrwxrwxrwx   1 root root    8 Nov  3 15:22 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3 15:22 srv
dr-xr-xr-x  13 root root    0 Mar 22 13:57 sys
drwxrwxrwt   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x  20 root root 4096 Dec  4 17:37 var
 # 可以发现,使用ENTRYPOINT指令,-l命令直接追加在了ls -a之后,且正确执行


4.Tomcat 测试实例

1.准备文件:

5.1准备文件.png


2.编写Dockerfile文件

注:Dockerfile为官方命名,build时会自动查找该文件,不需要 -f 指定文件路径

FROM centos
MAINTAINER suaxi<281463547@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u281-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.27.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.27
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.27
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.27/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.27/logs/catalina.out


3.构建镜像

[root@suaxi dockerfile]# docker build -t diycentos .


4.启动镜像

[root@suaxi dockerfile]# docker run -d -p 8088:8080 --name tomcattest -v /home/test/tomcat/test:/usr/local/apache-tomcat-9.0.27/webapps/test -v /home/test/build/tomcat/logs:/usr/local/apache-tomcat-9.0.27/logs diycentos


5.访问测试


6.发布项目(挂载目录之后在本地编写项目即可)

在挂在路径下新建WEB-INF/web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

</web-app>

cd ..返回上一级,新建index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Docker</title>
</head>
<body>
<h1>Docker Tomcat diy test</h1>
</body>
</html>

外网访问测试成功

5.2访问测试.png

0

评论 (0)

取消