Docker(二) 自定义镜像

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: Docker(二) 自定义镜像

一、前言



记得上半年有一个需求是给服务(mysql)兼容oracle数据库,之前没有怎么接触过oracle数据库,也没有安装过,于是从同事那里要来了安装包(windows)的,结果按照步骤安装了好久也启动不起来,然后想卸载掉安装到虚拟机中,按照步骤卸载也卸载不掉,至今还保留在公司的电脑上,恶心的要死。


后来经过公司同事的介绍就开始使用docker了,别说还真的很方便,只要下载oracle镜像,然后通过该镜像创建容器,开箱即用,非常方便。之后陆续下载了redis、mysql、mycat、tomcat和zookeeper等镜像,非常好用。卸载也非常方便,直接移除容器和镜像就可以了,很人性化。


于是我时常在想,这些镜像是怎么创建的呢?其实很简单,镜像可以生成容器,容器反过来也可以做成镜像。我们可以在官方的镜像基础上做定制开发,然后做成自己的镜像。接下来我以tomcat为例,给大家抛砖引玉:


二、 基于官方tomcat镜像做出属于自己的tomcat镜像



1. 从仓库(docker hub)查询tomcat镜像


[root@localhost ~]# docker search tomcat
INDEX       NAME                                    DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/tomcat                        Apache Tomcat is an open source implementa...   2762      [OK]
docker.io   docker.io/tomee                         Apache TomEE is an all-Apache Java EE cert...   79        [OK]
docker.io   docker.io/dordoka/tomcat                Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba...   54                   [OK]
docker.io   docker.io/bitnami/tomcat                Bitnami Tomcat Docker Image                     35                   [OK]
docker.io   docker.io/kubeguide/tomcat-app          Tomcat image for Chapter 1                      28
docker.io   docker.io/consol/tomcat-7.0             Tomcat 7.0.57, 8080, "admin/admin"              17                   [OK]
docker.io   docker.io/cloudesire/tomcat             Tomcat server, 6/7/8                            15                   [OK]
docker.io   docker.io/aallam/tomcat-mysql           Debian, Oracle JDK, Tomcat & MySQL              13                   [OK]
docker.io   docker.io/arm32v7/tomcat                Apache Tomcat is an open source implementa...   10
docker.io   docker.io/rightctrl/tomcat              CentOS , Oracle Java, tomcat application s...   6                    [OK]
docker.io   docker.io/maluuba/tomcat7-java8         Tomcat7 with java8.                             5
docker.io   docker.io/unidata/tomcat-docker         Security-hardened Tomcat Docker container.      4                    [OK]
docker.io   docker.io/amd64/tomcat                  Apache Tomcat is an open source implementa...   2
docker.io   docker.io/arm64v8/tomcat                Apache Tomcat is an open source implementa...   2
docker.io   docker.io/fabric8/tomcat-8              Fabric8 Tomcat 8 Image                          2                    [OK]
docker.io   docker.io/jelastic/tomcat               An image of the Tomcat Java application se...   2
docker.io   docker.io/99taxis/tomcat7               Tomcat7                                         1                    [OK]
docker.io   docker.io/camptocamp/tomcat-logback     Docker image for tomcat with logback integ...   1                    [OK]
docker.io   docker.io/i386/tomcat                   Apache Tomcat is an open source implementa...   1
docker.io   docker.io/oobsri/tomcat8                Testing CI Jobs with different names.           1
docker.io   docker.io/ppc64le/tomcat                Apache Tomcat is an open source implementa...   1
docker.io   docker.io/cfje/tomcat-resource          Tomcat Concourse Resource                       0
docker.io   docker.io/picoded/tomcat7               tomcat7 with jre8 and MANAGER_USER / MANAG...   0                    [OK]
docker.io   docker.io/s390x/tomcat                  Apache Tomcat is an open source implementa...   0
docker.io   docker.io/secoresearch/tomcat-varnish   Tomcat and Varnish 5.0  


2. 从远程仓库拉取镜像


从查询结果可以看出,官方镜像为:tomcat==tomcat:latest


