初识Docker
出现问题
开发、测试、灰度、线上 环境不一致,比如Java、mysql版本、redis补丁。
如果在开发中的环境改变,运维就需要将所有的机器的软件版本进行改变,非常麻烦
Docker用一种容器虚拟化技术,可以将源码、配置、版本、环境一并打包
- 一并打包,任意迁移
- 沙箱机制,互不干扰
Docker如何解决大型项目依赖复杂、兼容性问题?
开发中可以将应用、依赖、函数库、配置一起打包,行程可移植镜像;沙箱机制使应用相互隔离
Docker如何跨系统运行
Linux系统结构分为系统应用、内核、计算机硬件三部分,Docker就将应用程序与系统函数一并打包
虚拟化技术和容器化技术
- 虚拟化技术:操作系统中模拟硬件设备,然后在上面运行另一个虚拟机(另一个操作系统),再在上面运行我们所需要的应用。 占用资源多、性能低
- 容器化技术:只虚拟化内核而不是整个操作系统,每个容器间隔离互不影响。节省资源,轻便、性能好
Docker架构
- 镜像:将应用程序及依赖、环境、配置打包;镜像像一个模板,只能读,可以创建容器
- 容器:可以看成一个简易版的Linux环境(包括root权限、进程空间、用户空间、网络空间、该运行的应用程序)
- 仓库:存放各种镜像模板的地方,分为公开仓库(Docker Hub、阿里云)私有仓库
镜像相当于Java类模板,容器相当于实例对象
- 用户是使用Docker Client与 Docker Daemon建立通信,并发送请求给后者。
- Docker Daemon作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docke
Client的请求。 - Docker Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
- Job的运行过程中,当需要容器镜像时,则从 Docker Registry中下载镜像,并通过镜像管理驱动Grapt
driver将下载镜像以Graph的形式存储。 - 当需要为Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境
- 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成。
- Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。
安装
- yum -y install gcc
- yum -y install gcc-c++
- yum install -y yum-utils
- yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- yum makecache fast
- yum -y install docker-ce docker-ce-cli containerd.io
- systemctl start docker
- docker run hello-world
卸载
- systemctl stop docker
- yum remove docker-ce docker-ce-cli containerd.io
- rm -rf /var/lib/docker
- rm -rf /var/lib/containerd
阿里云镜像加速器地址 https://0vn2fm8g.mirror.aliyuncs.com
docker run ...
流程
常用命令
启动命令
镜像命令
docker images
列出本地的镜像
- REPOSITORY:镜像的仓库源
- TAG:镜像的标签版本号
- IMAGE ID:ID
- CREATED:镜像创建时间
- SIZE:大小
docker search hello-word
查找hello-world镜像
docker pull ubuntu
docker pull redis:6.0.8
拉取镜像
docker rmi hello-world
docker rmi feb5d9fea6a5
删除镜像
docker rmi -f feb5d9fea6a5
强制删除
docker rmi -f $(docker images -qa)
删除所有镜像
docker system df
查看安装镜像占用情况
虚悬镜像:dangling image,仓库名和标签是none
容器命令
- 新建容器
docker run ...
--name="容器名称"
-d
后台运行容器并返回容器ID,也即启动守护容器-i
以交互式模式启动容器-t
为容器重新分配一个伪输入终端-it
启动交互式容器(经常合起来用)docker run -it ubuntu /bin/bash
启动带终端系统
docker ps
查看启动的容器的信息-a
当前的+历史运行的-l
最近创建的-n
显示最近前n个创建的-q
只显示id
- 退出
exit
退出容器ctrl+p+q
退出终端 容器继续运行
docker start ID/name
启动已停止运行的容器docker restart ID
重启容器docker stop ID
停止容器docker skill ID
强制停止容器docker rm ID
删除容器docker rm -f ID
强制删除
docker run -it 前台交互式启动
docker run -d 后台守护式启动,像Redis.MySQL
dockerfile
SpringBoot项目打包镜像运行
交付只需要打包镜像交付就行
- 打包应用
Maven package
- 编写dockerfile
- 上传jar包和dockerfile至一个文件aaa
- 构建镜像 先cd 到文件aaa,
docker build -t demo1 .
- 发布运行
docker run -d -P --name demo1-springboot-web
- 测试,调用hello方法,
curl localhost:ports/hello