User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   More   ›   Docker   ›   正文
Docker

Docker—DockerFile(五)

2020-11-01 23:05:36
1464  0 0
参考目录 隐藏
1) 什么是DockerFile
2) DockerFile构建过程
3) 基础知识:
4) Dockerfile两⼤特性
5) 流程:
6) 说明:
7) DockerFile指令
8) 实战测试
9) 自定义一个 centos
10) CMD 和 ENTRYPOINT 的区别
11) 自定义镜像 tomcat
12) 发布镜像
13) 流程总结:

阅读完需:约 17 分钟

我们要研究自己如何做一个镜像,而且我们写的微服务项目以及springboot打包上云部署,Docker就是 最方便的。

微服务打包成镜像,任何装了Docker的地方,都可以下载使用,极其的方便。 流程:开发应用=>DockerFile=>打包为镜像=>上传到仓库(私有仓库,公有仓库)=> 下载镜像 => 启动 运行。 还可以方便移植!

什么是DockerFile

dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。 构建步骤:

  • 1、编写DockerFile文件
  • 2、docker build 构建镜像
  • 3、docker run docker file文件

官方的内容:

DockerFile构建过程

基础知识:

  • 1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 2、指令按照从上到下,顺序执行
  • 3、# 表示注释
  • 4、每条指令都会创建一个新的镜像层,并对镜像进行提交

Dockerfile两⼤特性

  • 分层进⾏堆叠
    • from -> maintainer -> wordir -> add 可以把from理解为汉堡最下⾯的⾯包⽚,在这个⾯包⽚上添加对应的蔬菜,⾁,直到add把这些覆盖上,形成⼀个完整的汉堡
  • 系统快照
    • 通过docker临时容易体现出来
    • from->add的每⼀步都会⽣成临时容
    • 作⽤:在每⼀步执⾏完后,docker都会对当前运⾏的系统环境⽣成⼀个快照,快照是以临时容器的⽅式来体现,相当于玩游戏时存档,临时容器可以理解为存档
    • 好处:临时容器可重⽤,极⼤加快了镜像的构建速度以及节省系统资源,⽐如在部署⼀个新镜像时,前3步和之前tomcat镜像build都⼀样,所以只需将第四步add进⾏重新的临时容器构建

流程:

  • 1、docker从基础镜像运行一个容器
  • 2、执行一条指令并对容器做出修改
  • 3、执行类似 docker commit 的操作提交一个新的镜像层
  • 4、Docker再基于刚提交的镜像运行一个新容器
  • 5、执行dockerfile中的下一条指令直到所有指令都执行完成!

说明:

从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。

  1. DockerFile 是软件的原材料 (代码)
  2. Docker 镜像则是软件的交付品 (.apk)
  3. Docker 容器则是软件的运行状态 (客户下载安装执行)

DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!

DockerFile:需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容 包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进 程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace的权 限控制)等等。

Docker镜像:在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行 Docker 镜像时,会真正开始提供服务;

Docker容器:容器是直接提供服务的。

DockerFile指令

关键字:

FROM          # 基础镜像,当前新镜像是基于哪个镜像的
- FORM - 基于基准镜像
- 基准镜像:构建新镜像时,依托于哪个原有镜像进⾏扩展
- 从远程仓库拉取tomcat镜像,并创建⼀个临时的容器,⽤于镜像的构建
- 临时容器:⽤于镜像的构建,不可以直接使⽤
- id:临时容器
- FROM scratch 不依赖于任何⼈基准镜像base image

MAINTAINER    # 镜像维护者的姓名混合邮箱地址
- LABEL&MAINTANER - 说明信息
- LABEL:描述信息,这些信息不会产⽣实质的影响,只供阅读
- MAINTAINER zhanghp.com
- LABEL version="1.0"
- LABEL description="⼀⼆三"

EXPOSE        # 当前容器对外保留出的端口
-  将容器内部端⼝暴露给物理机
- EXPOSE 8080
- docker run -p 8000:8080 tomcat

WORKDIR       # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
- ⼯作⽬录可分为
- 1. 绝对路径
- 2. 相对路径:⽤"."即可代表当前路径,如WORKDIR .