[root@localhost ~]# docker pull tomcat
Using default tag: latest
Trying to pull repository docker.io/library/tomcat ...
latest: Pulling from docker.io/library/tomcat
Digest: sha256:81c2a95e5b1b5867229d75255abe54928d505deb81c8ff8949b61fde1a5d30a1
Status: Image is up to date for docker.io/tomcat:latest
[root@localhost ~]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
docker.io/redis                        latest              235592615444        2 weeks ago         104 MB
docker.io/tomcat                       latest              2eb5a120304e        2 weeks ago         647 MB
docker.io/zookeeper                    latest              454af3da184c        2 weeks ago         252 MB
docker.io/mysql                        latest              be0dbf01a0f3        2 weeks ago         541 MB
docker.io/longhronshens/mycat-docker   latest              f9a4ece7c742        2 years ago    


  1. docker pull tomcat:从远程仓库拉取tomcat镜像
  2. docker images:查询本地镜像


3. 通过tomcat镜像创建运行容器


[root@localhost ~]# docker run -d -p 8081:8080 --name='tomcat01' tomcat
3417598b294342300483207bceeec077cd9b1c702ca6e91c782fb9586694ac5e
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
3417598b2943        tomcat              "catalina.sh run"   34 seconds ago      Up 33 seconds  


  1. docker run -d -p 8081:8080 --name='tomcat01' tomcat:docker run:创建并运行容器;-d:后台运行;-p:端口映射;--name:指定容器别名
  2. docker ps:查询正在运行的容器

4. 页面访问tomcat:http://192.168.43.243:8081/

  1. 192.168.43.243是我虚拟机ip地址(docker宿主机)
  2. 8081:刚才创建容器时映射的端口


640.pngimage

为啥是404呢?


[root@localhost ~]# docker exec -it tomcat01 /bin/bash
root@3417598b2943:/usr/local/tomcat# ls -l
total 132
-rw-r--r--. 1 root root 18982 Jun  3 17:13 BUILDING.txt
-rw-r--r--. 1 root root  5409 Jun  3 17:13 CONTRIBUTING.md
-rw-r--r--. 1 root root 57092 Jun  3 17:13 LICENSE
-rw-r--r--. 1 root root  2333 Jun  3 17:13 NOTICE
-rw-r--r--. 1 root root  3255 Jun  3 17:13 README.md
-rw-r--r--. 1 root root  6898 Jun  3 17:13 RELEASE-NOTES
-rw-r--r--. 1 root root 16262 Jun  3 17:13 RUNNING.txt
drwxr-xr-x. 2 root root  4096 Jun 10 08:17 bin
drwxr-xr-x. 1 root root    21 Jun 27 14:15 conf
drwxr-xr-x. 2 root root  4096 Jun 10 08:17 lib
drwxrwxrwx. 1 root root  4096 Jun 27 14:15 logs
drwxr-xr-x. 2 root root  4096 Jun 10 08:17 native-jni-lib
drwxrwxrwx. 2 root root    29 Jun 10 08:17 temp
drwxr-xr-x. 2 root root     6 Jun 10 08:17 webapps
drwxr-xr-x. 7 root root    76 Jun  3 17:11 webapps.dist
drwxrwxrwx. 2 root root     6 Jun  3 17:10 work
root@3417598b2943:/usr/local/tomcat# cd webapps
root@3417598b2943:/usr/local/tomcat/webapps# pwd
/usr/local/tomcat/webapps
root@3417598b2943:/usr/local/tomcat/webapps# ls -l
total 0
root@3417598b2943:/usr/local/tomcat/webapps# cd ../webapps.dist/
root@3417598b2943:/usr/local/tomcat/webapps.dist# ll
bash: ll: command not found
root@3417598b2943:/usr/local/tomcat/webapps.dist# ls -l
total 12
drwxr-xr-x.  3 root root 4096 Jun 10 08:17 ROOT
drwxr-xr-x. 16 root root 4096 Jun 10 08:17 docs
drwxr-xr-x.  6 root root   78 Jun 10 08:17 examples
drwxr-xr-x.  5 root root   82 Jun 10 08:17 host-manager
drwxr-xr-x.  5 root root 4096 Jun 10 08:17 manager


  1. docker exec -it tomcat01 /bin/bash:进入到tomcat命令交互窗口
  2. ls -l:查看目录下文件
  3. cd webapps:进入到webapps目录,发现webapps目录是空的,所以访问时报404
  4. 它是把webapps中的文件备份到了webapps.dist文件夹里面,==我们只需要把.dist文件夹下的的ROOT文件夹拷贝到webapps目录,我们就可以正常访问了,接下来我们就干这个事情==


