初识Docker
项目部署问题
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
1、依赖关系复杂,容易出现兼容性问题
2、开发、测试、生产环境有差异
Docker如何解决依赖的兼容问题的?
1、将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
2、将每个应用放到一个隔离容器去运行,避免互相干扰
不同环境的操作系统不同,Docker如何解决?
我们先来了解一下操作系统结构
其实所有的Linux内核的操作系统都可以分为两次
一层为共享的内核,都为Linux
内核: 负责与计算机硬件交互,提供操作硬件的指令
另一层为上层的系统应用,不同操作系统的上层系统应用不同
系统应用:封装内核指令为函数,便于程序员调用
用户程序基于系统函数库实现功能
Docker如何解决不同系统环境的问题?
1、Docker将用户程序与所需要的调用的系统(比如Ubuntu)函数库一起打包
2、Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行
Docker与虚拟机
1、Docker是一个系统进程;虚拟机是操作系统中操作系统
2、Docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
Docker架构
镜像和容器
镜像(Image):Docker将应用程序及其所需要的依赖、函数库、环境、配置等文件打包在一起。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见
Docker和DockerHub
DockerHub:是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
国内也有类似于DockerHub的公开服务,比如网易云镜像服务、阿里云镜像库等。
Docker是一个CS架构的程序,由两部分组成:
1、服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
2、客户端(client):通过命令或ResrAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令
安装Docker
使用Docker
镜像相关命令
镜像名称一般分为两部分组成:【repository】:【tag】
在没有指定tag时,默认是latest,代表最新版本的镜像
镜像操作命令
查看docker中的所有命令
docker --help
案例1:从DockerHub中拉取一个Nginx镜像并查看
1.首先去镜像仓库搜索nginx镜像
2.通过命令:docker pull nginx 根据查看到的镜像名称,拉取自己需要的镜像
3.通过命令:docker images 查看拉取到的镜像
案例2:利用docker save将nginx镜像导出磁盘,然后通过load加载回来
步骤一:利用docker xx --help命令查看docker save和docker load的语法
步骤二:利用docker tag 创建新镜像munginx1.0
步骤三:使用docker save导出镜像到磁盘
docker save -o nginx.tar nginx:latest
docker rmi nginx:latest
docker load --help
docker load -i nginx.tar
练习:去DockerHub搜索并拉取一个Redis镜像
1.去DockerHub搜索Redis镜像
2.查看Redis镜像的名称和版本
3.利用docker pull命令拉取镜像
4.利用docker save命令将redis:lates打包为一个redis.tar包
5.利用docker rmi删除本地的redis:latest
6.利用docker load重新加载redis.tar文件
docker pull redis
docker images
docker save -o redis.tar redis:latest
docker rmi redis:latest
docker load -i redis.tar
容器相关命令
案例1:创建运行一个Nginx容器
步骤一:去docker hub查看Nginx的容器运行命令
命令解读:
docker run : 创建并运行一个容器
--name:给容器起一个名字,比如叫做mn
-p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-d:后台运行容器
nginx:镜像名称,例如nginx
docker run --name containerName -p 80:80 -d nginx
案例2:进入Nginx容器,修改HTML文件内容,添加“欢迎您”
步骤一:进入容器。进入刚刚创建的nginx容器
命令解读:
docker exec:进入容器内部,执行一个命令
-it:给当前进入的容器创建 一个标准输入、输出中断,允许我们与容器交互
mn:要进入的容器的名称
bash:进入容器后执行的命令,bash是一个linux终端交互命令
docker exec -it mn bash
步骤二:进入nginx的HTML所在的目录/usr/share/nginx/html
cd /usr/share/nginx/html
步骤三:修改index.html的内容
sed -i 's#Welcome to nginx#欢迎您#g' index.html
sed -i 's#<head>#<dead><meta charset="utf-8">g' index.html
练习1:创建并运行一个redis容器,并且支持数据持久化
步骤一:到DockerHub搜索Redis镜像
步骤二:查看Redis镜像文档中的帮助信息
步骤三:利用docker run命令运行一个Redis容器
docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes
docker exec -it mr bash
redis-cli
keys *
set num 666
gei num
exit
exit
数据卷
容器与数据耦合的问题
数据卷(volume):是一个虚拟目录,指向宿主机文件系统中的某个目录
操作数据卷
数据卷操作的基本语法如下:
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
create | 创建一个volume |
inspect | 显示一个或多个volume的信息 |
ls | 列出所有的volume |
prune | 删除未使用的volume |
rm | 删除一个或多个指定的volume |
案例1:创建一个数据卷,并查看数据卷是否在主机的目录位置
1.创建数据卷
docker volume create html
2.查看所有数据
docker volume ls
3.查看数据卷详细信息卷
docker volume inspect html
挂载数据卷
我们在创建容器的时候,可以通过-v参数挂载一个数据卷到某个容器目录
案例1:创建一个nginx容器,修改容器内的html目录内的index。html内容
需求说明:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在的位置/usr/share/nginx/html,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
提示:运行容器时使用-v参数挂载数据卷
1.创建容器并挂载到数据卷到容器内的html目录
docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx
2.进入html数据卷所在位置,并修改html内容
docker inspect html
cd /var/lib/docker/volumes/html/_data
vi index.html
自定义镜像
镜像的结构
什么是Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像。没一个指令都会形成一层Layer
案例1:基于Ubuntu镜像构建一个新镜像,运行一个java项目
什么是dockerCompose
DockerCompose部署微服务集群