分布式框架中间件总纲
友情链接
前言:此篇着重实战,不深究原理
个人小感:
1、镜像和容器的关系,好似类和对象的关系
2、
目录
一、Docker 概述
二、Docker 安装
三、Docker 命令 ★
四、实战
(1)Nginx
(2)Tomcat
(3)es+kibana
五、Portainer(可视化面板)
六、commit(提交镜像到本地)
七、数据卷的使用(挂载)
八、实战:MySQL 同步数据(挂载)
九、初始DockerFile
十、DockerFile ★
十一、Docker0(docker默认网络)
十二、docker部署微服务(IDEA 整合 Docker)
常用
# 拉取镜像
docker pull tomcat
# 启动容器
docker run -d --name nginx01 -p 3344:80 nginx
# 进入容器交互模式
docker exec -it 7e118dfsdg /bin/bash
一、Docker 概述
1、Docker能做什么
(1)对比虚拟机缺点:


(2)容器化技术

(3)虚拟机和 Docker 不同
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在系统上安装运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是相互隔离的,每个容器内都有属于自己的文件系统,互不影响
2、DevOps(开发及运维)
(1)应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker :打包镜像发布测试,一键运行
(2)更便捷的升级和扩缩容
项目打包为一个镜像,扩展服务器A,服务器B
(3)更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
(4)更高效的计算资源利用∶
Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
二、Docker 安装(看上面的文档链接)
1、Docker的基本组成

(1)镜像 image :
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run ==> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
(2)容器 container:
Docker 利用容器化技术,独立运行一个或者一个组应用,通过镜像来创建。
容器可以理解为一个极简的 liunx
(3)仓库 repository:
仓库就是存放镜像的地方,
仓库分为共有和私有(类似于maven),
Docker hub(默认是国外),可以配置阿里云的(类似于maven配置)
2、run的原理图

3、docker是怎么工作的
(1)Docker 是一个 Client -Server 结构的系统,Docker 的守护进程运行在主机上,通过 Socker 从客户端访问。
(2)DockerServer接受到 Docker -Client 的指令,就会执行这个命令

4、docker 为什么比vm快
(1)Docker 有着比虚拟机更少的抽象层
(2)Docker 利用的是宿主机的内核,vm需要是 Guest OS

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统的内核,避免引导。虚拟机是加载 Guest OS ,分钟级别的,而docker 是利用宿主机的操作系统,省略了复杂的过程,秒级。
三、Docker 命令 ★
1、帮助命令
docker version #显示docker 的版本信息
docker info # 显示 docker 的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令
2、镜像命令
(1) docker images 查看所有本地的主机上的镜像

(2)docker search 搜索镜像

(3)docker pull 下载镜像


(4)docker rmi 删除镜像

3、容器命令
(1)新建容器并创建

(2)列出所有运行的容器

(3)退出容器
exit # 直接容器停止并退出
Ctrl + P + Q # 容器停止但不退出
(4)删除容器
docker rm 容器 id # 删除指定id的容器,不能删除正在运行中的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有容器
docker ps -a #历史容器
(5)启动和停止容器
docker start 容器id # 启动容器
docker restart 容器 id #重启容器
docker stop 容器 id # 停止容器
docker kill 容器 id # 强制停止该id 容器
4、常用的其他命令
(1)后台启动容器

(2)查看日志

docker run -d centos /bin/sh -c "while true;do echo myakkkkkk;sleep 1;done;"
docker ps
docker logs -tf --tail 10 ecf34dd
(3)查看容器中的进程信息

(4)查看镜像的元数据
docker inspect ecf34dd
(5)进入当前正在运行的容器
docker exec -it contos01 /bin/bash

(6)从容器内拷贝文件到主机上
docker cp ecf34dd313e6:/home/test.java /home

(7)docker 命令
attach #当前she1l 下attach连接指定运行镜像
build #通过Dockerfile定制镜像
commit #提交当前容器为新的镜像
cp #从容器中拷贝指定文件或者目录到宿主机中
create #创建一个新的容器,同run,但不启动容器
diff #查看docker容器变化
events #从docker服务获取容器实时事件
exec #在已存在的容器上运行命令
export #导出容器的内容流作为一个 tar归档文件[对应import]
history #展示一个镜像形成历史
images #列出系统当前镜像
import # 从tar包中的内容创建一个新的文件系统映像[对应export]
info #显示系统相关信息
inspect #查看容器详细信息
kill #强杀指定 容器
。。。
四、实战
1、Nginx
(1)拉取、启动
docker pull nginx
docker images
docker run -d --name nginx01 -p 3344:80 nginx


