1、关于Docker
1.1 概念
Docker 是一个开源的应用容器引擎,基于Go 语言
并遵从 Apache2.0 协议
开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
1.1.1 镜像 image
定义:一个镜像代表着一个软件 如mysql镜像 redis镜像
特点:只读
1.1.2 容器 container
定义:基于某个镜像运行一次就会生成一个程序实例,一个程序实例称之为一个容器
特点:可读可写的
1.1.3 仓库 repository
定义:用来存储docker中所有镜像具体位置
远程仓库:docker在世界范围维护一个唯一远程仓库
本地仓库:当前自己机器中下载镜像存储位置
1.1.4 docker运行流程
1.2 镜像相关操作
1.2.1 查看docker引擎以及docker帮助命令
docker info //用来显示docker信息(版本等)
docker --version //显示docker版本
docker --help //查看docker所有帮助命令
docker 执行命令格式: docker [options] command(具体命令)
1.2.2 操作镜像images的相关命令
docker images 查看本地仓库中存在哪些镜像
docker pull 镜像:镜像版本号 下载镜像 (查看docker hub)
docker search redis 通过命令行搜索需要镜像
docker image rm 删除镜像
docker image rm -f 强制删除镜像
docker rmi 镜像名 简化删除镜像
1.3 容器相关命令
1.3.1 基本操作1
1、将打包tar镜像文件导入到自己的docker仓库
docker load -i tar文件
2、通过镜像运行容器
docker run 镜像名:tag
宿主机端口和容器中端口进行映射 -p (宿主机端口号):(容器中端口号)|==》可以写多个| 后台运行 -d 指定名称 --name
docker run -p 8081(宿主机端口号):8080(容器中端口号) -d --name tomcat1 容器名:tag
3、 查看当前运行的容器
docker ps
4、停止 重启容器的命令
docker start 容器名或id
docker restart 容器名或id
docker stop 容器名或id 正常停止容器
docker kill 容器名或id 立即停止容器
1.3.2 基本操作2
1、删除容器
删除停止的容器
docker rm 容器名或id
删除正在运行的容器
docker rm -f 容器名或id
删除所有的容器
docker rm -f $(docker ps -aq)
2、查看容器呢服务运行日志
docker logs 容器名或id
docker logs -f 容器名或id ==>实时展示数据
docker logs -tf 容器名或id ==》实时展示数据+时间戳
docker logs --tail N(5) 容器名或id 查看容器末尾5行数据
3、查看容器内进程
docker top 容器名或id
4、与容器内部交互
docker exec -it 容器名或id bash(命令行) 进入容器,并与容器内命令终端进行交互
5、操作系统与容器的传输文件
从容器复制文件到操作系统: docker cp 容器唯一标识(id,name):容器内资源路径 操作文件路径/文件目录
从操作系统复制文件到容器 docker cp 文件|目录名 容器唯一标识(id,name):/容器内资源路径
1.3.3 基本操作3
1、查看容器内部细节
docker inspect 容器id|容器名称
2、数据卷 Volume
作用: 实现宿主系统与容器之间的文件共享
数据卷使用:
docker run -d -p 8080:8080 --name tomcat01 -v 宿主机目录(必须是绝对地址):容器目录 tomcat:8.0.53
(1)自定义数据卷目录(适合读写)
docker run -d -p 8081:8080 --name tomcat02 -v /root/apps:/usr/local/tomcat/webapps tomcat:8.0.53
(2)自动数据卷目录(适合只读不写)
docker run -d -p 8082:8080 --name tomcat03 -v aa:/usr/local/tomcat/webapps tomcat:8.0.53
注意:
- aa代表一个数据卷名字,名称可以随便写,docker在不存在时自动创建这个数据卷同时自动映射宿主机某个目录
- 同时在启动容器时会将aa对应容器目录中全部内容复制到aa映射目录中
3、查询目录
find / -name 文件名
4、将容器打包成一个新的镜像
docker commit -m '描述信息' -a '作者信息' (容器id或者名称) 打包的镜像名称:tag
5、将镜像备份出来(tar文件)
dokcer save 镜像名称:Tag -o 文件名
docker save tomcat:8.0.53 -o test.tar
1.4 docker 镜像原理
1.4.1 镜像定义
一个镜像代表一个软件、软件包,用来打包软件运行环境和基于运行环境开发的软件
它包含运行某个软件所需的所有内容,包括代码、运行时所需要的库、环境变量和配置文件
1.4.2 镜像为什么这么大?
原因:一个软件镜像不仅仅是原来的软件包,它包含软件包所需要的操作系统依赖
、软件自身依赖
以及自身软件包
组成
1.4.3 为什么docker镜像采用分层镜像原理
注意:docker在设计镜像时每一个镜像都是有N个镜像共同组成 ==》镜像像一个花卷一层一层组成
原理:
UnionFS联合文件系统:就是一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,联合加载会把各层文件叠加起来,这样最终的文件系统会包括所有底层的文件和目录
1.4.4 为什么采用UnionFS
好处:最大的好处就是资源共享 采用分层机制实现基础层共享,从而减小docker仓库整体体积
1.5 Docker 网络通信机制
docker允许通过外部访问容器或容器互联的方式来提供网络服务
1.5.1 docker容器与操作系统通信机制
1.5.2 docker网络使用
注意:一般在使用Docker网桥(bridge)实现容器与容器通信时,都是站在一个应用角度
进行容器通信
- 查看Docker网桥配置
docker network ls
- 创建自定义网桥
docker create ems(网桥名) ==>`一般使用这种` docker create -d bridge ems
docker run -d -p 8081:8080 --network ems --name tomcat01 tomcat:8.0.23 172.18.0.2 ==> tomcat01
docker run -d -p 8082:8080 --network ems --name tomcat02 tomcat:8.0.23 172.18.0.3 ==> tomcat02
注意:
一旦在启动容器时指定了网桥之后,日后可以在任何这个网桥关联的容器中使用容器名字进行与其他容器通信
- 删除网桥
docker network rm 网桥名
- 查看网桥详细
docker inspect 网桥名
注意 使用docker run
指定 --network
网桥时网桥必须存在
1.6 数据卷操作
1.6.1 数据卷作用 volume
用来实现容器和宿主机数据共享
1.6.2 数据卷特点
-
数据卷可以在容器之间共享和重用
-
对数据卷的修改会立即影响到对应容器
-
对数据卷
的更新修改,不会影响镜像
-
数据卷默认会一直存在,即使容器被删除
1.6.3 数据卷操作
- 自定义数据卷目录
docker run -v 绝对路径:容器内路径
- 自动创建数据卷
docker run -v 卷名(随意):容器内路径
1.6.4 docker 操作数据卷指令
- 查看数据卷
docker volume ls
- 查看某个数据卷的细节
docker volume inspect 卷名
- 创建数据卷
docker volume create 卷名
- 删除没有使用的数据卷
docker volume prune
- 删除指定数据卷
docker volume 卷名
1.7 docker 核心架构
2、基于docker的软件安装
2.1 安装MySQL
1、安装哪个服务去docker hub搜索对应服务的镜像
2、点击进入该服务docker hub
a.描述
b.版本信息
3、确定使用的版本
docker pull mysql:5.7.32
4、如何使用镜像
a.基本启动mysql服务
docker run -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.32
-e MYSQL_ROOT_PASSWORD=root 给root用户指定密码为123456
b.启动一个mysql服务,后台运行,指定用户密码,指定容器名字
docker run -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql01 -p 3307:3306 mysql:5.7.32
c.启动一个mysql服务,后台运行,指定用户密码,指定容器名字,使用数据卷将数据持久化到宿主机系统
注意:通过docker hub描述得知,MySQL存储数据文件目录放置在容器这个目录 /var/lib/mysql
docker run -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql01 -v mydata:/var/lib/mysql -p 3307:3306 mysql:5.7.32
d.启动一个mysql服务,后台运行,指定用户密码,指定容器名字,使用数据卷将数据持久化到宿主机系统,以修改之后的配置文件启动
docker run -e MYSQL_ROOT_PASSWORD=123456 -d --name mysql01 -v mydata:/var/lib/mysql -v myconfig:/etc/mysql -p 3307:3306 mysql:5.7.32
2.2 安装tomcat
1、下载tomcat服务
docker pull tomcat:8.0.23
2、启动tomcat服务
a.启动一个基本tomcat服务
docker run -d -p 8001:8080 --name tomcat01 tomcat:8.0.23
b.将部署应用项目通过数据卷挂载宿主机系统
注意: 部署web应用在容器中目录为 /usr/local/tomcat/webapps 配置文件:/usr/local/tomcat/conf
docker run -d -p 8001:8080 --name tomcat -v apps:usr/local/tomcat/webapps tomcat:8.0.23
c.修改配置文件,并将应用目录通过数据卷挂载到宿主机系统
docker run -d -p 8001:8080 --name tomcat -v apps:usr/local/tomcat/webapps -v myconfig:/usr/local/tomcat/conf tomcat:8.0.23
2.3 安装redis
redis配置文件需要自己去官网下载
1、下载redis镜像
docker pull redis:5.0.10
2、启动redis
docker run -d -p 6379:6379 --name redis redis:5.0.10
3、开启redis持久化
docker run -p 6379:6379 --name redis -d -v redisdata:/data redis:5.0.10 redis-server --appendonly yes
注意: 一旦开启持久化之后,持久化生成aof文件会被放入容器中/data目录中
4、修改redis配置文件,以配置文件方式启动(redis配置文件需要自己去官网下载)
注意:在当前/root/redisconf目录中存在redis.conf配置文件
docker run -p 6379:6379 --name redis -d -v /root/redisconf:/usr/local/etc/redis redis:5.0.10 redis-server /usr/local/etc/redis/redis.conf
2.4 安装ES服务(待补充)
3、Dockerfile
3.1 什么是Dockerfile
定义:用来帮助我们自己构建一个自定义镜像 ,Dockerfile成为镜像构建文件、描述文件
3.2 为什么要存在Dockerfile
问题:在dockerhub中官方提供很多镜像已经能满足我们的所有服务了,为什么还需要自定义镜像?
核心作用:日后用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行
3.3 Docker 构建镜像原理
3.4 Dockerfile 构建Springboot应用
1、开发Springboot应用
2、对Springboot项目应用程序进行打包
war 过渡 ===> tomcat
jar 主流 ===> jdk
3、打包项目 demo-0.0.1-SNAPSHOT.jar
4、在服务器中创建dockerfile上下文目录context
a.mkdir demo 这个目录作为context目录 (上下文目录)
b.在demo目录中创建Docfile文件 touch dockerfile
c.上传应用jar到context目录中
d.编写dockerfile
FROM openjdk:8-jre #基于哪个镜像进行构建
WORKDIR /app #定义进入容器时默认位置,接下来后续操作工作位置
ADD demo-0.0.1-SNAPSHOT.jar app.jar #将jar包复制到工作目录 同时修改名字为app.jar
EXPOSE 8080 #暴露端口8080
ENTRYPOINT ["java","-jar"] #启动应用固定命令
CMD ["app.jar"] #执行jar名称 (传参)
e.执行构建
docker commit -t demo:01 . demo:01 自定义镜像 .表示当前目录为上下文目录
f.执行容器
docker run -d --name demo -p 8080:8080 demo:01
4、 docker compose 使用
4.1 什么是docker compose
compose
定位是 定义和运行多个Docker容器的应用 同时对多个容器进行编排
4.2 Compose定位
Compose项目是Dokcer官方开源项目,负责实现对Docker容器集群的快速编排
4.3 Compose 核心概念
服务(Service):一个应用的容器 服务可以存在多个
项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义
4.4 Compose使用
a.下载docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
4.5 检查compose是否安装成功
docker-compose -v
4.6 在yml文件路径下执行docker-compose
docker-compose up
docker-compose.yml
ersion: '3.0' # 表示该 Docker-Compose 文件使用的是 Version 2 file
services:
tomcat: # 指定服务名称
image: tomcat:8.0.53
ports: # 指定端口映射
- "8080:8080"
tomcat01: # 指定服务名称
image: tomcat:8.0.53
ports: # 指定端口映射
- "8081:8080"
模板命令
docker-compose.yml
version: '3.0' # 表示该 Docker-Compose 文件使用的是 Version 2 file 支持3.8
services: #用来书写当前项目中那些容器 服务
tomcat: # 指定服务名称
image: tomcat:8.0.53 image:tag
ports: # 指定端口映射 -p
- "8081:8080"
volumes:
- /root/apps:/usr/lcoal/tomcat/webapps
-tomcatwebapps:/usr/local/tomcat/webapps
networks: #指定容器启动之后使用哪个网桥 --network
-aa
command: redis-server /.... #用来覆盖容器默认启动指令
command: "redis-server --appendonly yes"
environment: #用来指定容器启动时环境参数
- MYSQL_ROOT_PASSWORD=123456
volumes:
tomcatwebapps:
external: #使用自定义名数据卷
true
networks:
aa:
external: #使用自定义网桥
true
4.7 docker compose模板命令总结
docker-compose 指令之build
docker-compose
指令使用
4.8 portainer