5. 将webapps.dist下的ROOT文件夹拷贝到webapps目录下


root@3417598b2943:/usr/local/tomcat/webapps.dist# cp -a /usr/local/tomcat/webapps.dist/ROOT/ /usr/local/tomcat/webapps
root@3417598b2943:/usr/local/tomcat/webapps.dist# cd ../webapps
root@3417598b2943:/usr/local/tomcat/webapps# ls -l
total 4
drwxr-xr-x. 3 root root 4096 Jun 10 08:17 ROOT


上面的linux操作命令比较简单,我就不做说明了


6. 再次访问tomcat:http://192.168.43.243:8081/


640.png


可以访问了,webapps文件夹可以放置自己开发的war包.


7. 提交容器副本使之成为一个新的镜像


  1. docker commit:提交容器副本使之成为一个新的镜像
  2. -a:代表作者
  3. -m:镜像描述
  4. javacfox/mytomcat:1.2:镜像名和版本


640.png


圈中的地方明显和我们刚才创建的描述相同,这个镜像是我们新创建的镜像。


8. 尝试新建镜像是否可用


[root@localhost webapps]# docker run -d -p 8082:8080 --name='myFirstTomcat' javacfox/mytomcat:1.2
1e0d4751d0ce01659ed9ec5e68d6c125a3d2b5e1247b2528fd0860c5896d9053

启动自创镜像,并访问,结果如下:


640.png


自创镜像圆满完成,你可以试试。


三、总结



docker有效的解决了我们开发人员本地是好的,然后运维兄弟会说,你的程序怎么有问题的矛盾。开发人员将本地程序和环境一起打包成一个镜像,运维人员可以开箱即用,不会出现本地是好的而运维或者测试那边问题多多的尴尬情况。您是不是也该了解一下呢?

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
应用服务中间件 nginx 开发者
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
最近一段时间 Docker 镜像一直是 Pull 不下来的状态,感觉除了挂🪜,想直连 Docker Hub 是几乎不可能的。更糟糕的是,很多原本可靠的国内镜像站,例如一些大厂和高校运营的,也陆续关停了,这对我们这些个人开发者和中小企业来说是挺难受的。之前,通过这些镜像站,我们可以快速、方便地获取所需的 Docker 镜像,现在这条路也不行了。感觉这次动作不小,以后想直接访问 Docker Hub 是不可能了。所以我们得想办法搭建自己的私有镜像仓库。
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
|
1天前
|
Java Maven Docker
Spring Boot 构建 Docker 镜像多模式使用详解
Spring Boot 构建 Docker 镜像多模式使用详解
|
3天前
|
应用服务中间件 Linux nginx
详细解读docker国内镜像源docker镜像大全
详细解读docker国内镜像源docker镜像大全
194 0
|
8天前
|
Java Docker 容器
使用 Spring Boot 构建 Docker 镜像并进行多模式部署
使用 Spring Boot 构建 Docker 镜像并进行多模式部署
27 2
|
10天前
|
数据安全/隐私保护 开发者 Docker
国内docker公开镜像站的关闭!别急,docker_image_pusher 使用Github Action将国外的Docker镜像转存到阿里云私有仓库
通过使用 docker_image_pusher 这样的开源项目,我们能够轻松地解决国内访问 Docker 镜像拉取速度慢及拉去失败的问题,同时保证了镜像的稳定性和安全性。利用 Github Action 的自动化功能,使得这一过程更加简单和高效。
506 2
|
16小时前
|
JavaScript 前端开发 数据安全/隐私保护
阿里云云效操作报错合集之流水线中获取不到CI_COMMIT_REF_NAME变量,导致docker镜像打包失败,什么原因
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
20小时前
|
Docker 容器
在 EAS 构建中使用其他 Docker 功能,如自定义 Dockerfile 或多阶段构建
在 EAS 构建中使用其他 Docker 功能,如自定义 Dockerfile 或多阶段构建
|
1天前
|
IDE Serverless 开发工具
函数计算产品使用问题之如何使用Docker镜像作为执行环境
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
1天前
|
存储 Serverless 对象存储
函数计算产品使用问题之项目打包为docker镜像,该如何部署上去
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3天前
|
Docker 容器
Docker镜像、容器操作
Docker镜像、容器操作
21 0