映射关系图

寻找Nginx 配置文件
# 进入容器内部
docker exec -it nginx01 /bin/bash
# 查看配置位置
whereis nginx
#
cd /etc/nginx
#
cat nginx.conf
# 退出
exit
# 停止当前容器
docker stop 容器id
2、Tomcat

3、es+kibana
五、Portainer(可视化面板)
1、是什么

docker run -d -p 8088:9000 \--restart=always
-v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
2、测试

六、commit(提交镜像到本地)
dicker commit 提交容器成为一个新的副本
# 命令类似 git ,-a 作者,-m 信息,
docker commit -a = "作者" -m="内容" 容器id 目标镜像名:[TAG]
1、提交一个tomcat镜像(拷贝webapps.dist到 newWebapps中)
# 1、启动镜像,并且进入交互模式
docker exec -it e05bd8bf4e25 /bin/bash
# 2、拷贝
cp -r webapps.dist newwebapps
# 3、提交为一个新的镜像
docker commit -a="mykk" -m="newTomcat,1.0" e05bd8bf4e25 tomcat02:1.0

七、数据卷的使用
1、何为容器数据卷
(1)简单来说就是把docker 容器内的文件,挂载到liunx 系统文件下(为了持久化和同步操作)
(2)容器间也可以实现数据共享

2、实战
(1)方式一:直接使用命令挂载 -v
docker run -it -v 主机目录,容器目录
# 测试 centos 镜像
docker run -it -v /home/ceshi:/home centos /bin/bash
# 使用 inspect 查看
docker inspect 容器id

八、实战:MySQL 同步数据(挂载)

九、初识DockerFile
DockerFile 就是用来构建 docker 镜像的构建文件
通过以下脚本生成镜像,镜像是一层一层的,脚本一个个的命令。每个命令都是一层。
# 创建一个dockerfile 文件,名字可以修改,建议为 dockerfile
# 文件中的内容 指令(大写),参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "-----end-----"
CMD /bin/bash
# 这里每个命令,就是镜像的一层

启动镜像:docker run -it eac7f31f5997 /bin/bash

这个卷和外部一定有一个同步的目录,匿名挂载(没有指定目录)

查看容器信息:
1、docker ps
2、docker inspect e3439cae928e
挂载的本地 centos位置

十、DockerFile
dockerfile 是用来构建 docker 镜像的文件,命令参数脚本
1、构建步骤:
1、编写一个 dockerfile 文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
2、构建过程:
1、每个保留关键字(指令),都必须是大写字母
2、执行从上至下
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交。


3、DockerFile 的指令
FROM # 基础镜镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 添加内容
WORKDIR # 镜像的工作内容
VOLUME # 挂载的目录
EXPOSE # 保留端口的配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 触发指令,当构建一个被继承的 DockerFile 时会运行这个指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
查看镜像的构建配置:docker history 620eerji4656
十一、Docker0(docker网络)
1、查看三个网络环境:ip addr

2 、问题: docker 是如何处理荣期间的网络访问的?

# 清空所有镜像,保证干净
docker rm -f $(docker ps -aq) # 先删除所有的容器
docker rm -f $(docker images -aq) # 在删除所有的镜像
# 启动容器
docker run -d -P --name tomcat01 tomcat
# 查看容器ip
docker inspect --format='{{.NetworkSettings.IPAddress}}' tomcat01
# linux ping 通容器内网络测试
ping 172.17.0.2
3、原理
(1)我们每启动一个 docker容器,docker就会给docker容易分配一个 IP ,我们只要安装了 docker ,就会有一个网卡 docker0 桥接模式,使用的技术是 evth-pair 技术。


4、容器 tomcat01 不是直接 连通到 tomcat02


5、小结


十二、docker部署微服务(IDEA 整合 Docker)
1、随便创建一个springBoot工程,勾选web即可,顺便安装插件

2、根目录创建 dockerfile

FROM java:8
COPY *.jar /app.jar
# 映射端口
CMD ["--server.port=8080"]
# 暴露端口
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
3、将要打包后的jar和Dockerfile上传

4、编译,docker build -t mykk .

5、运行

网友评论