- 一、什么是DockerFile
- 二、Dockerfile的基本结构
- 为 DockerFile 中的注释。
- 三、DockerFile构建过程
- 四、DockerFile文件说明
- 五、实战:构建自己的CentOS
- Dependencies resolved.
- Package Arch Version Repository Size
- Transaction Summary
- Dependencies resolved.
- Package Architecture Version Repository Size
- Transaction Summary
- 七、实战:Tomcat镜像
- 注意这个如果用的跟我一样必须是jdk1.8.0_301,不然后面会报错运行不起来tomcat,深刻教训
- 错误示范:ENV JAVA_HOME /usr/local/jdk8u301 我想当然的就设置了个名字,结果是错的
- 解压后的名字为jdk1.8.0_301,因此这里最好也设置jdk1.8.0_301
- tail -F:等同于—follow=name —retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
一、什么是DockerFile
- Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成映像。
**docker build**命令用于从Dockerfile构建映像。可以在docker build命令中使用**-f**标志指向文件系统中任何位置的Dockerfile。例如**docker build -f /path/to/a/Dockerfile**可以理解为:DockerFile是代码,镜像是代码写好的类,容器是类创建出来的对象
二、Dockerfile的基本结构
DockerFile 一般分为四部分:
DockerFile是面向开发的,我们以后要发布项目,做镜像,就需要编写DockerFile文件,这个文件十分简单
- Docker镜像逐渐成为企业交付的标准,必须要掌握,构建步骤
- 1、编写一个DockerFile文件
- 2、docker build 构建成为一个镜像
- 3、docker run 运行镜像
- 4、docker push 发布镜像
- 步骤:开发,部署,运维……缺一不可
- DockerFile:构建文件,定义了一切的步骤,源代码
- DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
-
四、DockerFile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
1、 一些指令
(1)FROM
指定基础镜像,必须为第一个命令 ```dockerfile 格式: FROM
FROM
:
FROM @
示例: FROM mysql:5.6 注: tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
<a name="zaTeM"></a>### (2)MAINTAINER- **维护者信息**```dockerfile格式:MAINTAINER <name>示例:MAINTAINER Jasper XuMAINTAINER sorex@163.comMAINTAINER Jasper Xu <sorex@163.com>
(3)RUN
- 构建镜像时执行的命令
- 注意:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定—no-cache参数,如:
**docker build --no-cache**```dockerfile RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN
exec执行 格式: RUN [“executable”, “param1”, “param2”]
示例: RUN [“executable”, “param1”, “param2”] RUN apk update RUN [“/etc/execfile”, “arg1”, “arg1”]
<a name="cjNGt"></a>### (4)ADD- **将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget**```dockerfile格式:ADD <src>... <dest>ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例:ADD hom* /mydir/ # 添加所有以"hom"开头的文件ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
(5)COPY
-
(6)CMD
构建容器后调用,也就是在容器启动时才进行调用
- 注意:
- CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
- 每个Dockfile只能有一条CMD命令,如果指定了多条,只有最后一条会执行。
- 如果用户启动容器时指定了运行命令,则会覆盖CMD指定命令。下面的实战部分会分析这部分内容 ```dockerfile 格式: CMD [“executable”,”param1”,”param2”] (执行可执行文件,优先) CMD [“param1”,”param2”] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数) CMD command param1 param2 (执行shell内部命令)
示例: CMD echo “This is a test.” | wc - CMD [“/usr/bin/wc”,”—help”]
<a name="G3fkp"></a>### (7)ENTRYPOINT- **配置容器,使其可执行化。配合CMD可省去"application",只使用参数。**- **注意:ENTRYPOINT与CMD非常类似,不同的是通过**`**docker run**`**执行的命令不会覆盖ENTRYPOINT,而**`**docker run**`**命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。**```dockerfile格式:ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)ENTRYPOINT command param1 param2 (shell内部命令)示例:FROM ubuntuENTRYPOINT ["top", "-b"]CMD ["-c"]
(8)LABEL
- 用于为镜像添加元数据
- 注意:使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
```dockerfile
格式:
LABEL
= = = …
示例: LABEL version=”1.0” description=”这是一个Web服务器” by=”IT笔录”
<a name="KQnu1"></a>### (9)ENV- **设置环境变量**```dockerfile格式:ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行示例:ENV myName John DoeENV myDog Rex The DogENV myCat=fluffy
(10)EXPOSE
- 指定于外界交互的端口
- 注意:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在
**docker run**运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口 ```dockerfile 格式: EXPOSE[ …]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
<a name="TfHF7"></a>### (11)VOLUME- **用于指定持久化目录**- **注意:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:**- **1、卷可以容器间共享和重用**- **2、容器并不一定要和其它容器共享卷**- **3、修改卷后会立即生效**- **4、对卷的修改不会对镜像产生影响**- **5、卷会一直存在,直到没有任何容器在使用它**```dockerfile格式:VOLUME ["/path/to/dir"]示例:VOLUME ["/data"]VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
(12)WORKDIR
- 工作目录,类似于cd命令
- 注意:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用
**docker run**运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。 ```dockerfile 格式: WORKDIR /path/to/workdir
示例: WORKDIR /a (这时工作目录为/a) WORKDIR b (这时工作目录为/a/b) WORKDIR c (这时工作目录为/a/b/c)
<a name="an0ef"></a>### (13)USER- **指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户**- **注意:使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过**`**docker run**`**运行容器时,可以通过-u参数来覆盖所指定的用户。**```dockerfile格式:USER userUSER user:groupUSER uidUSER uid:gidUSER user:gidUSER uid:group示例:USER www
(14)ARG
- 用于指定传递给构建运行时的变量
```dockerfile
格式:
ARG
[= ]
示例: ARG site ARG build_user=www
<a name="HeLq8"></a>### (15)ONBUILD- **用于设置镜像触发器**- **注意:当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发**```dockerfile格式:ONBUILD [INSTRUCTION]示例:ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build --dir /app/src
2、例子
# This my first nginx Dockerfile# Version 1.0# Base images 基础镜像FROM centos#MAINTAINER 维护者信息MAINTAINER tianfeiyu#ENV 设置环境变量ENV PATH /usr/local/nginx/sbin:$PATH#ADD 文件放在当前目录下,拷过去会自动解压ADD nginx-1.8.0.tar.gz /usr/local/ADD epel-release-latest-7.noarch.rpm /usr/local/#RUN 执行以下命令RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpmRUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean allRUN useradd -s /sbin/nologin -M www#WORKDIR 相当于cdWORKDIR /usr/local/nginx-1.8.0RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make installRUN echo "daemon off;" >> /etc/nginx.conf#EXPOSE 映射端口EXPOSE 80#CMD 运行以下命令CMD ["nginx"]
3、总结
五、实战:构建自己的CentOS
1、编写DockerFile配置文件
FROM centos #指定centos为基础镜像MAINTAINER xdd<123456@qq.com> #维护者信息ENV MYPATH /usr/local # $MYPATH="/usr/local"WORKDIR $MYPATH #将工作目录设置为/usr/localRUN yum -y install vim #构建镜像时下载安装vimRUN yum -y install net-tools #构建镜像时下载安装net-toolsEXPOSE 80 #暴露80端口CMD echo $MYPATH #容器启动时输出$MYPATHCMD echo "----end----" #覆盖上一个CMD,容器启动时输出----end----CMD /bin/bash #覆盖上一个CMD,容器启动时进入/bin/bash
2、通过编写的DockerFile文件构建镜像
- 命令说明:
**docker build -f mydockerfile-centos -t mycentos:0.1 .** **docker build -f DockerFile文件路径 -t 镜像名[:TAG]**,.指定从当前目录出发寻找DockerFile ```shell [root@VM-0-15-centos dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 . Sending build context to Docker daemon 2.048kB Step 1/10 : FROM centos —-> 300e315adb2f Step 2/10 : MAINTAINER xdd123456@qq.com —-> Running in 9c08beadb2c8 Removing intermediate container 9c08beadb2c8 —-> e9adad42af2c Step 3/10 : ENV MYPATH /usr/local —-> Running in cdbbbb85ee6b Removing intermediate container cdbbbb85ee6b —-> 8fcacdecf7ad Step 4/10 : WORKDIR $MYPATH —-> Running in 11ea6ae34521 Removing intermediate container 11ea6ae34521 —-> 718b6ad3e5ef Step 5/10 : RUN yum -y install vim —-> Running in a0431f8c2a80 CentOS Linux 8 - AppStream 8.4 MB/s | 8.8 MB 00:01 CentOS Linux 8 - BaseOS 6.4 MB/s | 5.6 MB 00:00 CentOS Linux 8 - Extras 17 kB/s | 10 kB 00:00Dependencies resolved.
Package Arch Version Repository Size
Installing: vim-enhanced x86_64 2:8.0.1763-15.el8 appstream 1.4 M Installing dependencies: gpm-libs x86_64 1.20.7-17.el8 appstream 39 k vim-common x86_64 2:8.0.1763-15.el8 appstream 6.3 M vim-filesystem noarch 2:8.0.1763-15.el8 appstream 48 k which x86_64 2.21-12.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-17.el8.x86_64.rpm 342 kB/s | 39 kB 00:00 (2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 842 kB/s | 48 kB 00:00 (3/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm 5.0 MB/s | 1.4 MB 00:00 (4/5): which-2.21-12.el8.x86_64.rpm 384 kB/s | 49 kB 00:00
(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm 15 MB/s | 6.3 MB 00:00
Total 5.8 MB/s | 7.8 MB 00:01 warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY CentOS Linux 8 - AppStream 1.6 MB/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-12.el8.x86_64 1/5 Installing : vim-filesystem-2:8.0.1763-15.el8.noarch 2/5 Installing : vim-common-2:8.0.1763-15.el8.x86_64 3/5 Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5 Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5 Installing : vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5 Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5 Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64 5/5 Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5 Verifying : vim-common-2:8.0.1763-15.el8.x86_64 2/5 Verifying : vim-enhanced-2:8.0.1763-15.el8.x86_64 3/5 Verifying : vim-filesystem-2:8.0.1763-15.el8.noarch 4/5 Verifying : which-2.21-12.el8.x86_64 5/5
Installed: gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-15.el8.x86_64 vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarch which-2.21-12.el8.x86_64
Complete! Removing intermediate container a0431f8c2a80 —-> b24fe1460a37 Step 6/10 : RUN yum -y install net-tools —-> Running in 8d93802f92ef Last metadata expiration check: 0:00:09 ago on Thu Sep 2 22:08:45 2021.
Dependencies resolved.
Package Architecture Version Repository Size
Installing: net-tools x86_64 2.0-0.52.20160912git.el8 baseos 322 k
Transaction Summary
Install 1 Package
Total download size: 322 k Installed size: 942 k Downloading Packages:
net-tools-2.0-0.52.20160912git.el8.x86_64.rpm 1.5 MB/s | 322 kB 00:00
Total 496 kB/s | 322 kB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Running scriptlet: net-tools-2.0-0.52.20160912git.el8.x86_64 1/1 Verifying : net-tools-2.0-0.52.20160912git.el8.x86_64 1/1
Installed: net-tools-2.0-0.52.20160912git.el8.x86_64
Complete! Removing intermediate container 8d93802f92ef —-> 21faf23714e9 Step 7/10 : EXPOSE 80 —-> Running in 9330ed9b0c59 Removing intermediate container 9330ed9b0c59 —-> 0979d2a554a2 Step 8/10 : CMD echo $MYPATH —-> Running in 44f2eb41253f Removing intermediate container 44f2eb41253f —-> 77875e680c66 Step 9/10 : CMD echo “——end——“ —-> Running in 0d852a5a41ba Removing intermediate container 0d852a5a41ba —-> 6accda5d54d3 Step 10/10 : CMD /bin/bash —-> Running in ebce2e1a01ca Removing intermediate container ebce2e1a01ca —-> e49ddd3b677c Successfully built e49ddd3b677c Successfully tagged mycentos:0.1
<a name="vnndp"></a>## 3、测试运行- 原始centos- `**docker run -it mycentos:0.1**`,`**docker run**`命令如果指定了参数会把CMD里的参数覆盖。这里说明一下,如:`**docker run -it mycentos:0.1 /bin/echo hello**` 命令的参数是指`**/bin/echo hello**`而非`**-it**`,`**-it**`只是docker的参数,而不是容器的参数,因此如果使用此命令,会覆盖CMD的`**/bin/bash**`,输出hello。而这里没有指定参数,因此直接就进入了/bin/bash,而不需要像平时一样`**docker run -it mycentos:0.1 /bin/bash**`多写一个`**/bin/bash**`。想要运行多个命令,可以使用ENTRYPOINT 指令 指定一个文件,文件中写多个指令即可。- 新的centos- 另外,还可以通过`**docker history 镜像ID/镜像名称**`查看镜像的构造历史- `**docker history mycentos:0.1**`,可以看到,最终的centos镜像是一层一层叠加起来的,很符合这个理念图<br /><a name="w6MQn"></a># 六、CMD和ENTRYPOINT区别<a name="zLStA"></a>## 1、CMD```shell#构建DockerFile文件[root@VM-0-15-centos dockerfile]# vim docker-file-cmd#Dockerfile内容FROM centosCMD ["ls","-a"]#构建镜像[root@VM-0-15-centos dockerfile]# docker build -f docker-file-cmd -t cmdtest .Sending build context to Docker daemon 3.072kBStep 1/2 : FROM centos---> 300e315adb2fStep 2/2 : CMD ["ls","-a"]---> Running in 9f3bac8d1665Removing intermediate container 9f3bac8d1665---> 23a0e7ffae6aSuccessfully built 23a0e7ffae6aSuccessfully tagged cmdtest:latest#启动容器,调用了ls -a[root@VM-0-15-centos dockerfile]# docker run cmdtest....dockerenvbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar#想着实现ls -a -l的效果,直接在后面加入-l,那么-l就覆盖了ls -a,因此失败了[root@VM-0-15-centos dockerfile]# docker run cmdtest -ldocker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.#正确的方法实现ls -a -l的效果[root@VM-0-15-centos dockerfile]# docker run cmdtest ls -altotal 56drwxr-xr-x 1 root root 4096 Sep 2 23:28 .drwxr-xr-x 1 root root 4096 Sep 2 23:28 ..-rwxr-xr-x 1 root root 0 Sep 2 23:28 .dockerenvlrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bindrwxr-xr-x 5 root root 340 Sep 2 23:28 devdrwxr-xr-x 1 root root 4096 Sep 2 23:28 etcdrwxr-xr-x 2 root root 4096 Nov 3 2020 homelrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/liblrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64drwx------ 2 root root 4096 Dec 4 2020 lost+founddrwxr-xr-x 2 root root 4096 Nov 3 2020 mediadrwxr-xr-x 2 root root 4096 Nov 3 2020 mntdrwxr-xr-x 2 root root 4096 Nov 3 2020 optdr-xr-xr-x 148 root root 0 Sep 2 23:28 procdr-xr-x--- 2 root root 4096 Dec 4 2020 rootdrwxr-xr-x 11 root root 4096 Dec 4 2020 runlrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbindrwxr-xr-x 2 root root 4096 Nov 3 2020 srvdr-xr-xr-x 13 root root 0 Sep 2 23:28 sysdrwxrwxrwt 7 root root 4096 Dec 4 2020 tmpdrwxr-xr-x 12 root root 4096 Dec 4 2020 usrdrwxr-xr-x 20 root root 4096 Dec 4 2020 var[root@VM-0-15-centos dockerfile]#
2、ENTRYPOINT
#构建DockerFile文件[root@VM-0-15-centos dockerfile]# vim docker-file-entrypoint#Dockerfile内容FROM centosENTRYPOINT ["ls","-a"]#构建镜像[root@VM-0-15-centos dockerfile]# docker build -f docker-file-entrypoint -t entrypointtest .Sending build context to Docker daemon 4.096kBStep 1/2 : FROM centos---> 300e315adb2fStep 2/2 : ENTRYPOINT ["ls","-a"]---> Running in df8bced1251dRemoving intermediate container df8bced1251d---> 0691387ed2a7Successfully built 0691387ed2a7Successfully tagged entrypointtest:latest#启动容器,调用了ls -a[root@VM-0-15-centos dockerfile]# docker run entrypointtest....dockerenvbindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvar#想着实现ls -a -l的效果,直接在后面加入-l,那么ls -a就追加了-l,因此成功了[root@VM-0-15-centos dockerfile]# docker run entrypointtest -ltotal 56drwxr-xr-x 1 root root 4096 Sep 2 23:32 .drwxr-xr-x 1 root root 4096 Sep 2 23:32 ..-rwxr-xr-x 1 root root 0 Sep 2 23:32 .dockerenvlrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bindrwxr-xr-x 5 root root 340 Sep 2 23:32 devdrwxr-xr-x 1 root root 4096 Sep 2 23:32 etcdrwxr-xr-x 2 root root 4096 Nov 3 2020 homelrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/liblrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64drwx------ 2 root root 4096 Dec 4 2020 lost+founddrwxr-xr-x 2 root root 4096 Nov 3 2020 mediadrwxr-xr-x 2 root root 4096 Nov 3 2020 mntdrwxr-xr-x 2 root root 4096 Nov 3 2020 optdr-xr-xr-x 150 root root 0 Sep 2 23:32 procdr-xr-x--- 2 root root 4096 Dec 4 2020 rootdrwxr-xr-x 11 root root 4096 Dec 4 2020 runlrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbindrwxr-xr-x 2 root root 4096 Nov 3 2020 srvdr-xr-xr-x 13 root root 0 Sep 2 23:28 sysdrwxrwxrwt 7 root root 4096 Dec 4 2020 tmpdrwxr-xr-x 12 root root 4096 Dec 4 2020 usrdrwxr-xr-x 20 root root 4096 Dec 4 2020 var#ls -a追加ls -al变成了ls -a ls -al,因此失败[root@VM-0-15-centos dockerfile]# docker run entrypointtest ls -alls: cannot access 'ls': No such file or directory
七、实战:Tomcat镜像
1、文件准备
- 准备镜像文件,tomcat压缩包(官网下载),jdk压缩包(官网下载),新建一个空的readme.txt文件
- 也可用我下载好的,百度网盘链接:https://pan.baidu.com/s/1QjtWSmtvss5fUUex5I_ISQ 提取码:ccfj
2、编写dockerfile文件
- 官方命名 Dockerfile ,build的时候会自动寻找这个文件,就不需要-f指定了 ```dockerfile FROM centos MAINTAINER xdd123456789@qq.com
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u301-linux-x64.tar.gz /usr/local ADD apache-tomcat-10.0.10.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local WORKDIR $MYPATH
注意这个如果用的跟我一样必须是jdk1.8.0_301,不然后面会报错运行不起来tomcat,深刻教训
错误示范:ENV JAVA_HOME /usr/local/jdk8u301 我想当然的就设置了个名字,结果是错的
解压后的名字为jdk1.8.0_301,因此这里最好也设置jdk1.8.0_301
ENV JAVA_HOME /usr/local/jdk1.8.0_301 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.10 ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.10 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
tail -F:等同于—follow=name —retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
CMD /usr/local/apache-tomcat-10.0.10/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.10/logs/catalina.out
<a name="JLLdf"></a>## 3、构建镜像- `**docker build -t diytomcat .**````shell[root@VM-0-15-centos tomcat]# docker build -t diytomcat .Sending build context to Docker daemon 157.4MBStep 1/15 : FROM centos---> 300e315adb2fStep 2/15 : MAINTAINER xdd<123456789@qq.com>---> Running in d3da61a8177aRemoving intermediate container d3da61a8177a---> 9e1df92badf0Step 3/15 : COPY readme.txt /usr/local/readme.txt---> 22fc0081ce2dStep 4/15 : ADD jdk-8u301-linux-x64.tar.gz /usr/local---> f4ec24113686Step 5/15 : ADD apache-tomcat-10.0.10.tar.gz /usr/local---> a1b470e2bd7dStep 6/15 : RUN yum -y install vim---> Running in 614daf07d5b9CentOS Linux 8 - AppStream 9.0 MB/s | 8.8 MB 00:00CentOS Linux 8 - BaseOS 8.2 MB/s | 5.6 MB 00:00CentOS Linux 8 - Extras 11 kB/s | 10 kB 00:00Last metadata expiration check: 0:00:01 ago on Sat Sep 4 16:37:32 2021.Dependencies resolved.================================================================================Package Arch Version Repository Size================================================================================Installing:vim-enhanced x86_64 2:8.0.1763-15.el8 appstream 1.4 MInstalling dependencies:gpm-libs x86_64 1.20.7-17.el8 appstream 39 kvim-common x86_64 2:8.0.1763-15.el8 appstream 6.3 Mvim-filesystem noarch 2:8.0.1763-15.el8 appstream 48 kwhich x86_64 2.21-12.el8 baseos 49 kTransaction Summary================================================================================Install 5 PackagesTotal download size: 7.8 MInstalled size: 30 MDownloading Packages:(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm 328 kB/s | 39 kB 00:00(2/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 824 kB/s | 48 kB 00:00(3/5): which-2.21-12.el8.x86_64.rpm 876 kB/s | 49 kB 00:00(4/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm 4.9 MB/s | 1.4 MB 00:00(5/5): vim-common-8.0.1763-15.el8.x86_64.rpm 16 MB/s | 6.3 MB 00:00--------------------------------------------------------------------------------Total 3.1 MB/s | 7.8 MB 00:02warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs-1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEYCentOS Linux 8 - AppStream 1.6 MB/s | 1.6 kB 00:00Importing GPG key 0x8483C65D:Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65DFrom : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficialKey imported successfullyRunning transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transactionPreparing : 1/1Installing : which-2.21-12.el8.x86_64 1/5Installing : vim-filesystem-2:8.0.1763-15.el8.noarch 2/5Installing : vim-common-2:8.0.1763-15.el8.x86_64 3/5Installing : gpm-libs-1.20.7-17.el8.x86_64 4/5Running scriptlet: gpm-libs-1.20.7-17.el8.x86_64 4/5Installing : vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5Running scriptlet: vim-enhanced-2:8.0.1763-15.el8.x86_64 5/5Running scriptlet: vim-common-2:8.0.1763-15.el8.x86_64 5/5Verifying : gpm-libs-1.20.7-17.el8.x86_64 1/5Verifying : vim-common-2:8.0.1763-15.el8.x86_64 2/5Verifying : vim-enhanced-2:8.0.1763-15.el8.x86_64 3/5Verifying : vim-filesystem-2:8.0.1763-15.el8.noarch 4/5Verifying : which-2.21-12.el8.x86_64 5/5Installed:gpm-libs-1.20.7-17.el8.x86_64 vim-common-2:8.0.1763-15.el8.x86_64vim-enhanced-2:8.0.1763-15.el8.x86_64 vim-filesystem-2:8.0.1763-15.el8.noarchwhich-2.21-12.el8.x86_64Complete!Removing intermediate container 614daf07d5b9---> 05882b638556Step 7/15 : ENV MYPATH /usr/local---> Running in 6f9ed4aba243Removing intermediate container 6f9ed4aba243---> 73f831aacc97Step 8/15 : WORKDIR $MYPATH---> Running in 061a96c81eabRemoving intermediate container 061a96c81eab---> 979f862d9edcStep 9/15 : ENV JAVA_HOME /usr/local/jdk-8u301---> Running in 4a4f4a989d55Removing intermediate container 4a4f4a989d55---> 606ed59a4fa1Step 10/15 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar---> Running in 489c658ba9b4Removing intermediate container 489c658ba9b4---> b43e29dd6f13Step 11/15 : ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.10---> Running in 55dacf225f4dRemoving intermediate container 55dacf225f4d---> 8a4dd8f3878bStep 12/15 : ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.10---> Running in 896ab8940179Removing intermediate container 896ab8940179---> 480c915facd1Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin---> Running in 170db3cfd12aRemoving intermediate container 170db3cfd12a---> ac5dfb75ad04Step 14/15 : EXPOSE 8080---> Running in dd55e8c200aaRemoving intermediate container dd55e8c200aa---> 953bd5a52b36Step 15/15 : CMD /usr/local/apache-tomcat-10.0.10/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.10/logs/catalina.out---> Running in e8f0c4722972Removing intermediate container e8f0c4722972---> ec6d3a066471Successfully built ec6d3a066471Successfully tagged diytomcat:latest
4、启动镜像
**docker run -d -p 9090:8080 --name xdddiytomcat -v /home/tomcat/test:/usr/local/apache-tomcat-10.0.10/webapps/test -v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-10.0.10/logs diytomcat**5、测试访问
添加入站规则

