一、认识docker
1、为什么这么火?
极大提高效率.
2、是什么?
Docker是一个应用容器.可以运行ngnix,Node.js,java程序等等
举例:
Linux -> jvm -> java应用
Linux -> Docker(jvm - java应用)
3、解决了什么问题?
a. 部署难的问题(遇到复杂项目部署效率极低)
b. 资源利用率低问题
结合场景:云、DevOps
4、集装箱原理
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走
相关了解:
A段架构、B段架构
<<思考软件,创新设计——A段架构师的思考技术>> -- 暂不推荐购买,因为我买了快三年了,没看过。
二、Docker基础
1. 三大组件
a. 仓库 : 用来存放镜像的. 远程仓库
b. 镜像 : 类似软件的安装包或一个模板
b. 容器 : 基于镜像创建的实例
2. docker架构图(maven类似)
架构的组件: 远程仓库,docker host(linux)
图我不想画,偷懒,直接从书里截图
上图中
Registry: 我把他理解成Docker仓库,远程。
Docker Host 和 Docker client:在一台Linux机器上。Docker client获取用户输入的指令并调用Docker daemon进行相关操作。
三、docker 安装
注意尽量在centos安装
三、docker实战 - 运行一个nginx服务
1. 搜索镜像(远程) docker search java/nginx
2. 将远程镜像安装到本地 docker pull nginx
3. 查看本地镜像 docker images
4. 新建容器并启动容器 docker run -d -p 81:80 nginx
5. 查看当前运行的容器 docker ps
6. 停止当前运行的容器 docker stop containerId
7. 启动容器 docker start containerId
8. docker ps -a 查看最近启动过的容器信息
9. 删除容器 docker rm containerId 只能删除停止的
-f : 强制删除,启动也可以删除
10. 删除镜像: docker rmi -f 镜像名:tag 或者镜像名:tag替换成containerId来删除。
其他命令:
1. docker logs 查看日志
docker logs -f -t --tail 20 容器id : 实时查看后面20行
2. docker container exec -it 容器id /bin/bash 进入docker虚拟机,,然后可以在容器中执行shell命令. exit退出
3. docker inspect 容器id : 查看容器所有信息
四、docker实战 - 构建自己的镜像并运行spring boot项目
说明:spring boot 项目名叫demo,打成的jar包为demo-0.0.1-SNAPSHOT.jar,可以直接通过java -jar demo-0.0.1-SNAPSHOT.jar运行
1.建立demo文件夹,并将demo-0.0.1-SNAPSHOT.jar拷贝到demo文件夹下
2.在demo文件夹下新建Dockerfile文件并编写(Dockerfile文件即文件名为Dockerfile的文件)
以下是内容:
From java:8
VOLUME /tmp
ADD demo-0.0.1-SNAPSHOT.jar /app.jar
EXPOSE 8083
ENTRYPOINT ["java" , "-jar", "/app.jar"]
Dockerfile详细解
From: 为指定基础镜像,并且必须是第一条指令。
VOLUME: 简单说配置宿主机和容器共享的目录, /tmp是容器中的目录,那宿主机的目录在哪里呢?使用docker inspect 命令找到Mounts,Source就是宿主机的目录.
参考: https://www.cnblogs.com/51kata/p/5266626.html
https://blog.csdn.net/dream_broken/article/details/52314993
ADD: 一个复制命令,把文件复制到镜像中
EXPOSE: 指定的端口(容器内端口)对本地宿主机公开
ENTRYPOINT: 容器启动时执行指令
2. 构建自己的镜像
进入demo文件夹,运行下面命令
docker build -t demo:0.1 .
-t: 指定镜像的名字.
demo:0.1, demo代表镜像名,0.1代表tag。
注意:
docker build命令后面有个".",代表当前目录,即在当前目录下执行。
通过docker images你可能会看到仓库名和tag都为<none>的镜像,原因我们一般定义image,都是使用Dockerfile,我们随时可能修改这个文件,然后重新使用docker build -t name . 命令来构建一个新的image。这种情况下,如果我们使用了和之前一样的镜像名来命名,那么docker会把这个名字赋给新的镜像,以前的镜像并不会被删除,但是此时它的名字被新的镜像剥夺了,就成为了一个无名镜像,也就是<none>:<none>出现的原因。这个none镜像会占用磁盘空间,所以我们必须删除它
3.新建容器并运行容器
docker run -d -p 8084:8081 demo:0.1
四、docker-compose 服务编排
1、是什么?
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
白话一点:相当于多个服务(容器)的启动工具
2、解决了什么?
用通俗的语言来说,我们平时操作 docker 还是很原始的一系列动作,你手动使用 docker 的动作可以拆分成
1) 找到一个系统镜像 // docker search
2) 安装好 vm 或者 virtual box // apt-get install docker
3) 在 vm 中安装镜像 // docker run -d -it 你的镜像
.......
这是最小的动作, 如果你要映射硬盘,设置nat网络或者桥接网络,等等…你就要做更多的 docker 操作, 这显然是非常没有效率的。
但是我们写在 docker-compose.file 里面就很好了。 你只需要写好后 只运行一句
docker-compose up -d
一切都是那么的简单
3、安装
自已去百度
验证安装: docker-compose -v
4、如何使用docker-compose
使用Compose 基本上分为三步:
1). 编写 Dockerfile 定义应用的运行环境
2). 编写 docker-compose.yml 定义组成应用的各服务
3). 执行 docker-compose up 启动整个应用
5、示例
使用docker-compose目录结构
docker
docker-compose.yml
demo
Dockerfile
nginx
Dockerfile
nginx Dockerfile内容
FROM nginx
RUN echo '<div><center><h1><font color="red">Docker</font></h1><center><div><div><iframe src="http://www.baidu.com" width="100%" height="100%"><
/iframe></div>' > /usr/share/nginx/html/index.html
RUN : 运行指定的命令.详细:https://www.cnblogs.com/dazhoushuoceshi/p/7066041.html
docker-compose.yml 内容
demo:
build:
./demo
ports:
- "8083:8083"
nginx:
build:
./nginx
ports:
- "80:80"
建完后,执行docker-compose up即可,加-d代表在后台运行
docker-compose.yml文件详解:https://www.jianshu.com/p/2217cfed29d7
五、k8s
个人理解k8s是docker-compose的升级版本
六、参考资料
1、https://blog.csdn.net/qq_37788081/article/details/79044119
2、《循序渐近学Docker》
3、https://www.cnblogs.com/dazhoushuoceshi/p/7066041.html
4、https://www.cnblogs.com/neptunemoon/p/6512121.html
5、https://www.cnblogs.com/ee900222/p/docker_5.html
6、https://blog.csdn.net/u014788227/article/details/52869801
7、《使用SpringCloud和Docker实战微服务》
5、spring boot demo git地址: https://gitee.com/kuguagua/spclouddemo