一、初识Docker
1、什么是Docker
项目部署的问题
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
1、依赖关系复杂,容易出现兼容性问题
2、开发、测试、生产环境有差异
Docker如何解决依赖的兼容问题的?
1、将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
2、将每个应用放到一个隔离容器去运行,避免互相干扰
不同环境的操作系统不同,Docker如何解决?我们先来了解下操作系统结构
内核与硬件交互,提供操作硬件的指令
系统应用封装内核指令为函数,便于程序员调用
用户程序基于系统函数库实现功能
Ubuntu和CentOS都是基于Linux内核,只是系统应用不同,提供的函数库有差异
Docker如何解决不同系统环境的问题?
1、Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
2、Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
1、Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
2、Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker如何解决开发、测试、生产环境有差异的问题
Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
总结:
Docker是一个快速交付应用、运行应用的技术:
2、Docker和虚拟机的区别
虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。
总结:
Docker和虚拟机的差异:
3、Docker架构
镜像和容器
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
Docker和DockerHub
DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。
docker架构
Docker是一个CS架构的程序,由两部分组成:
服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
总结:
镜像:
容器:
Docker结构:
DockerHub:
4、安装Docker
企业部署一般都是采用Linux操作系统,而其中又数CentOS发行版占比最多,因此我们在CentOS下安装Docker。
总结:
什么是Docker:
什么是镜像:
什么是容器:
Docker工作流:
二、Docker的基本操作
1、镜像操作
镜像相关命令
镜像名称一般分两部分组成:[repository]:[tag]。
在没有指定tag时,默认是latest,代表最新版本的镜像
案例1:从DockerHub中拉取一个nginx镜像并查看
1、首先去镜像仓库搜索nginx镜像,比如DockerHub:
2、根据查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx
3、通过命令:docker images 查看拉取到的镜像
案例2:利用docker save将nginx镜像导出磁盘,然后再通过load加载回来
步骤一:利用docker xx --help命令查看docker save和docker load的语法
步骤二:使用docker save导出镜像到磁盘
步骤三:使用docker load加载镜像
总结:
镜像操作有哪些?
2、容器操作
容器相关命令
案例:创建运行一个Nginx容器
步骤一:去docker hub查看Nginx的容器运行命令
命令解读:
docker run :创建并运行一个容器
--name : 给容器起一个名字,比如叫做mn
-p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-d:后台运行容器
nginx:镜像名称,例如nginx
总结:
docker run命令的常见参数有哪些?
查看容器日志的命令:
查看容器状态:
案例:进入Nginx容器,修改HTML文件内容,添加“传智教育欢迎您”
步骤一:进入容器。进入我们刚刚创建的nginx容器的命令为:
命令解读:
命令解读:
docker exec :进入容器内部,执行一个命令
-it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mn :要进入的容器的名称
bash:进入容器后执行的命令,bash是一个linux终端交互命令
步骤二:进入nginx的HTML所在目录 /usr/share/nginx/html
步骤三:修改index.html的内容
总结:
查看容器状态:
删除容器:
进入容器:
案例:创建并运行一个redis容器,并且支持数据持久化
步骤一:到DockerHub搜索Redis镜像
步骤二:查看Redis镜像文档中的帮助信息
步骤三:利用docker run 命令运行一个Redis容器
案例:进入redis容器,并执行redis-cli客户端命令,存入num=666
步骤一:进入redis容器
步骤二:执行redis-cli客户端命令
步骤三:设置数据num=666
3、数据卷(容器数据管理)
数据卷
容器与数据耦合的问题
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录
数据卷操作的基本语法如下:
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
create 创建一个volume
inspect 显示一个或多个volume的信息
ls 列出所有的volume
prune 删除未使用的volume
rm 删除一个或多个指定的volume
案例:创建一个数据卷,并查看数据卷在宿主机的目录位置
1、创建数据卷
2、查看所有数据
3、查看数据卷详细信息卷
总结:
数据卷的作用:
数据卷操作:
挂载数据卷
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录
案例:创建一个nginx容器,修改容器内的html目录内的index.html内容
需求说明:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置/usr/share/nginx/html ,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。
提示:运行容器时使用 -v 参数挂载数据卷
步骤:
1、
2、
总结:
数据卷挂载方式:
案例:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
提示:目录挂载与数据卷挂载的语法是类似的:
实现思路如下:
数据卷挂载的方式对比
总结:
三、Dockerfile自定义镜像
1、镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
总结:
镜像是分层结构,每一层称为一个Layer
2、Dockerfile语法
什么是Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
指令 | 说明 | 示例 |
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./mysql-5.7.rpm /tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
更新详细语法说明,请参考官网文档: Dockerfile reference | Docker Docs
3、构建Java项目
案例:基于Ubuntu镜像构建一个新镜像,运行一个java项目
步骤1:新建一个空文件夹docker-demo
步骤2:拷贝课前资料中的docker-demo.jar文件到docker-demo这个目录
步骤3:拷贝课前资料中的jdk8.tar.gz文件到docker-demo这个目录
步骤4:拷贝课前资料提供的Dockerfile到docker-demo这个目录
步骤5:进入docker-demo
步骤6:运行命令:
最后访问 http://192.168.150.101:8090/hello/count,其中的ip改成你的虚拟机ip
案例:基于java:8-alpine镜像,将一个Java项目构建为镜像
实现思路如下:
总结:
四、Docker-Compose
1、初识DockerCompose
什么是DockerCompose
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
•DockerCompose的详细语法参考官网:Overview | Docker Docs
总结:
DockerCompose有什么作用?
2、部署微服务集群
案例:将之前学习的cloud-demo微服务集群利用DockerCompose部署
实现思路如下:
1、查看课前资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件
2、修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名
3、使用maven打包工具,将项目中的每个微服务都打包为app.jar
4、将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中
5、将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署
五、Docker镜像仓库
1、搭建私有镜像仓库
镜像仓库( Docker Registry )有公共的和私有的两种形式:
公共仓库:例如Docker官方的 Docker Hub,国内也有一些云服务商提供类似于 Docker Hub 的公开服务,比如 网易云镜像服务、DaoCloud 镜像服务、阿里云镜像服务等。
除了使用公开仓库外,用户还可以在本地搭建私有 Docker Registry。企业自己的镜像最好是采用私有Docker Registry来实现。
2、在私有镜像仓库推送或拉取镜像
推送镜像到私有镜像服务必须先tag,步骤如下:
1、重新tag本地镜像,名称前缀为私有仓库的地址:192.168.150.101:8080/
2、推送镜像
3、拉取镜像