Docker学习记录 | 字数总计: 3.7k | 阅读时长: 18分钟 | 阅读量:
概述 官网
文档
仓库
安装
安装yum和配置镜像
1 2 3 4 5 6 7 # 安装yum sudo yum install -y yum-utils # 添加阿里云镜像 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
1 2 # 安装最近稳定版docker yum install docker-ce docker-ce-cli containerd.io
启动docker
测试docker
1 2 3 4 5 docker run hello-world # 以下信息表示你的docker安装成功 Hello from Docker! This message shows that your installation appears to be working correctly.
卸载docker
1 2 3 4 5 6 # 卸载docker yum remove docker-ce docker-ce-cli containerd.io # 删除镜像 rm -rf /var/lib/docker rm -rf /var/lib/containerd
阿里云镜像加速 docker run的运行流程图
docker与虚拟机对比,为什么快? docker 的常用命令 帮助命令 1 2 3 4 docker version docker info docker 命令 --help # 帮助命令
帮助文档 命令
docker hub
镜像命令 docker images 查看本地所有镜像
docker search 镜像 搜索镜像
1 2 # 这个搜索是和在docker hub 中搜索是一项的 docker search mysql
docker pull 镜像 [:tag] 下载镜像
1 2 # 默认下载是latest版本 docker pull mysql:5.7
docker rmi 镜像name/id [-f] 删除镜像
1 2 3 4 # 不加版本号,默认是latest docker rmi -f mysql docker rmi -f mysql hello-world # 删除多个镜像 docker rmi -f $(docker images -aq) # 删除所有镜像
容器命令 docker run [参数] image 创建并启动容器
1 2 3 4 5 6 7 8 9 10 11 12 13 docker run -it centos /bin/bash #以交互的方式启动容器 [root@localhost /]# docker run -it centos /bin/bash [root@9dc8ce07f368 /]# ls # @9dc8ce07f368 是容器id bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@9dc8ce07f368 /]# exit #退出并删除容器 exit [root@localhost /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # ex1 docker run -d -p=3344:80 --name=nginx nginx
exit 退出容器
ctrl + p +q 退出容器,但不删除容器
docker ps 查询容器
1 2 3 docker ps #查询正在运行的容器 docker ps -a #查询所有的容器,运行+历史运行的容器 docker ps -q #显示容器id
docker rm 删除容器
1 2 3 docker rm containerid #删除的容器必须停止运行 docker rm $(docker ps -aq) # 删除所有容器 docker ps -aq|xargs docker rm # linux 管道传参
启动和停止容器
1 2 3 4 docker start #启动容器 docker restart #重启容器 docker stop #停止容器 docker kill #强制停止容器
常用的其他命令 查看日志
1 2 3 4 5 # 运行容器 docker run --name test -d centos /bin/sh -c "while true; do $(echo date); sleep 1; done" # 查看日志 docker logs -tf -n 2 --until=2s containerid
查看容器中的进程
1 2 3 4 5 6 7 docker top bc63cfe835fb [root@localhost /]# docker top bc63cfe835fb UID PID PPID C STIME TTY TIME CMD root 123674 123652 0 10:14 ? 00:00:00 /bin/sh -c while true; do date; sleep 1; done root 124989 123674 0 10:23 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1 [root@localhost /]#
查看容器中的元数据
1 docker inspect bc63cfe835fb
进入正在运行的容器
1 2 3 4 5 6 # 进入后,开启一个新的终端 docker exec -it bc63cfe835fb /bin/bash # 进入后,进入正在执行的终端 docker attach bc63cfe835fb
从容器传递文件到主机上
1 2 3 docker cp containerid:path 宿主机上path docker cp test:/home/wangzhe.txt /home/test
查看容器的运行状况
1 2 3 docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 5895b696ec89 tomcat 0.22% 128.3MiB / 2.727GiB 4.59% 15kB / 138kB 2.34MB / 0B 36
补充命令 镜像重命名
1 docker tag imageid updateinfo:tag
镜像打包与加载
1 2 3 docker save -o test.tar 15296797459/diycentos:1.0 docker load
查看容器网络
可视化 portainer 官网
安装
1 2 3 4 5 6 docker pull portainer/portainer-ce docker volume create portainer_data docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce # 9000 是可视化界面的访问地址
Docker 镜像 修改保存镜像 提交修改后的容器为新的镜像
对于下载的镜像修改后,保存为新的镜像,类似于快照
1 2 3 4 5 6 7 8 9 10 11 12 docker commit -a="author" -m="comonent" containerid new_image_name:tag [root@localhost test]# docker commit -a="wangzhe" -m="add a new web app" 5895b696ec89 tomcat_prime:1.0 sha256:156c35decf5d5ea65156111c2bbc2e56930d0f56d0d56520fa047c81cbb1179e [root@localhost test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE # tomcat_prime 1.0 156c35decf5d 5 seconds ago 684MB tomcat latest b00440a36b99 6 days ago 680MB nginx latest 12766a6745ee 9 days ago 142MB portainer/portainer-ce 2.11.1 ed396c816a75 8 weeks ago 280MB portainer/portainer-ce latest ed396c816a75 8 weeks ago 280MB hello-world latest feb5d9fea6a5 6 months ago 13.3kB centos latest 5d0da3dc9764 6 months ago 231MB
容器数据卷 挂载数据卷
1 [root@localhost test]# docker run -it --name centos7 -v /home/test:/home centos /bin/bash
实战:docker 安装mysql 1 2 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql --name mysql -e MYSQL_ROOT_PASSWORD=343621 mysql:latest # 挂载配置文件和数据文件
具名和匿名挂载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 # 具名挂载 docker run --name nginx05 -d -P -v juming-nginx:/etc/nginx nginx # 查询数据卷,匿名数据卷是随机字符串,具名数据卷是有名字的 [root@localhost conf.d]# docker volume ls DRIVER VOLUME NAME local 071c733fcd2db97f0aee68cf338d2ec49f344670b029cd6173c8b247dee33736 local 6694db8ec1e0347998c2b744c40fa4cce16490600da539ca6759c9b54eb0e5af local a4ca0c940bb15e60c655a7d97753d2745783a3db3a6687ec16b4dd8acee86449 local juming-nginx local portainer_data # 查看卷详情 [root@localhost conf.d]# docker volume inspect juming-nginx [ { "CreatedAt": "2022-04-11T16:30:14+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", "Name": "juming-nginx", "Options": null, "Scope": "local" } ] # Mountpoint 是数据卷在宿主机上的位置 # # 具名挂载 # 匿名挂载 # 指定路径挂载 # :ro readonly :rw readwrite docker run --name nginx05 -d -P -v juming-nginx:/etc/nginx:ro nginx docker run --name nginx05 -d -P -v juming-nginx:/etc/nginx:rw nginx
dockerFile dockerfile 就是用来创建镜像的
dockerFile构建镜像时进行卷挂载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 编写dockerfile 文件 # 加的挂载卷,在根目录中 FROM centos VOLUME ["v01", "v02"] CMD echo "----end-----" CMD /bin/bash # 执行创建命令 # -f 文件位置 # -t 创建的镜像名:版本号 # 必须要加上 . docker build -f dockfile1 -t wangzhe/centos:1.0 . # 在宿主机中卷是匿名数据卷 1. 使用 docker inspect container 找mount 2. 使用 docker volume inspect vid 找到挂载路径 3.
数据卷容器 多个容器之间同步数据
1 --volumes-from containerid
mysql数据共享 1 2 docker run --name mysql01 -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=343621 mysql:latest docker run --name mysql01 -d -p 3311:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=343621 mysql:latest
dockerfile dockerfile 指令
所有指令必须大写
指令从上到下执行
每条指令都是一层镜像
1 2 3 4 5 6 7 8 9 10 11 12 FROM container[centos,nginx] #声明父镜像 MAINTAINER 姓名+邮箱 #声明维护者 RUN #镜像构建的时候执行的一些命令 ADD #添加其他镜像,tomcat,jdk,nginx之类的压缩包,会自动解压 WORKDIR #工作目录,进入bash后的所在目录【centos默认是/】 VOLUME #挂载的目录 EXPOSE #暴露的端口配置 CMD #启动容器的时候执行,只会执行最后一条cmd命令,可以被替换但不能被追加 ENTRYPOINT #指定容器启动的时候执行的命令,可以追加命令 ONBUILD #当构建一个被继承的dockfile时,会执行 COPY #类似于add,将我们的文件拷贝到镜像中去 ENV #构建的时候设置的环境变量,构件时传递的参数
构建my-centos 在基础镜像上添加 vim和ipconfig功能,体验dockerfile的命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 FROM centos MAINTAINER wangzhe<2546972682@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 # 构建 docker build -f dockerfile-centos -t dockerfile-centos:1.0 . # 工作目录 和 ifconfig命令可以使用 [root@localhost test-dockfile]# docker run -it --name dockfilecentos 23376f473200 [root@536088d44218 local]# pwd /usr/local [root@536088d44218 local]# ifconfig
CMD 与 ENTRYPOINT 区别 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 cmd 会在运行容器时运行最后一条命令,可以被替换,但不能追加 entrypoint 会在运行容器时运行,可以在后面追加命令 # cmd 执行 ls -a命令 CMD ["ls","-a"] [root@localhost test]# docker run 0d1a612596fa . .. .dockerenv bin dev etc home 。。。 # [root@localhost test]# docker run 0d1a612596fa -l docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown. # [root@localhost test]# docker run 0d1a612596fa ls -al total 0 drwxr-xr-x. 1 root root 6 Apr 12 07:37 . drwxr-xr-x. 1 root root 6 Apr 12 07:37 .. -rwxr-xr-x. 1 root root 0 Apr 12 07:37 .dockerenv lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin drwxr-xr-x. 5 root root 340 Apr 12 07:37 dev drwxr-xr-x. 1 root root 66 Apr 12 07:37 etc drwxr-xr-x. 2 root root 6 Nov 3 2020 home lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64 drwx------. 2 root root 6 Sep 15 2021 lost+found drwxr-xr-x. 2 root root 6 Nov 3 2020 media drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt drwxr-xr-x. 2 root root 6 Nov 3 2020 opt dr-xr-xr-x. 250 root root 0 Apr 12 07:37 proc dr-xr-x---. 2 root root 162 Sep 15 2021 root drwxr-xr-x. 11 root root 163 Sep 15 2021 run lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 Nov 3 2020 srv dr-xr-xr-x. 13 root root 0 Apr 11 07:11 sys drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp drwxr-xr-x. 12 root root 144 Sep 15 2021 usr drwxr-xr-x. 20 root root 262 Sep 15 2021 var
entrypoint命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@localhost test]# docker run 1dc871c9c046 . .. .dockerenv bin dev etc home 。。。。 [root@localhost test]# docker run 1dc871c9c046 -l total 0 drwxr-xr-x. 1 root root 6 Apr 12 07:39 . drwxr-xr-x. 1 root root 6 Apr 12 07:39 .. -rwxr-xr-x. 1 root root 0 Apr 12 07:39 .dockerenv lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin 。。。。。
实战tomcat dockerfile文件以Dockerfile命名,是标准的名字,在构建的时候就不需要加-f
# tomcat 目录
1 2 3 4 5 6 7 8 9 10 # 需要准备tomcat和jdk的压缩文件,使用add命令添加时会自动解压 [root@localhost tomcat]# ll 总用量 155024 drwxr-xr-x. 9 root root 220 4月 12 16:41 apache-tomcat-10.0.20 -rw-r--r--. 1 root root 11915655 4月 12 16:38 apache-tomcat-10.0.20.tar.gz -rw-r--r--. 1 root root 653 4月 12 16:50 Dockerfile drwxr-xr-x. 8 10143 10143 273 12月 16 03:30 jdk1.8.0_321 -rw-r--r--. 1 root root 146815279 4月 12 16:36 jdk-8u321-linux-x64.tar.gz -rw-r--r--. 1 root root 7 4月 12 16:31 readme.txt
#Dockerfile文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@localhost tomcat]# cat Dockerfile FROM centos:centos7 MAINTAINER wangzhe<2546972682@qq.com> COPY readme.txt /usr/local/readme.txt ADD apache-tomcat-10.0.20.tar.gz /usr/local/ ADD jdk-8u321-linux-x64.tar.gz /usr/local RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_321 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-10.0.20 ENV CATALINA_BASH /usr/local/apache-tomcat-10.0.20 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-10.0.20/bin/startup.sh && tail -F /usr/local/apache-tomcat-10.0.20/bin/logs/catalina.out
镜像构建及运行
1 2 3 4 5 6 7 8 9 10 11 12 # 构建镜像不用添加-f docker build -t diy-centos:1.0 . # 运行镜像 docker run -d -p 9090:8080 --name wangzhetomcat -v /home/admin/build/tomcat/test:/usr/local/apache-tomcat-10.0.20/webapps/test \ > -v /home/admin/build/tomcat/tomcatlogs/:/usr/local /apache-tomcat-10.0.20/logs diy-centos:1.0 # 在挂载test 目录中添加项目信息 # 测试地址 192.168.112.128:9090 192.168.112.128:9090/test
发布镜像 发布到 hub.docker.com 1.登录网站
1 docker login -u account -p password
2.push
1 2 3 4 5 6 7 8 [root@localhost .docker]# docker push 15296797459/diycentos:1.0 The push refers to repository [docker.io/15296797459/diycentos] 174b635a5058: Pushed 9f7ffe7837ee: Pushed 34ee798fa05a: Pushed e7f006c9c590: Pushed 174f56854903: Pushed 1.0: digest: sha256:6876bab1fe0fdc9d83bcbbaac25cc744f0eca5a87a4a64179613e193b91da675 size: 1373
发布镜像到阿里云容器镜像服务 …
docker 网络 查看网络
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@localhost /]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:d2:b1:f9 brd ff:ff:ff:ff:ff:ff inet 192.168.112.128/24 brd 192.168.112.255 scope global noprefixroute dynamic ens33 valid_lft 1563sec preferred_lft 1563sec inet6 fe80::d86c:8784:85bc:385d/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:06:40:cc brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:06:40:cc brd ff:ff:ff:ff:ff:ff 5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:b8:de:8e:fb brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever # docker0 是docker的网卡 # 每个容器都对应一个网卡
**启动容器后的ip addr **
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # 容器启动后会多出一个网卡 7: veth6ce638d@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether e2:82:63:8d:f9:d2 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::e082:63ff:fe8d:f9d2/64 scope link valid_lft forever preferred_lft forever # 通过docker inspect containerid 查看容器 ip地址 "SecondaryIPv6Addresses": null, "EndpointID": "fbf8f5976927865501758b0bfffb8f6d9b3ded6b1866d7930fbc9d9e49dc1ade", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "70dee68966da2ee89e5c29d55f358c92c153db0bb239379193e4a79a636ff78e", "EndpointID": "fbf8f5976927865501758b0bfffb8f6d9b3ded6b1866d7930fbc9d9e49dc1ade",
docker0是所有容器的网关,多有容器都与docker0是同一网段
不同容器之间是可以相互 ping 通的
实现ping容器名来连通 –link
这种方式已经不流行了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 使用link链接后可以直接使用容器名称来ping docker run -d -it -P --name tomcat02 --link tomcat01 tomcat # --link 的本质是:在/etc/hosts 文件中添加映射 # 172.17.0.2 tomcat01 3cbc794672f4 [root@localhost /]# docker exec -it tomcat02 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 tomcat01 3cbc794672f4 172.17.0.3 70a222b7a8a2
docker自定义网络 容器互联
网络模式
创建网络
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [root@localhost /]# docker network create -d bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet cac186e0f9036603661970829a8d7efd14564db2a5e7c0687a402e7cde593307 [root@localhost /]# docker network ls NETWORK ID NAME DRIVER SCOPE 70dee68966da bridge bridge local 2bafb20418b7 host host local cac186e0f903 mynet bridge local febb418c2c60 none null local [root@localhost /]# docker network inspect mynet [ { "Name": "mynet", "Id": "cac186e0f9036603661970829a8d7efd14564db2a5e7c0687a402e7cde593307", "Created": "2022-04-13T15:11:40.89222403+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ]
容器使用自定义网络
–net mynet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@localhost /]# docker run --name centos02 -d -it --net mynet centos [root@localhost /]# docker network inspect mynet "Containers": { "3dd7a67c4fca04d2a24d876195260c7e494a72c03af31695ea54e4f30080b33d": { "Name": "centos01", "EndpointID": "37cd1c3199bc6a386efccff45523609f38cc30063f4e6de9f94ce63c49a2c4e6", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/16", "IPv6Address": "" }, "ef58a6b1a377f6516838a00477bee0d6fbef56757dd684d7726e9632df2d00d9": { "Name": "centos02", "EndpointID": "3cba83a82663a555c7a7b3c8c12c01e71d8fddb077d4e97d63ad8cbb49b52f97", "MacAddress": "02:42:c0:a8:00:03", "IPv4Address": "192.168.0.3/16", "IPv6Address": "" } }, ] ping centos02 pong
网络连通 本质上是将容器添加到目标网络中去
docker network connect
1 docker network connect network container
实战:部署redis集群 springboot微服务打包 常见的坑 docker run 之后发现容器停止了
1 2 # docker run image; 如果容器没有启动前台程序,docker没有发现应用,就会自动停止, # nginx 启动后,发现自己没有程序,就会停止运行
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the d
1 2 # 重启服务 service docker restart
推送到hub.docker.com遇到的问题
denied: requested access to the resource is denied
1 2 3 4 5 6 7 8 9 10 11 docker push diy-tomcat:1.0 The push refers to repository [docker.io/library/diy-tomcat] 174b635a5058: Preparing 9f7ffe7837ee: Preparing 34ee798fa05a: Preparing e7f006c9c590: Waiting 174f56854903: Waiting denied: requested access to the resource is denied 原因:push的镜像应该是account/imagesname:version push 15296797459/diytomcat:version