测试访问,但是发现出错了
[root@VM-0-15-centos tomcat]curl localhost:9090curl: (56) Recv failure: connection reset by peer
进入容器查看日志,发现jdk的启动路径写错了。导致当我启动tomcat启动不起来

那就将错就错,进入容器把目录名字改成我设置的错的名字就能找到目录了,设置好后重启容器,再次访问即可
[root@VM-0-15-centos tomcat]# docker exec -it 717 /bin/bash[root@717d4ac1437a local]# lsapache-tomcat-10.0.10 bin etc games include jdk1.8.0_301 lib lib64 libexec readme.txt sbin share src[root@717d4ac1437a local]# mv jdk1.8.0_301 jdk-8u301[root@717d4ac1437a local]# exit[root@VM-0-15-centos tomcat]# docker restart 717717[root@VM-0-15-centos tomcat]# curl localhost:9090

注意:因为我这里Dockerfile就写错了,生成出来的镜像的路径肯定每次也是错的,因此最好重写Dockerfile重新生成镜像,避免每次都要修改路径才能启动tomcat
6、发布项目
由于做了卷挂载,我们直接在本地编写项目就可以发布了 ```xml [root@VM-0-15-centos tomcat]cd /home [root@VM-0-15-centos home]# ls ceshi mysql tomcat www [root@VM-0-15-centos home]# cd tomcat [root@VM-0-15-centos tomcat]# ls test tomcatlogs [root@VM-0-15-centos tomcat]# cd test [root@VM-0-15-centos test]# mkdir WEB-INF [root@VM-0-15-centos test]# cd WEB-INF/ [root@VM-0-15-centos WEB-INF]# vim web.xml
<?xml version=”1.0” encoding=”UTF-8”?>
```jsx[root@VM-0-15-centos WEB-INF]# cd ..[root@VM-0-15-centos test]# lsWEB-INF[root@VM-0-15-centos test]# vim index.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>Hello,小叮当</title></head><body>Hello World!<br/><%out.println("你的 IP 地址 " + request.getRemoteAddr());System.out.println("----my test web logs----");%></body></html>
- 访问成功
**http://IP地址:9090/test**

- 查看日志文件,也能看到响应记录
[root@VM-0-15-centos tomcat]# cd tomcatlogs[root@VM-0-15-centos tomcatlogs]# lscatalina.2021-09-04.log catalina.out localhost.2021-09-04.log localhost_access_log.2021-09-04.txt[root@VM-0-15-centos tomcatlogs]# cat catalina.out


