针对docker的入门知识点梳理
技术文档:
一. docker:
-
啥是docker:
简单来理解的话,docker就是一个进程隔离后的虚拟机。在使用的过程中将其理解为linux虚拟机即可。
-
我们为什么使用docker:
-
快速交付:
-
想象下面一个场景:
开发人员在linux环境下完成部分开发,想要给客户RV阶段成果。可是客户使用的windows系统构筑环境时出了问题,于是开发团队通过远程操作等一系列手段解决了环境问题。然后教客户如何在代码更新后部署项目。
这里会暴露几个问题:
- 当客户的客户也想RV成果呢?
- 开发团队使用的语言从java变成了nodejs呢?
- docker的解决方案:
- 开发团队编写好dockerfile和readme,客户只需要安装适合自己操作系统的docker,之后执行两行命令即可运行项目
-
-
自动化部署/测试
- 我们公司gitlab使用的ci,就是通过docker构造出容器,在其内完成打包,lint,测试以及发布。
-
纯净的host
- 公司的公开demo网站,在一台服务器上面发布了不下30个项目,用到的技术数不胜数,使用docker令其不必考虑每个项目需要什么环境,也不必考虑项目之间环境的冲突。
-
-
镜像与容器:
-
镜像-image:
接触过虚拟机的人很清楚,镜像是用来构建虚拟系统的基石,通过相同的镜像文件可以生成完全一致的虚拟操作系统。
-
容器-container:
"Linux容器"是对"linux操作系统"的进程隔离,而docker的容器,是对Linux容器的封装。暂时可以将其简单理解为只有命令行交互的linux操作系统,容器便是项目真正运行时的环境。
-
-
本地镜像的构建:
- 从docker hub 提供的镜像源pull。
- 通过dockerfile构建。
-
容器的构建:
- 概念与虚拟机构建相同,实际操作通过image跑出其对应的容器。指令参照菜鸟教程
简单示例: docker build -f ./Dockerfile -t xxxxxx:v1.0.0
- 概念与虚拟机构建相同,实际操作通过image跑出其对应的容器。指令参照菜鸟教程
二.dockerfile
-
啥是dockerfile:
客户运行的项目在docker容器上,而构造容器需要镜像,dockerfile就是用来构造镜像的命令集。
-
构造方式:
- 先上个文档dockerfile
- 如果将docker想象成linux的话,那么部署一个javaweb项目到linux上,需要几步呢?
- 在linux上下载好服务器,我们这里使用tomcat
- 将项目打成war包,放至tomcat的webapps目录下
- 启动tomcat,公开linux的8080端口
- 通过ip:8080/ 即可访问API
- 那么在docker中,这些事情要如何完成呢?上例子。
-
先编写一个dockerfile
这里使用multistage build方式,即build环境与运行环境分开,以保证运行时环境纯净。
# 使用docker hub 上提供的maven镜像build war包 FROM maven:3.6.3 as api-builder # 拷贝host内容至虚拟机 COPY pom.xml /usr/local/ COPY src /usr/local/src # 执行mvn打包指令 RUN mvn -f /usr/local/pom.xml clean package # 使用docker hub 上提供的tomcat运行项目 FROM tomcat:9.0 RUN apt-get update WORKDIR /usr/local/tomcat/webapps/ # 将maven环境中的war包拷贝至tomcat环境 COPY --from=api-builder /usr/local/target/xxx.war /usr/local/tomcat/webapps/xxx.war EXPOSE 8080
-
通过编写好的dockerfile构建镜像
docker build -f ./Dockerfile . -t xxxxxx:v1.0.0
-
通过构建好的镜像构建及容器
// 「yyyyyyy」为容器名,可自定义。 // 「xxxxxx:v1.0.0」为镜像名及版本号,需与镜像名称&版本完全一致 docker run --name yyyyyyy -p 3000:3000 -d xxxxxx:v1.0.0
-
三.docker-compose
-
啥是docker-compose:
compose是用于定义和运行多容器docker应用程序的工具。简单来说就是个一步构建的工具。
-
为啥使用docker-compose:
-
通常一个项目不会只有一个工程,常见的web项目会有三个部分:
- UI
- API
- DB
那么我们就要build三次镜像,运行三次容器,这样及其麻烦。而compose则可以将全部工程归纳成为一个工程,一步完成构建。
-
一台主机上的三台虚拟机如何相互通信?
将两台虚拟机分别桥接至主机,并配置其到同一网段。
- 那么三个容器如何互相通信呢?
有了docker-compose,我们不再需要单独进行网络配置,直接使用compose创建network,成员容器使用network构建的网段相互通信。
- 那么三个容器如何互相通信呢?
-
-
构造方式:
- 上文档docker-compose
- 上例子:
-
编写docker-compose文件
version: '3' # 构造服务 services: ui: build: ./ui container_name: "xxx-ui" ports: - "30544:80" environment: TZ: "Asia/Tokyo" networks: fri_dra_net: ipv4_address: 172.16.236.10 backend: build: ./backend container_name: "xxx-api" ports: - "30545:8090" environment: TZ: "Asia/Tokyo" networks: fri_dra_net: ipv4_address: 172.16.236.11 volumes: - C:/DigitalPathlogy/Data:/opt/Data db: build: ./db container_name: "xxx-db" ports: - "30546:5432" volumes: - ./db/:/docker-entrypoint-initdb.d environment: POSTGRES_HOST_AUTH_METHOD: "trust" POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres POSTGRES_DB: dp networks: fri_dra_net: ipv4_address: 172.16.236.12 # 构造网络 networks: fri_dra_net: driver: bridge ipam: driver: default config: - subnet: 172.16.236.0/24
-
通过docker-compose文件构造镜像
要注意,因为docker-compose是集成部署的工具,所以其一般在存放所有工程的父目录下。
docker-compose build
-
通过docker-compose指令一步运行全部容器
docker-compose up -d
-