ENV           # 用来在构建镜像过程中设置环境变量
- ENV JAVA_HOME /usr/local/openjdk8
- 作⽤:⽤JAVA_HOME常量代替了后⾯的路径
- 好处:如果以后环境变量变了,只需改ENV中的路径⼀处即可,其他所有引⽤的地⽅
都发⽣变化

ADD           # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY          # 类似ADD,拷贝文件和目录到镜像中!
- ADD & COPY - 赋值⽂件
- copy和add是⼀样的
- add:⽀持⽂件的解压缩,抓取远程⽂件功能(不常⽤)

VOLUME        # 容器数据卷,用于数据保存和持久化工作

CMD           # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
RUN           # 容器构建时需要运行的命令
ENTRYPOINT    # 指定一个容器启动时要运行的命令!和CMD一样
- RUN : 在build构建时执⾏该命令
- CMD:在容器启动后执⾏默认的命令或参数
- ENTRYPOINT ⼊⼝点:容器启动时执⾏命令
* ENTRYPOINT
- ENTRYPOINT ⼊⼝点:容器启动时执⾏命令
- Dockerfile中只有最后⼀个ENTRYPOINT会被执⾏
- ENTRYPOINT ["ps"] #推荐使⽤Exec格式
* CMD
- 如Dockerfile中出现多个CMD,则只有最后⼀个被执⾏
- 如容器启动时附加指令,则CMD被忽略
- CMD ["ps" , "-ef"] #推荐使⽤Exec格式
entrypoint⼀定被运⾏,cmd不⼀定被运⾏

// 区别
* run和cmd区别
在usr/images下创建⽬录,其⾥⾯创建dockerfile⽂件
docker run 会执⾏cmd ["echo","aa"]中的aa
⽽docker build 不会
* cmd详解
若在docker run 后加别的命令如ls,会取代原有的cmd来执⾏
* entrypoint和cmd
ps -ef 查看进程的完整格式
ps -aux 查看进程列表
若上⾯是ENTRYPOINT ⽽下⽅紧跟着cmd,会联合使⽤
好处:
cmd可从外界传参,⽐⽅采⽤aux命令显示进程列表,可通过docker run
zhanghp.com/docker_run -aux 替代原有dockerfile的cmd

ONBUILD       # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发

实战测试

Docker Hub 中99% 的镜像都是通过在base镜像(Scratch)中安装和配置需要的软件构建出来的

自定义一个 centos

1、编写DockerFile 查看下官方默认的CentOS的情况:

目的:使我们自己的镜像具备如下:登陆后的默认路径、vim编辑器、查看网络配置ifconfig支持

1、准备编写DockerFlie文件

[root@VM-0-13-centos home]# mkdir dockerfile-test
[root@VM-0-13-centos home]# ls -l
total 24
drwxr-xr-x 2 root root 4096 Oct 29 14:47 ceshi
drwxr-xr-x 2 root root 4096 Nov  1 22:42 dickerfile
drwxr-xr-x 2 root root 4096 Nov  1 22:43 dockerfile-test
drwxr-xr-x 2 root root 4096 Nov  1 22:42 docker-test-volume
drwxr-xr-x 4 root root 4096 Oct 29 15:21 mysql
-rw-r--r-- 1 root root    0 Oct 28 11:08 test.java
drwxr-xr-x 3 root root 4096 Nov  1 22:43 xjhfile
-rw-r--r-- 1 root root    0 Oct 28 11:07 xjh.java
[root@VM-0-13-centos home]# vim mydockerfile-centos
[root@VM-0-13-centos home]# cat mydockerfile-centos
FROM centos
MAINTAINER XJH<213124234@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 .

会看到 docker build 命令最后有一个 . . 表示当前目录****

[root@VM-0-13-centos home]# docker build -f mydockerfile-centos -t mycentos:11.1 .
Sending build context to Docker daemon    390MB
Step 1/10 : FROM centos
 ---> 0d120b6ccaa8
Step 2/10 : MAINTAINER XJH<22343254345@qq.com>
 ---> Running in d6910b12c8a2
Removing intermediate container d6910b12c8a2
 ---> e47a63c1f445
Step 3/10 : ENV MYPATH /usr/local
 ---> Running in 0f934e5f849e
