为了运行Java Web应用程序,需要做的第一件事情是安装Oracle JVM,这个简单的过程可能需要花费五分钟,然后我们需要安装和配置Tomcat、Nginx等中间件,这可能又需要花费十分钟。
对于有经验的程序员这可能不是什么问题,但是当进行微服务部署的时候,你可以需要部署几十个服务,这些服务可能总共有上百个运行实例。随着时间的推移,上述同样的工具和部署流程被一遍遍重复执行,那真的是一种煎熬。
Docker将部署用到的所有工具打包成为一个模板,在Docker中这个模板被称为镜像,这个镜像可以作为构建物,可以用它来构建一个个具体的运行实例。
Docker的英文翻译是码头工人的意思。很形象!码头工人通过一个个集装箱来搬运货物,具体集装箱里面有什么货物承运人不需要太多关心。
简化应用部署:Docker将应用及其依赖打包为一个独立的容器,使得应用可以在不同的环境中进行快速、可靠的部署。
资源利用率高:Docker容器可以共享主机操作系统的内核,因此不需要每个容器都运行一个完整的操作系统,从而节省了系统资源并提高了资源利用率。
快速启动时间:由于Docker容器是轻量级的,相对于传统的虚拟机,它们可以在几秒钟内启动,从而提供了快速的应用启动和扩容能力。
环境一致性:通过Docker,开发、测试和生产环境可以使用相同的容器镜像,保证了环境一致性,减少了由于环境差异引起的问题。
简化持续集成和持续部署:Docker的轻量级和可移植性使得它非常适合集成到持续集成和持续部署的流程中,简化了开发流程。
学习曲线:可能需要一些时间来学习和理解其概念和操作方法。
需要占用一定的内存和CPU资源,当你只部署一个单体应用实例,那就没有必要用Docker。
不建议用Docker来部署数据库
数据的持久化问题:Docker容器本质上是一个可移植的应用程序,容器内的所有数据都是临时性的,如果容器被删除,其中的数据也会被删除。这对于数据库来说,数据是非常重要的,因此在Docker容器内部署数据库存在数据丢失的风险。
性能问题:Docker本身并没有对数据库负载进行优化,因此使用Docker容器部署数据库可能会导致性能下降。
所以数据库一般都是单独的物理机部署。
windows\mac系统直接在官网下载安装就可以,官网地址:https://www.docker.com/。
windows系统需要启用 Hyper-V,点击这里查看启用教程:https://learn.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v
windows系统若出现如下问题,cmd执行wsl --update
以CentOS为例
sudo yum update
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo docker run hello-world
sudo systemctl enable docker
在开始执行Docker命令之前,将镜像、容器及层的概念牢记于心是极其有用的。
镜像是一个包含了完整应用程序运行所需的依赖、库、配置文件和代码的静态文件。它是构建容器的基础,可以被认为是一个只读的模板。镜像是在Dockerfile中定义和构建的,并且可以通过Docker Registry进行存储和共享。
容器是由镜像创建的运行时实例,它可以被启动、停止、启动等类似于操作系统中的进程。容器是在主机操作系统中运行的一个隔离的环境,它与其他容器和主机之间存在隔离和资源限制。
每个容器都是独立的,并且拥有自己的文件系统、网络接口和进程空间。它们与宿主机和其他容器隔离,因此可以在同一台主机上同时运行多个容器,每个容器都可以拥有不同的配置和依赖项。
由于容器是基于镜像创建的,所以它包含了镜像中定义的所有内容和设置。容器可以在不同的环境中移动,并且具有一致的运行行为,因为它们使用相同的基础镜像。容器还可以使用其他容器或网络服务进行通信,从而形成一个完整的应用程序架构。
总之,镜像是用于构建容器的模板,包含了完整的应用程序及其依赖。容器是由镜像创建的运行实例,是一个独立、隔离的环境,可以在不同的平台和环境中进行移动和部署。 Docker通过镜像和容器的使用,提供了一种简化应用程序开发和部署的方式。
以下是Docker常用的命令,我这边以运行Tomcat 8.5
为例。
docker pull tomcat:8.5
docker images
docker inspect tomcat:8.5
通过镜像ID进行删除:
docker rmi image_id
或通过镜像标签进行删除:
docker rmi tomcat:8.5
docker run -d -p 8090:8080 --name mytomcat tomcat:8.5
其中,-d表示在后台运行容器,-p将主机的8090端口映射到容器的8080端口,–name指定容器的名称。
docker stop mytomcat
其中,mytomcat是容器的名称。
docker start mytomcat
docker ps
docker ps -a
docker exec -it mytomcat bash
docker cp local_file_path container_name:/container_file_path
docker cp /本地路径/server.xml mytomcat:/usr/local/tomcat/conf/
# http://localhost:8090/index.html
docker cp /本地路径/index.html mytomcat:/usr/local/tomcat/webapps/ROOT/
其中,local_file_path是本地文件或目录路径,container_name是容器名称,container_file_path是要复制到容器的文件或目录路径。
docker cp container_name:/container_file_path local_file_path
docker cp mytomcat:/usr/local/tomcat/conf/server.xml /本地路径/server.xml
其中,container_name是容器名称,container_file_path是容器中的文件或目录路径,local_file_path是要复制到主机的目标路径。
通过容器ID进行删除:
docker rm b5af73e399cd
或通过容器名称进行删除:
docker rm mytomcat
Dockerfile
文件我们使用tomcat:8.5作为基础镜像,将应用程序的war包复制到Tomcat的webapps目录下。然后,使用EXPOSE指令暴露了镜像中的8080端口,并通过CMD指令设置了Tomcat的启动命令。
# 使用Tomcat 8.5官方镜像作为基础镜像
FROM tomcat:8.5
# 复制编译后的war包到Tomcat的webapps目录下
COPY jpress.war /usr/local/tomcat/webapps/
# 暴露Tomcat的默认HTTP端口
EXPOSE 8080
# 启动Tomcat服务器
CMD ["catalina.sh", "run"]
docker build -t jpress .
docker run -d -p 8080:8080 jpress
浏览器中访问:http://localhost:8080/jpress
本文提供了一个简要介绍关于Docker的概念、使用场景,并分析了它的优点和缺点。同时,还介绍了常用的Docker操作命令,以及如何通过Dockerfile来自定义镜像。通过这篇文章,读者可以初步了解Docker并开始使用它进行应用开发和部署。
Spring Cloud 微服务系列 完整的代码在仓库的sourcecode/spring-cloud-demo
目录下。
gitee(推荐):https://gitee.com/cunzaizhe/xiaohuge-blog
github:https://github.com/tigerleeli/xiaohuge-blog
关注微信公众号:“小虎哥的技术博客”,让我们一起成为更优秀的程序员❤️!