DockerFile解析
简介
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
步骤:
手动编写一个dockerfile文件,必须否和file的规范
直接使用docker build 命令执行,获取镜像
run
DockerFile构建过程解析
1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2.指令按照从上到下,顺序执行
3.#表示注释
4.每条指令都会创建一个新的镜像层,并对镜像进行提交
1.docker从基础镜像(scratch镜像)运行一个容器
2.执行一条指令并对容器做出修改
3.执行类似docker commit的操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新的容器
5.执行dockerfile中的下一条指令直到所有指令都执行完成
DockerFile体系结构
FROM
基础镜像,当前镜像是基于那个的
MAINTAINER
镜像维护者姓名和邮箱地址
RUN
容器构建时需要运行的命令
EXPOSE
当前容器对外暴露的端口
WORKDIR
指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV
用来构建镜像过程中设置环境变量
ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY
拷贝文件和目录到镜像中。不解压
copy src dest
copy ["src","dest"]
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT
指定一个容器启动时要运行的命令
目的和CMD一样,都是在指定容器启动程序及参数
docker run 之后的参数会被当做参数传递给ENTRYPOUNT,之后形成新的命令组合
ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜 像在被子继承后,父镜像的onbuild被触发
.dockerignore 忽略
案例
Base镜像(scratch), Docker Hub 中99% 的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
1.mkdir -p /zzmmuse/mydockerfile/tomcat9
2.在上述目录下touch.txt
3.将jdk和tomcat安装的压缩包拷贝进上一步目录
apache-tomcat-9.0.8.tar.gz
jdk-8u171-linux-x64.tar.gz
4.在 /zzmmuse/mydockerfile/tomcat9目录下新建Dockerfile文件
5.构建 docker build -t zzmmtomcat9 . 在Dockerfile 当前目录下执行可以不写-f
6.docker images 查看镜像已存在
7.run
8.验证 (宿主机浏览器验证 localhost:9080)
9.结合前述的容器卷将测试的web服务可在test中发布
FROM centos
MAINTAINER zzmm<zzmm123@163.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java和tomcat 添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
build 构建镜像执行打印的结果,报错了
[root@centos7-basic tomcat9]# docker build -f ./Dockerfile -t zzmmtomcat9:1.1 .
Sending build context to Docker daemon 200.7MB
Step 1/15 : FROM centos
---> 0f3e07c0138f
Step 2/15 : MAINTAINER zzmm<zzmm123@163.com>
---> Using cache
---> 7c93ec922dbf
Step 3/15 : COPY ./c.txt /usr/local/cincontainer.txt
---> Using cache
---> 7fa5099b5382
Step 4/15 : ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/
---> Using cache
---> d3dc156c67f5
Step 5/15 : ADD ./apache-tomcat-9.0.8.tar.gz /usr/local/
---> Using cache
---> 660810de99ec
Step 6/15 : RUN yum -y install vim
---> [Warning] IPv4 forwarding is disabled. Networking will not work.
---> Running in b2aa018fb864
CentOS-8 - AppStream 0.0 B/s | 0 B 00:20
CentOS-8 - Base 0.0 B/s | 0 B 00:20
CentOS-8 - Extras 0.0 B/s | 0 B 00:20
No match for argument: vim
Failed to synchronize cache for repo 'AppStream', ignoring this repo.
Failed to synchronize cache for repo 'BaseOS', ignoring this repo.
Failed to synchronize cache for repo 'extras', ignoring this repo.
Error: Unable to find a match
The command '/bin/sh -c yum -y install vim' returned a non-zero code: 1
在docker的宿主机中更改以下
[root@localhost ~]# vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
# systemctl restart network
[root@centos7-basic tomcat9]# docker build -f ./Dockerfile -t zzmmtomcat9:1.1 .
Sending build context to Docker daemon 200.7MB
Step 1/15 : FROM centos
---> 0f3e07c0138f
Step 2/15 : MAINTAINER zzmm<zzmm123@163.com>
---> Running in 164e9aef2d81
Removing intermediate container 164e9aef2d81
---> b3614dc43075
Step 3/15 : COPY c.txt /usr/local/cincontainer.txt
---> 77ef2e28ce61
Step 4/15 : ADD jdk-8u171-linux-x64.tar.gz /usr/local/
---> 21bec90956c5
Step 5/15 : ADD apache-tomcat-9.0.8.tar.gz /usr/local/
---> 9f5c30c6872d
Step 6/15 : RUN yum -y install vim
---> Running in 74e96c7a4822
CentOS-8 - AppStream 1.2 MB/s | 6.3 MB 00:05
CentOS-8 - Base 1.3 MB/s | 7.9 MB 00:05
CentOS-8 - Extras 711 B/s | 2.1 kB 00:03
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-10.el8 AppStream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-15.el8 AppStream 39 k
vim-common x86_64 2:8.0.1763-10.el8 AppStream 6.3 M
vim-filesystem noarch 2:8.0.1763-10.el8 AppStream 48 k
which x86_64 2.21-10.el8 BaseOS 49 k
Transaction Summary
================================================================================
Install 5 Packages
Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm 95 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-10.el8.noarch.rp 422 kB/s | 48 kB 00:00
(3/5): vim-enhanced-8.0.1763-10.el8.x86_64.rpm 1.3 MB/s | 1.4 MB 00:01
(4/5): which-2.21-10.el8.x86_64.rpm 62 kB/s | 49 kB 00:00
(5/5): vim-common-8.0.1763-10.el8.x86_64.rpm 2.1 MB/s | 6.3 MB 00:02
--------------------------------------------------------------------------------
Total 1.3 MB/s | 7.8 MB 00:06
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - AppStream 336 kB/s | 1.6 kB 00:00
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : which-2.21-10.el8.x86_64 1/5
Installing : vim-filesystem-2:8.0.1763-10.el8.noarch 2/5
Installing : vim-common-2:8.0.1763-10.el8.x86_64 3/5
Installing : gpm-libs-1.20.7-15.el8.x86_64 4/5
Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64 4/5
Installing : vim-enhanced-2:8.0.1763-10.el8.x86_64 5/5
Running scriptlet: vim-enhanced-2:8.0.1763-10.el8.x86_64 5/5
Running scriptlet: vim-common-2:8.0.1763-10.el8.x86_64 5/5
Verifying : gpm-libs-1.20.7-15.el8.x86_64 1/5
Verifying : vim-common-2:8.0.1763-10.el8.x86_64 2/5
Verifying : vim-enhanced-2:8.0.1763-10.el8.x86_64 3/5
Verifying : vim-filesystem-2:8.0.1763-10.el8.noarch 4/5
Verifying : which-2.21-10.el8.x86_64 5/5
Installed:
vim-enhanced-2:8.0.1763-10.el8.x86_64 gpm-libs-1.20.7-15.el8.x86_64
vim-common-2:8.0.1763-10.el8.x86_64 vim-filesystem-2:8.0.1763-10.el8.noarch
which-2.21-10.el8.x86_64
Complete!
Removing intermediate container 74e96c7a4822
---> 20b132a3a3d8
Step 7/15 : ENV MYPATH /usr/local
---> Running in 33f3a2648d08
Removing intermediate container 33f3a2648d08
---> 0894c5edfc6d
Step 8/15 : WORKDIR $MYPATH
Removing intermediate container eae56ce1729e
---> ffb5559cade4
Step 9/15 : ENV JAVA_HOME /usr/local/jdk1.8.0_171
---> Running in f72284697782
Removing intermediate container f72284697782
---> 67875ad038a7
Step 10/15 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
---> Running in 2d65bb1e8b1a
Removing intermediate container 2d65bb1e8b1a
---> c744ddc2b035
Step 11/15 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
---> Running in 58d1f2e7fe1c
Removing intermediate container 58d1f2e7fe1c
---> 72bdd4ae3e9f
Step 12/15 : ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
---> Running in 5e19de5e7990
Removing intermediate container 5e19de5e7990
---> be1fd2072d9d
Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin:CATALINA_HOME/lib:$CATALINA_HOME/bin
---> Running in 7708b08db7a5
Removing intermediate container 7708b08db7a5
---> a02b37073462
Step 14/15 : EXPOSE 8080
---> Running in 01760878674b
Removing intermediate container 01760878674b
---> 9271d3f8aefd
Step 15/15 : CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
---> Running in 1a059e217610
Removing intermediate container 1a059e217610
---> 5d88a59e3fff
Successfully built 5d88a59e3fff
Successfully tagged zzmmtomcat9:1.1
[root@centos7-basic tomcat9]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zzmmtomcat9 1.1 5d88a59e3fff 9 minutes ago 688MB
#路径自定义
docker run -d -p 9080:8080 --name myt9 -v /home/zhoumm/homeRoot/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /home/zhoumm/homeRoot/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true zzmmtomcat9:1.1
docker run -d -p 9080:8080 --name myt9
-v /home/zhoumm/homeRoot/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test
-v /home/zhoumm/homeRoot/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs
--privileged=true zzmmtomcat9:1.1
#后台运行 指定端口 指定容器名
#添加容器卷 宿主机目录 容器目录 对应
#添加容器卷 宿主机目录 容器目录 对应
#指定容器为特权容器,特权容器拥有所有的权限
[root@centos7-basic tomcat9]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc2e5800044e zzmmtomcat9:1.1 "/bin/sh -c '/usr/lo…" About a minute ago Up About a minute 0.0.0.0:9080->8080/tcp myt9
# 查看 tomcat9目录,可以发现增加了test和tomcat9logs目录
[root@centos7-basic homeRoot]# cd tomcat9
[root@centos7-basic tomcat9]# ll
total 196016
-rw-r--r--. 1 root root 9818695 Nov 5 08:43 apache-tomcat-9.0.8.tar.gz
-rw-r--r--. 1 root root 0 Nov 5 08:40 c.txt
-rw-r--r--. 1 root root 1104 Nov 5 21:21 Dockerfile
-rw-r--r--. 1 root root 190890122 Nov 5 09:07 jdk-8u171-linux-x64.tar.gz
drwxr-xr-x. 2 root root 6 Nov 5 22:22 test
drwxr-xr-x. 2 root root 197 Nov 5 22:22 tomcat9logs
# -d 以后台模式启动容器
此时如果想进入容器进行操作,可用exec指令,启动一个伪终端以交互式的方式进入某个容器
docker exec 71e542e90cb0 ls -l
[root@centos7-basic tomcat9]# docker exec fc2e5800044e java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
发布测试案例
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>test</display-name>
</web-app>
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
-----------welcome-----------------
<%="I am in docker tomcat self "%>
<br>
<br>
<% System.out.println("=============docker tomcat self");%>
</body>
</html>