Removing intermediate container 0f934e5f849e
 ---> d20dacc641f9
Step 4/10 : WORKDIR $MYPATH
 ---> Running in 74a2500ae0cb
Removing intermediate container 74a2500ae0cb
 ---> 45c999aa834e
Step 5/10 : RUN yum -y install vim
 ---> Running in aa2aa71c3969
CentOS-8 - AppStream                            3.5 MB/s | 5.8 MB     00:01    
CentOS-8 - Base                                 1.3 MB/s | 2.2 MB     00:01    
CentOS-8 - Extras                                14 kB/s | 8.1 kB     00:00    
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-13.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-13.el8         AppStream      6.3 M
 vim-filesystem      noarch      2:8.0.1763-13.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: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm        406 kB/s |  39 kB     00:00    
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp 1.3 MB/s |  48 kB     00:00    
(3/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm  8.6 MB/s | 1.4 MB     00:00    
(4/5): which-2.21-12.el8.x86_64.rpm             366 kB/s |  49 kB     00:00    
(5/5): vim-common-8.0.1763-13.el8.x86_64.rpm     18 MB/s | 6.3 MB     00:00    
--------------------------------------------------------------------------------
Total                                           3.9 MB/s | 7.8 MB     00:01     
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                            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-13.el8.noarch                2/5 
  Installing       : vim-common-2:8.0.1763-13.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-13.el8.x86_64                  5/5 
  Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64                  5/5 
  Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64                    5/5 
  Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          1/5 
  Verifying        : vim-common-2:8.0.1763-13.el8.x86_64                    2/5 
  Verifying        : vim-enhanced-2:8.0.1763-13.el8.x86_64                  3/5 
  Verifying        : vim-filesystem-2:8.0.1763-13.el8.noarch                4/5 
  Verifying        : which-2.21-12.el8.x86_64                               5/5 

Installed:
  gpm-libs-1.20.7-15.el8.x86_64         vim-common-2:8.0.1763-13.el8.x86_64    
  vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch
  which-2.21-12.el8.x86_64             

Complete!
Removing intermediate container aa2aa71c3969
 ---> 7b7467c1ffb8
Step 6/10 : RUN yum -y install net-tools
 ---> Running in c9eee0c737c1
Last metadata expiration check: 0:00:08 ago on Sun Nov  1 14:46:28 2020.
Dependencies resolved.
================================================================================
 Package         Architecture Version                        Repository    Size
================================================================================
Installing:
 net-tools       x86_64       2.0-0.51.20160912git.el8       BaseOS       323 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 323 k
Installed size: 1.0 M
Downloading Packages:
net-tools-2.0-0.51.20160912git.el8.x86_64.rpm   1.4 MB/s | 323 kB     00:00    
--------------------------------------------------------------------------------
Total                                           437 kB/s | 323 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.51.20160912git.el8.x86_64              1/1 
  Running scriptlet: net-tools-2.0-0.51.20160912git.el8.x86_64              1/1 
  Verifying        : net-tools-2.0-0.51.20160912git.el8.x86_64              1/1 

Installed:
  net-tools-2.0-0.51.20160912git.el8.x86_64                                     

Complete!
Removing intermediate container c9eee0c737c1
 ---> 0e3feb4b8478
Step 7/10 : EXPOSE 80
 ---> Running in 680cf0aede12
Removing intermediate container 680cf0aede12
 ---> 98961ff00302
Step 8/10 : CMD echo $MYPATH
 ---> Running in ae88d77c2063
Removing intermediate container ae88d77c2063
 ---> ef4febaf814e
Step 9/10 : CMD echo "----------end--------"
 ---> Running in 50469654f942
Removing intermediate container 50469654f942
 ---> 1618e137fb44
Step 10/10 : CMD /bin/bash
 ---> Running in 4e58050ffa71
Removing intermediate container 4e58050ffa71
 ---> 5ea976ba3f49
Successfully built 5ea976ba3f49
Successfully tagged mycentos:11.1

3、运行

docker run -it 新镜像名字:TAG

可以看到,我们自己的新镜像已经支持 vim/ifconfig的命令,扩展OK!

4、列出镜像地的变更历史

docker history 镜像名

docker history 再现完整构建命令

docker history --format {{.CreatedBy}} --no-trunc=true mysql:8|sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g" | tac
[root@VM-0-13-centos composetest]# docker history --format {{.CreatedBy}} --no-trunc=true mycentos:11.1|sed "s/\/bin\/sh\ -c\ \#(nop)\ //g"|sed "s/\/bin\/sh\ -c/RUN/g" | tac 
ADD file:538afc0c5c964ce0dde0141953a4dcf03c2d993c5989c92e7fee418e9305e2a3 in / 
 LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20200809
 CMD ["/bin/bash"]
 MAINTAINER XJH<22343254345@qq.com>
 ENV MYPATH=/usr/local
WORKDIR /usr/local
RUN yum -y install vim
RUN yum -y install net-tools
 EXPOSE 80
 CMD ["/bin/sh" "-c" "echo $MYPATH"]
 CMD ["/bin/sh" "-c" "echo \"----------end--------\""]
 CMD ["/bin/sh" "-c" "/bin/bash"]

CMD 和 ENTRYPOINT 的区别

我们之前说过,两个命令都是指定一个容器启动时要运行的命令

CMD:Dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数 替换!

ENTRYPOINT: docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合!

测试:

CMD命令

# 1、构建dockerfile
[root@kuangshen home]# vim dockerfile-cmd-test
[root@kuangshen home]# cat dockerfile-cmd-test
FROM centos
CMD [ "ls", "-a" ]

# 2、build 镜像
[root@kuangshen home]# docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon 22.02kB
Step 1/2 : FROM centos
---> 470671670cac
Step 2/2 : CMD [ "ls", "-a" ]
---> Running in a3072987de38
Removing intermediate container a3072987de38
---> 554bc6952657
Successfully built 554bc6952657
Successfully tagged cmdtest:latest

# 3、执行
[root@kuangshen home]# docker run 554bc6952657
.dockerenv
bin
dev
etc
home
lib
lib64
......

# 4、如果我们希望用 -l 列表展示信息,我们就需要加上 -l参数
[root@kuangshen home]# docker run cmdtest -l
docker: Error response from daemon: OCI runtime create failed:
container_linux.go:349: starting container process caused "exec: \"-l\":
executable file not found in $PATH": unknown.

# 问题:我们可以看到可执行文件找不到的报错,executable file not found。
# 之前我们说过,跟在镜像名后面的是 command,运行时会替换 CMD 的默认值。
# 因此这里的 -l 替换了原来的 CMD,而不是添加在原来的 ls -a 后面。而 -l 根本不是命令,所
以自然找不到。
# 那么如果我们希望加入 -l 这参数,我们就必须重新完整的输入这个命令:
docker run cmdtest ls -al

ENTRYPOINT命令

# 1、构建dockerfile
[root@kuangshen home]# vim dockerfile-entrypoint-test
[root@kuangshen home]# cat dockerfile-entrypoint-test
FROM centos
ENTRYPOINT [ "ls", "-a" ]

# 2、build 镜像
[root@kuangshen home]# docker build -f dockerfile-entrypoint-test -t
entrypointtest .
Sending build context to Docker daemon 23.04kB
Step 1/2 : FROM centos
---> 470671670cac
Step 2/2 : ENTRYPOINT [ "ls", "-a" ]
---> Running in bac4ae055630
Removing intermediate container bac4ae055630
---> ae07199f9144
Successfully built ae07199f9144
Successfully tagged entrypointtest:latest

# 3、执行
[root@kuangshen home]# docker run ae07199f9144
.dockerenv
bin
dev
etc
home
lib
lib64
......

# 4、测试-l参数,发现可以直接使用,这里就是一种追加,我们可以明显的知道 CMD 和
ENTRYPOINT 的区别了
[root@kuangshen home]# docker run entrypointtest -l
total 56
drwxr-xr-x 1 root root 4096 May 12 04:21 .
drwxr-xr-x 1 root root 4096 May 12 04:21 ..
-rwxr-xr-x 1 root root 0 May 12 04:21 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 12 04:21 dev
drwxr-xr-x 1 root root 4096 May 12 04:21 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
.....

自定义镜像 tomcat

1、mkdir -p kuangshen/build/tomcat
2、在上述目录下 touch read.txt
3、将 JDK 和 tomcat 安装的压缩包拷贝进上一步目录
4、在 /kuangshen/build/tomcat 目录下新建一个Dockerfile文件

# vim Dockerfile

FROM centos
MAINTAINER kuangshen<24736743@qq.com>
#把宿主机当前上下文的read.txt拷贝到容器/usr/local/路径下
COPY read.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.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_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.22/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.22/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F
/usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

当前文件状态

5、构建镜像

[root@kuangshen tomcat]# docker build -t diytomcat .
.....
Successfully built ffdf6529937d
Successfully tagged diytomcat:latest # 构建完成
# 查看确定构建完毕!
[root@kuangshen tomcat]# docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
diytomcat latest ffdf6529937d 20 seconds ago
636MB

6、运行启动 run

docker run -d -p 9090:8080 --name mydiytomcat -v
/home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat9.0.22/webapps/test -v
/home/kuangshen/build/tomcat/tomcat9logs/:/usr/local/apache-tomcat9.0.22/logs --privileged=true diytomcat

备注:Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied 解决办法:在挂载目录后多加一个–privileged=true参数即可

7、验证测试访问! curl localhost:9090

8、结合前面学习的容器卷将测试的web服务test发布

web.xml

<?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>

a.jsp

<%@ 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>hello,kuangshen</title>
</head>
<body>
-----------welcome------------
<%=" my docker tomcat,kuangshen666 "%>
<br>
<br>
<% System.out.println("-------my docker tomcat-------");%>
</body>
</html>

9、测试

# 查看日志
[root@kuangshen tomcat]# cd tomcat9logs/
[root@kuangshen tomcat9logs]# ll
total 24
-rw-r----- 1 root root 6993 May 12 12:50 catalina.2020-05-12.log
-rw-r----- 1 root root 7024 May 12 12:53 catalina.out
-rw-r----- 1 root root 0 May 12 12:47 host-manager.2020-05-12.log
-rw-r----- 1 root root 408 May 12 12:47 localhost.2020-05-12.log
-rw-r----- 1 root root 150 May 12 12:53 localhost_access_log.2020-05-12.txt
-rw-r----- 1 root root 0 May 12 12:47 manager.2020-05-12.log
[root@kuangshen tomcat9logs]# cat catalina.out
....
-------my docker tomcat------- # 搞定

发布镜像

注册dockerhub https://hub.docker.com/signup,需要有一个账号

# 1、查看登录命令
[root@kuangshen tomcat]# docker login --help
Usage: docker login [OPTIONS] [SERVER]

# 2、登录
[root@kuangshen tomcat]# docker login -u kuangshen
Password:
WARNING! Your password will be stored unencrypted in
/root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentialsstore
Login Succeeded

# 3、将镜像发布出去
[root@kuangshen tomcat]# docker push kuangshen/diytomcat:1.0
The push refers to repository [docker.io/library/diytomcat]
0f02399c6fdf: Preparing
e79ea0c3a34e: Preparing
09281fa8fe38: Preparing
b56a902b0aef: Preparing
0683de282177: Preparing
# 拒绝:请求的资源访问被拒绝
denied: requested access to the resource is denied
# 问题:本地镜像名无帐号信息,解决加 tag即可
docker tag 251ca4419332 kuangshen/diytomcat:1.0
# 再次 push, ok
[root@kuangshen tomcat]# docker push kuangshen/diytomcat:1.0
The push refers to repository [docker.io/kuangshen/diytomcat]
0f02399c6fdf: Pushing [========> ]
9.729MB/59.76MB
e79ea0c3a34e: Pushing [==========> ]
3.188MB/15.41MB
09281fa8fe38: Pushing [> ]
3.823MB/324MB
b56a902b0aef: Pushed
0683de282177: Pushing [=> ]
5.997MB/237.1MB

流程总结:

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

0 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 294点赞 594084浏览

随机文章
SpringCloud—负载均衡器概览
5年前
SpringBoot—JPA整合
5年前
URI和URL的区别
5年前
SpringBoot—logback日志配置
5年前
PostgreSQL—测试工具PGbench
3年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:1927 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2025 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 594084 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付