docker

  1. 为什么要用docker

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

  1. docker基本架构

图片.png
对于docker的理解:
可以把docker当成一个虚拟机,不过这个虚拟机中可以部署很多个容器,每个容器对应着一个应用(进程)。
和安装多台虚拟机不同,每个容器中对应的是一个进程,其中的依赖都是被集成到了一个进程所使用的镜像之中,并且使用的是操作系统内核(和完整的操作系统不同,内核只需要提供基本的操作系统功能:进程管理,内存管理等),体积更小,对系统环境的要求更低,也就能做到更高效。

docker中有几个主要部分:
镜像,容器和仓库以及守护主机。
怎么理解呢,镜像就是和平常见到的操作系统镜像类似,其中包括了操作系统程序,稍微不同的地方就是放的东西不同吧,docker的镜像是存放着相关的环境依赖,通过在docker再把这些依赖给读出来,最终在一个进程中进行执行。
容器,可以当成是使用某个进行安装的操作系统(比如虚拟机的安装),略有不同的是,这个操作系统仅仅是作为一个进程存在,并且使用的是更精简的操作系统程序(内核)。容器的启动其实就是一个进程的启动。
仓库,存放镜像的地方,可以提供给用户进行下载。
守护主机:执行容器的主机,也就是虚拟化容器之后要放到哪跑的地方(windows版本安装wsl,或者启用hyper虚拟机)。

  1. docker实战:docker上部署springboot项目

    环境准备

环境要求,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项目就行

图片.png
简单的测试使用,就放一个web层的依赖
图片.png
编写一个测试用的控制器图片.png
打包测试,可以正常运行:
图片.png

编写docker的Dockerfile文件,docker通过这个文件去决定如何创建一个镜像。
Dockerfile文件编写样例(大致框架):
Dockerfile中提供的命令参考:https://docs.docker.com/engine/reference/builder/

  1. # FROM指定容器执行平台,并且设置Base Image
  2. FROM java:8-jre
  3. # 设置生成的镜像文件的作者[author]字段
  4. MAINTAINER Test
  5. # ADD [--chown=<user>:<group>] <src>... <dest>, src可以指定多个
  6. # ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
  7. # The ADD instruction copies new files, directories or remote file URLs from <src> and adds them to the filesystem of
  8. # the image at the path <dest>.
  9. # ADD, 源文件添加到目标文件中,并在生成的目标镜像文件的文件系统中记录
  10. ADD ./target/docker_demo-0.0.1-SNAPSHOT.jar /app/app.jar
  11. # 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.
  12. # CMD为最后执行的参数,也就是最后CMD 跟着的指令才是最终执行的指令
  13. # RUN指令不同,加入到执行队列中,执行完后继续往下执行
  14. # CMD ["executable","param1","param2"] (exec form, this is the preferred form)
  15. # CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
  16. # CMD command param1 param2 (shell form)
  17. CMD ["java", "-Xmx200m", "-jar", "/app/app.jar"]
  18. # EXPOSE <port> [<port>/<protocol>...]
  19. # 规定容器暴露哪些端口,但不是代表容器实际运行的端口,可选协议为TCP协议和UDP协议,默认TCP协议。具体的端口映射在容器运行时通过-p参数进行指定
  20. EXPOSE 2000

build命令生成镜像:
docker build -t demo:v0 .图片.png查看生成的镜像:
docker images -a图片.png
创建容器并执行(运行时需要指定容器端口到主机端口的映射):
使用id为f63ad56cab92的镜像创建容器并执行,-p参数的意思是,容器中正在使用8080端口,并把该端口上的数据转发到主机的2000端口(就是所谓的端口映射)
docker run -p 2000:8080 f63ad56cab92
图片.png
ok,自此docker的基本使用就完成了。

以下是常用的docker命令:

  1. # 查看docker已有镜像文件
  2. docker iamges -a
  3. # 删除镜像文件
  4. docker rmi 镜像文件ID
  5. # 查看所有容器(每个容器对应一个进程)
  6. docker container ps -a
  7. # 查看正在运行的容器
  8. docker container ps
  9. # 删除容器
  10. docker container rm 容器ID
  11. # 停止正在运行的容器
  12. docker container stop 容器Id
  13. # 常用的生成镜像文件的命令,默认Dockfile文件为当前路径下的Dockfile文件
  14. 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示例:

  1. 建立两个springbtoot项目(springboot项目的建立docker部分已说明),并写好dockerfile,保证项目可以正常运行。

图片.png

  1. 编写docker-compose.yml(下面的配置文件直接通过image指定运行的容器,因此需要先生成对应的容器)

配置文件参数参考文档:https://docs.docker.com/compose/compose-file/compose-file-v3/

  1. version: "3.9"
  2. services:
  3. webapp1:
  4. # 容器运行根路径
  5. build: .
  6. # 服务应用对应的容器
  7. image: docker_demo1:latest
  8. # 端口映射
  9. ports:
  10. - "3000:8080"
  11. webapp2:
  12. build: .
  13. image: docker_demo2:latest
  14. ports:
  15. - "4000:8080"
  1. 编写requirement.txt,其中添加需要的依赖镜像,这两个应用没有使用其他的依赖,不需要添加(如果需要,则直接像官方demo中那样,将依赖名写入到文件中)
  2. 执行

docker-compose up图片.png 5. 执行结果(运行的多个容器都可以正常使用则为正常)
图片.png

附-docker-compose命令参考:
https://docs.docker.com/engine/reference/commandline/compose_build/

docker常用命令:
根据当前路径下的docker-compose.yml执行docker-compose
docker compoes up
关闭
docker compose down
重启
docker compose restart
查看目前运行的docker-compose(-a可查看所有)
docker compose ls