主要介绍在 Centos7 上安装和使用 Docker
# 1. Docker
# 1.1 docker 如何解决大型项目依赖关系复杂,不同组件依赖的兼容问题
- Docker 允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
- Docker 将每个应用放到一个隔离容器中运行,使用沙箱机制,相互隔离
# 1.2 Docker 如何解决开发、测试、生产环境有差异的问题
- Docker 镜像中包含完整运行环境,包含系统库函数、仅依赖系统的 Linux 内核,因此可以在任意操作系统上运行
Docker 是一个快速交付应用、运行应用的技术:
- 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意 Linux 操作系统
- 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
- 启动、移除都可以通过一行命令完成,方便快捷
# 2. Docker 命令
# 2.1 镜像命令
- docker images
- docker pull
- docker push
- docker save
- docker load
# 2.2 容器命令
- docker run
- docker pause
- docker unpause
- docker stop
- docker start
- docker rm
- docker exec
- docker logs
- docker ps
# 3. Docker 数据卷
数据卷是一个虚拟目录,指向宿主文件系统中的某个目录
其作用在于,将数据与容器分离,解耦合,方便操作容器内的数据,保证数据安全!
# 3.1 操作数据卷
docker volume [COMMAND]
docker volume 命令是数据卷操作,根据命令后跟随的 command 来确定下一步的操作:
- create 创建一个 volume
- inspect 显示一个或多个 volume 的信息
- ls 列出所有的 volume
- prune 删除未使用的 volume
- rm 删除一个或多个指定的 volume
# 3.2 挂载数据卷
-v 数据卷:容器类目录
docker run 命令中通过 -v 参数挂载文件或目录到容器中:
- -v volume 名称:容器内目录
- -v 宿主机文件:容器内文件
- -v 宿主机目录:容器内目录
数据卷挂载与目录直接挂载的区别
- 数据卷挂载耦合度低,由 docker 来管理目录;但是目录较深,不便于寻找
- 目录挂载耦合度较高,需要手动管理目录;便于寻找
# 4. Dockerfile 自定义镜像
# 4.1 镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成
镜像是分层结构,每一层称为一个 Layer
- BaseImage 层:包含基本的系统函数库、环境变量、文件系统
- Entrypoint:入口,是镜像中应用启动的命令
- 其他:再 BaseImage 基础上添加依赖、安装程序、完成整个应用的安装和配置
# 4.2 Dockerfile 语法
Dockerfile 是一个文本文件,包含若干指令,用指令来说明要执行什么操作来构建镜像。每个指令都会形成一层 Layer
常见指令
指令 说明 示例 FROM 指定基础镜像 FROM centos:7 ENV 设置环境变量,可在后面指令使用 ENV key value COPY 拷贝本地文件到镜像的指定目录 COPY /xxx /tmp RUN 执行 Linux 的 shell 命令,一般是安装过程的命令 RUN yum install gcc EXPOSE 指定容器运行时监听的端口,提供给镜像使用者 EXPOSE 8080 ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xxx.jar 更详细语法说明,可参考官方文档:https://docs.docker.com/engine/reference/builder
# 4.3 构建 Java 项目
案例:基于 java:8-alpine 镜像,将一个 Java 项目构建为镜像
实现思路如下:
h # 指定基础镜像
FROM java:8-alpine
# 拷贝 jar 包到容器中
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8888
#入口,java 项目启动命令
ENTRYPOINT java -jar /tmp/app.jar
# 5. DockerCompose
# 5.1 DockerCompose 是什么
它能基于 Compose 文件快速部署分布式应用,而无需手动一个个创建和运行容器。Compose 文件是一个文本文件,通过指令定义集群中每个容器怎么运行。
DockerCompose 的语法请参考:https://docs.docker.com/compose/compose-file
# 5.2 案例
docker-compose 文件编写:
version: "3.2" | |
services: | |
nacos: | |
image: nacos/nacos-server | |
environment: | |
MODE: standalone | |
ports: | |
- "8848:8848" | |
mysql: | |
image: mysql:5.7.25 | |
environment: | |
MYSQL_ROOT_PASSWORD: 123 | |
volumes: | |
- "$PWD/mysql/data:/var/lib/mysql" | |
- "$PWD/mysql/conf:/etc/mysql/conf.d/" | |
userservice: | |
build: ./user-service | |
orderservice: | |
build: ./order-service | |
gateway: | |
build: ./gateway | |
ports: | |
- "10010:10010" |