docker
为什么要用docker
是想一下目前的场景:项目写好之后,需要部署到服务器上,那么服务器上就需要安装配置相应的环境。这样一来,没部署一个服务器就需要配置一次环境,假设有个1000台就无了。
docker就是用来解决这个问题的 ,docker将应用及其相关的依赖环境一起打包,然后可以直接运行。
- docker基本架构

对于docker的理解:
可以把docker当成一个虚拟机,不过这个虚拟机中可以部署很多个容器,每个容器对应着一个应用(进程)。
和安装多台虚拟机不同,每个容器中对应的是一个进程,其中的依赖都是被集成到了一个进程所使用的镜像之中,并且使用的是操作系统内核(和完整的操作系统不同,内核只需要提供基本的操作系统功能:进程管理,内存管理等),体积更小,对系统环境的要求更低,也就能做到更高效。
docker中有几个主要部分:
镜像,容器和仓库以及守护主机。
怎么理解呢,镜像就是和平常见到的操作系统镜像类似,其中包括了操作系统程序,稍微不同的地方就是放的东西不同吧,docker的镜像是存放着相关的环境依赖,通过在docker再把这些依赖给读出来,最终在一个进程中进行执行。
容器,可以当成是使用某个进行安装的操作系统(比如虚拟机的安装),略有不同的是,这个操作系统仅仅是作为一个进程存在,并且使用的是更精简的操作系统程序(内核)。容器的启动其实就是一个进程的启动。
仓库,存放镜像的地方,可以提供给用户进行下载。
守护主机:执行容器的主机,也就是虚拟化容器之后要放到哪跑的地方(windows版本安装wsl,或者启用hyper虚拟机)。
docker实战:docker上部署springboot项目
环境准备
- docker的安装(windows版本为例,参考docker官方文档进行安装https://docs.docker.com/desktop/windows/install/)
环境要求,windows版本安装要求安装WSL2(windows subsystem for linux)或者先启用hyper(windows中自带的类似于Vm的虚拟机软件)进行安装linux。不安装可能会出现会在安装docker的时候出现错误。
WSL2的安装:https://docs.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—-download-the-linux-kernel-update-package
hyper的启用:https://www.runoob.com/docker/windows-docker-install.html
- 下载docker进行安装
- idea一般默认带有springboot的开发环境,省略
搭建项目:
- 创建一个简单的springboot项目就行

简单的测试使用,就放一个web层的依赖
编写一个测试用的控制器
打包测试,可以正常运行:
编写docker的Dockerfile文件,docker通过这个文件去决定如何创建一个镜像。
Dockerfile文件编写样例(大致框架):
Dockerfile中提供的命令参考:https://docs.docker.com/engine/reference/builder/
# FROM指定容器执行平台,并且设置Base ImageFROM java:8-jre# 设置生成的镜像文件的作者[author]字段MAINTAINER Test# ADD [--chown=<user>:<group>] <src>... <dest>, src可以指定多个# ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]# The ADD instruction copies new files, directories or remote file URLs from <src> and adds them to the filesystem of# the image at the path <dest>.# ADD, 源文件添加到目标文件中,并在生成的目标镜像文件的文件系统中记录ADD ./target/docker_demo-0.0.1-SNAPSHOT.jar /app/app.jar# There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.# CMD为最后执行的参数,也就是最后CMD 跟着的指令才是最终执行的指令# RUN指令不同,加入到执行队列中,执行完后继续往下执行# CMD ["executable","param1","param2"] (exec form, this is the preferred form)# CMD ["param1","param2"] (as default parameters to ENTRYPOINT)# CMD command param1 param2 (shell form)CMD ["java", "-Xmx200m", "-jar", "/app/app.jar"]# EXPOSE <port> [<port>/<protocol>...]# 规定容器暴露哪些端口,但不是代表容器实际运行的端口,可选协议为TCP协议和UDP协议,默认TCP协议。具体的端口映射在容器运行时通过-p参数进行指定EXPOSE 2000
build命令生成镜像:docker build -t demo:v0 .
查看生成的镜像:docker images -a
创建容器并执行(运行时需要指定容器端口到主机端口的映射):
使用id为f63ad56cab92的镜像创建容器并执行,-p参数的意思是,容器中正在使用8080端口,并把该端口上的数据转发到主机的2000端口(就是所谓的端口映射)docker run -p 2000:8080 f63ad56cab92
ok,自此docker的基本使用就完成了。
以下是常用的docker命令:
# 查看docker已有镜像文件docker iamges -a# 删除镜像文件docker rmi 镜像文件ID# 查看所有容器(每个容器对应一个进程)docker container ps -a# 查看正在运行的容器docker container ps# 删除容器docker container rm 容器ID号# 停止正在运行的容器docker container stop 容器Id号# 常用的生成镜像文件的命令,默认Dockfile文件为当前路径下的Dockfile文件docker build -t 镜像名:标签名 构建镜像文件寻找的基路径
docker-compose
docker-comopse 是啥?
Compose is a tool for defining and running multi-container Docker applications.
一个用来一次性跑多个docker容器应用的工具。
如果不使用这个的话,那么每次启动一个docker应用都需要单独的docker run ...,
docker-compose类似于makefile,通过一个文件定义该如何运行这些docker容器应用。
因此,docker-compose中也有一个类似Makefile的定义文件docker-compose.yml,通过这个文件定义各个应用应该如何运行。
官方demo:
https://docs.docker.com/compose/gettingstarted/
大致流程:
- 编写docker容器的dockerfile应用(保证单个容器可正常部署运行)
- 编写docker-compose文件
- 执行docker-compose
简单springboot项目使用docker-compose示例:
- 建立两个springbtoot项目(springboot项目的建立docker部分已说明),并写好dockerfile,保证项目可以正常运行。

- 编写docker-compose.yml(下面的配置文件直接通过image指定运行的容器,因此需要先生成对应的容器)
配置文件参数参考文档:https://docs.docker.com/compose/compose-file/compose-file-v3/
version: "3.9"services:webapp1:# 容器运行根路径build: .# 服务应用对应的容器image: docker_demo1:latest# 端口映射ports:- "3000:8080"webapp2:build: .image: docker_demo2:latestports:- "4000:8080"
- 编写requirement.txt,其中添加需要的依赖镜像,这两个应用没有使用其他的依赖,不需要添加(如果需要,则直接像官方demo中那样,将依赖名写入到文件中)
- 执行
docker-compose up
5. 执行结果(运行的多个容器都可以正常使用则为正常)
附-docker-compose命令参考:
https://docs.docker.com/engine/reference/commandline/compose_build/
docker常用命令:
根据当前路径下的docker-compose.yml执行docker-composedocker compoes up
关闭docker compose down
重启docker compose restart
查看目前运行的docker-compose(-a可查看所有)docker compose ls
