Docker 如今已经应用到软件开发中很多地方,有必要了解一下其相关知识,
**什么是docker?**docker是一款可以将我们目标应用程序和该程序运行所需的配置和依赖库等环境信息打包成镜像并运行的软件工具;
**什么是基础镜像?**它只需要利用操作系统用户空间部分,就能构建出应用所需的环境,将选中的操作系统文件系统和依赖库等,打包成一个类似 "压缩包"的文件,这就是所谓的基础镜像,base image ;
Java项目构建镜像需要 Dockerfile 文件,它只是 描述了要做哪些事情,即构建镜像的具体步骤,但并没有执行,该文件没有后缀名固定为该名称,一般位于Java项目的根目录下;当执行 docker build 命令
(例如:docker build -f /path/to/Dockerfile -t myimage:latest .
这将从 /path/to/ 目录读取 Dockerfile 并构建一个名为 myimage:latest 的镜像)时,docker软件会根据 Dockerfile 文件中说明逐行执行,最终 把应用程序和程序运行需要的依赖库和配置等环境信息一起打包成一个 docker 容器镜像,即container image,使用 docker images 命令可查看本地所有镜像,参考的 Dockerfile 文件参见附录1和2;
再使用docker push 命令
(例如:docker push myimage:v1 这将推送名为myimage、标签为v1的镜像到远程仓库)
把构建出来的容器镜像推送到docker官方dockerHub或公司内部的远程镜像仓库中;
再在其它已安装docker软件的机器上使用docker pull 命令
(例如:docker pull python:latest 或 docker pull python 这将拉取最新版本的 python 镜像到本地)在远程容器镜像仓库中拉取指定名称指定标签的镜像到本地机器上;
然后使用 docker 软件命令 docker run
(例如:docker run -p 8080:80 myJavaApp
这将运行 myJavaApp 镜像,并把本地主机的 8080 端口映射到容器内的 80 端口)
运行指定的容器镜像,即产生镜像实列,也即容器,然后即可对外提供应用服务;
Docker软件架构,是C/S软件架构,client软件对应 docker-cli , server软件对应 docker-daemon;docker-cli对用户输入的命令解析,然后调用服务端的守护进程 docker-daemon 提供的restful api接口,守护进程收到命令后执行 docker 相关操作,创建和管理 docker 各个容器;docker-daemon 内部包含 docker server 和 engine 两部分,docker server 本质就是个 http 服务器,负责对外提供操作容器和镜像的API接口,接口收到API请求后,会分发任务给 engine 层,engine 层会创建各种 job ,由 job 执行具体的工作(如:docker push/pull,docker images,docker build,docker run等等)
docker compose就是按yaml文件中指定顺序和信息部署各个容器,该配置yaml文件(一般名称为 docker-compose.ym l )中写清楚要部署哪些容器,要按什么顺序启动容器,各个容器占用的CPU和内存比例和数量多少等信息,然后通过 docker-compose up 命令解析yaml文件,一键按顺序部署各个容器,即处理多个有顺序部署容器组成的一整套服务的部署,这就是docker compose的主要功能;
为什么各个容器启动有顺序要求?其实主要还是应用启动逻辑有要求,如一个应用必须先启动数据库所在容器,后再启动应用服务所在容器,参考yaml文件例子附录3;
docker swarm 是处理多个有顺序部署容器组成的一整套服务在多个服务器上的集群部署问题,是做K8S软件做的事,也是K8S的竞品;
Docker 和 K8S 的关系,docker compose是基于多个Container容器创建一整套服务,这其实就是K8S里面的Pod功能; K8S可在多个Node节点部署Pod ,每个节点可部署多个Pod ,每个Pod中可以部署多个一般有关联的Container容器 ;docker swarm 作用本质上就是在调度Pod ;
K8S官方定义为容器编排引擎,即以API编程的方式管理安排多个容器的引擎;
Docker的下载和安装
官方rpm包下载地址为:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
阿里镜像下载地址为:
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
**附录1:**Java项目中参考的Dockerfile文件如下:
java
# 基础镜像使用 Java
FROM openjdk:8-jdk-alpine
# 指定维护者信息
LABEL maintainer="yourname@example.com"
# 在镜像中创建一个目录存放我们的应用
VOLUME /tmp
# 将打包好的 jar 文件添加到镜像中并更名为 app.jar
ADD target/your-app.jar app.jar
# 暴露容器内的端口给外部访问
EXPOSE 8080
# 定义环境变量
ENV JAVA_OPTS=""
# 在容器启动时运行 jar 包
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar
**附录2:**构建一个运行python的容器镜像
python
#指定基础镜像
FROM python:3.9
WORKDIR /app
#复制所有文件到容器的 /app 目录下
COPY /app
#安装所需的依赖
RUN yum install gcc
RUN pip install --no-cache-dir -r requirements.txt
#设置容器启动时执行的命令
CMD ["python","app.py"]
**附录3:**docker compose的配置yaml文件参考例子:
java
version:"3.8"
services:
A:
image:"my-image-a"
deploy:
resources:
limits:
cpus:"0.50" #限制cpu使用率为50%
memory:256M #限制内存使用量为256mb
B:
image:"my-image-b"
depends_on:
-A
C:
image:"my-image-c"
depends_on:
-B
总结记录一下,欢迎拍砖讨论...