Docker
Docker简介
在大型项目部署时,会出现依赖关系复杂容易出现兼容性等问题
同时开发,测试和生产的环境也存在差异
Docker解决依赖兼容问题
将应用的Libs函数库,Deps依赖,配置和应用一起打包
将每个应用放到一个隔离容器中去运行,避免互相干扰
Docker解决操作系统环境差异
将用户程序所需要的系统函数库一起打包
在不同操作系统运行时直接基于打包的函数库进行运行
Docker和虚拟机的区别
虚拟机:
在操作系统中模拟硬件设备,在这些硬件设备上运行另一个操作系统
体积大,启动速度满,性能差
Docker:
封装函数库,没有模拟完整的操作系统
是一种容器技术,在用户空间内以分离的进程运行
体积小,启动速度快,性能好
Docker架构
镜像(image)
Docker打包的应用程序及其依赖的函数库,环境,配置文件等
容器(container)
镜像运行后形成的进程,对外不可见
Docker:
一个CS架构的程序,由两部分组成
服务端(server):Docker守护进程,负责处理Docker指令,管理镜像,容器等.
DockerHub
装应用镜像的服务器,可以在这些平台上对Docker镜像进行下载
Docker的基本操作
镜像操作
镜像名称一般分为两个部分:repository:tag
未指定tag时,默认为latest,代表最新版本镜像
常见镜像操作命令
docker
docker push
//推送镜像到服务器
docker pull
//从服务器拉取镜像
docker build
//构建镜像
docker images
//查看镜像
docker rmi
//删除镜像
docker save
//保存镜像为一个压缩包
docker load
//加载压缩包为镜像
容器操作
容器的三个状态
运行:进程正常运行
暂停:进程暂停,CPU不再运行,并不释放内存
停止:进程终止,回收进程占用的内存,CPU等资源
容器的常用命令
docker
docker run
--name 给容器起名字
-p 将宿主机端口和容器端口做映射
-d 后台运行容器
-v 挂载文件或目录到容器中
挂载目录耦合度高但是容易查看
挂载数据卷耦合度低但是不容易查看
最后为镜像名称
//创建并运行一个容器,处于运行状态
docker pause
//让一个运行的容器暂停
docker unpause
//让一个容器从暂停状态恢复运行
docker stop
//停止一个容器
docker start
//让一个停止的容器再次运行
docker rm
//删除一个容器
docker ps -a
//查看所有的容器
docker exec -it mn bash
-it 创建标准输入输出终端,允许我们与容器做交互
mn 进入容器的名称
bash 进入容器后执行的命令,bash是一个指令交互命令
//进入容器执行命令
docker logs
//查看容器运行日志
docker ps
-a 包括没有运行的容器
//查看所有运行的容器和状态
容器内修改文件
容器内没有vim/vi 命令,无法直接进行修改
使用sed命令工具进行修改
-i 在原始文件中进行修改
使用数据卷进行挂载
因为修改容器内部文件困难,所以我们需要使用数据卷挂载的方式进行文件修改
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录
docker
docker volume [command]
command:
create //创建一个volume
inspect //显示一个或多个volume的信息
ls //列出所有的volume
prune //删除未使用的volume
rm //删除一个或多个指定的volume
Dockerfile自定义镜像
将自己的代码制作为镜像文件
镜像的组成结构
入口(Entrypoint)
镜像运行入口,一般是程序启动的脚本和参数
层(layer)
在BaseImage基础上添加安装包,依赖,配置等,每次操作都形成新的一层
基础镜像(BaseImage)
应用依赖的系统函数库,环境,配置,文件等
镜像就是在系统函数库和运行环境的基础上添加应用程序,配置文件,依赖文件等组合编写脚本进行打包在一起形成的文件
构建镜像就是实现上述打包的过程
Dockerfile语法
docker
docker build -t javaweb:1.0 .
说明:
1.docker build 表示构建
2.-t:t的全称是tag表示版本
3.javaweb:1.0 :镜像组成格式 repository:版本 javaweb表示repository,属于标识符,随便定义
4. 在版本即1.0后面一定加空格然后书写点,点表示在当前目录执行Dockerfile文件
//生成镜像文件
FROM
FROM centos:6
//指定基础镜像
ENV
ENV key value
//设置环境变量
COPY
COPY ./mysql-5.7.rpm/tmp
//拷贝本地文件到镜像的指定目录
RUN
RUN yum install gcc
//执行Linux的shell命令,一般是安装过程的命令
EXPOSE
EXPOSE 8080
//指定容器运行时监听的端口
ENTRYPOINT
ENTRYPOINT java -jar aa.jar
//镜像中应用的启动命令,容器运行时调用
Docker-Compose
基于compose文件帮我们快速部署分布式应用
无需手动一个个创建容器
Compose文件
docker-compose
version: "3.8"
services:
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
web:
build: .
ports:
- "8090:8090"
描述了一个包含两个容器
mysql:5.7.25
web临时容器,映射端口8090
的项目
Docker镜像仓库
公共仓库
Docker官方的Docker Hub
网易云镜像服务
DaoCloud镜像服务
阿里云镜像服务等等
私有仓库
用户在本地搭建私有Docker Registry
采用私有Docker Registry在实际开发中比较常见,安全性比较高
命令总结
docker
docker服务相关命令
systemctl start docker
systemctl stop docker
systemctl enable docker
systemctl disable docker
镜像相关的命令
docker pull xxx #拉取镜像
docker images #查看本地的镜像
docker rmi xxx #删除镜像
docker save -o [保存的目标文件名称] [镜像名称] #把镜像打包
docker load -i xxx #加载tar包中的镜像
dokcer build -t xxx:[tag] . #构建自定义镜像
容器相关的命令
docker ps #查看当前运行的容器
docker ps -a #查看所有的容器,包括以停止的容器
docker run #创建并启动容器
docker start xxx #启动容器
docker stop xxx #停止容器
docker rm xxx #删除停止的容器
docker rm -f xxx #强制删除容器,删除运行中的容器
docker logs -f xxx #查看启动日志
数据卷相关的命令
docker volume list #查看数据卷列表
docker volume create xxx #创建新的数据卷
docker volume rm xxx #删除数据卷
docker volume prune #清除一些没有用到的数据卷
#创建容器
docker run --name #容器名称# -p #宿主机端口#:#容器内端口# -v #数据卷#:#容器内部位置# -d -e #容器内的环境变量# --restart=always(开机自启) #镜像名称#:#tag# #设置一些参数#