一,Docker简介
1. 什么是容器?
一种虚拟化的方案,操作系统级别的虚拟化,只能运行相同或相似的操作系统,依赖于Linux内核特性:Namespace和Cgroups ( Control Group )。
2. 容器技术和虚拟机的区别:
虚拟机:包含引用及其依赖的库,还要包含操作系统
容器:只需要包含容器及依赖的库
3. 什么是docker?
将应用程序自动部署到容器的开源引擎,只用go语言编写,基于Apache2.0开源授权协议发行。
4. Docker的使用场景
(1). 使用docker容器开发,测试,部署服务
(2). 创建隔离的运行环境
(3). 搭建测试环境(程序的兼容性)
(4). 构建多用户的平台即服务(Paas)基础设施
(5). 提供软件即服务(Saas)应用程序
(6). 高性能,超大规模的宿主机部署
二,Docker的基本组成
1. docker client客户端
2. docker daemon守护进程
docker 客户端 / 守护进程
C/S架构
本地 / 远程
docker 客户端发送命令给守护进程,守护进程处理完返回结果给客户端。
3. docker image镜像
容器基于镜像启动和运行,镜像就好比容器的源代码,保存了用于启动容器的各种条件。
镜像是层叠的只读文件系统:
它的最底端是一个引导文件系统,即bootfs,docker用户几乎永远不会与引导文件系统有交互,实际上,当一个容器启动后,它将被移动到内存中,而引导文件系统则会被卸载。
镜像的第二层为root文件系统,位于引导文件系统之上。root可以是一种或多种操作系统,比如Ubuntu或CentOS,在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并执行了完整性检查后,才会被切换为读写模式。在docker里root文件系统永远只能是只读状态,并且docker利用联合加载(union mount),会在root文件系统之上加载更多的只读文件系统。
联合加载指一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统,联合加载会将各层的文件系统叠加到一起,这样最终的系统会包含多有的底层文件和目录。Docker将这样的文件系统称之为镜像,一个镜像可以放在另一个镜像的顶部,对于下面的镜像称之为副镜像,最底部的镜像称之为基础镜像。
4. docker 容器
通过镜像启动,是docker的执行单元,容器中可以运行客户的一个或多个进程。镜像是docker生命周期中的构建和打包阶段,容器则是启动和执行阶段。
当一个容器启动时,docker会在镜像的最顶层,加载一个读写文件系统,也就是一个可写的文件层,docker中运行的程序就是在这个层中执行的。当docker第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层上。比如如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层,该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏,这就是docker中的一个重要技术---写时复制(copy on write)。每个只读镜像层都是只读的,并且永远不会发生变化。当创建一个新容器时,docker会构建出一个镜像栈,在镜像栈上构建一个可写层,可写层与镜像层与配置数据就构成了一个容器。
5. docker Registry仓库
docker用仓库来保存用户构建的镜像,仓库分为公有和私有两种。
三,Docker容器相关技术简介
Docker依赖的Linux内核特性
1. Namespace 命名空间
在编程语言中的应用,是为了实现封装,即代码隔离。
在操作系统中的应用,时为了系统资源的隔离,比如,进程,网络,文件系统等。
在docker系统系统中,一共应用了以下几种命名空间:
PID (Process ID) 进程隔离
NET (NetWork) 管理网络接口
IPC (InterProcess Communication) 管理跨进程通信的访问
MNT (Mount) 管理挂载点
UTS (Unix Timesharing System) 隔离内核和版本标识
2. Control groups (cgroups) 控制组
cgroups是Linux内核提供的可以限制,记录,隔离进程组所使用的物理资源的机制。
cgroups提供了以下功能
资源限制
优先级设定
资源计量
资源控制
3. 以上两个特性,带给docker容器哪些能力?
文件系统的隔离:每个容器都有自己的root文件系统
进程隔离:每个容器都运行在自己的进程环境中
网络隔离:容器间的虚拟网络接口和IP地址都是分开的
资源隔离和分组:使用cgroups将CPU和内存之类的资源独立分配给每个docker容器
四,镜像的操作
1. 拉取镜像到本地
docker pull 镜像名称[:tag]
2. 查看全部本地镜像
docker images
3. 删除本地镜像
docker rmi 镜像标识
4. 镜像的导入导出(不规范)
将本地的镜像导出
docker save -o 导出的路径 镜像id
加载本地的镜像文件
docker load -i 镜像文件
修改镜像名称
docker tag 镜像id 新镜像名称:版本
五,容器的操作
容器就是运行起来的镜像
1. 运行容器
简单操作
docker run 镜像的标识 镜像名称[:tag]
常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像标识|镜像名称[:tag]
-d : 代表后台运行容器
-p 宿主机端口:容器端口 : 为了映射当前Linux的端口和容器的端口
--name 容器名称:指定容器的名称
2. 查看正在运行的容器
docker ps [-qa]
-a : 查看全部的容器:包括没有运行
-q:只查看容器的标识
3. 查看容器的日志
docker log -f 容器id
-f :可以滚动查看日志的最后几行
4. 进入容器内部
docker exec -it 容器id bash
5. 删除容器(删除容器前,需要先停止容器)
docker stop 容器id //停止指定容器
docker stop $(docker ps -qa) //停止全部容器
docker rm 容器id //删除指定容器
docker rm $(docker ps -qa) //删除全部容器
6. 启动容器
docker start 容器id
六,Docker应用
1. 准备ssm工程
Mysql数据库的连接用户名和密码改变了,修改db.properties
2. 准备Mysql容器
docker run -a -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
3. 准备tomcat容器
已经运行了tomcat容器的话,只需要将ssm项目的war包部署到tomcat容器内部即可。
可以通过命令将宿主机的内容部署到容器内部
docker cp 文件名称 容器id:容器内部路径
例如:docker cp ssm.war fe:/usr/local/tomcat/webapps/
七,数据卷
为了部署SSM的工程,需要使用到cp的命令将宿主机内的ssm.war文件复制到容器内部。
数据卷:将宿主机的一个目录映射到容器的一个目录中。
可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着一起改变。
1. 创建数据卷
docker volume create 数据卷名称
创建数据卷之后,默认会存放在一个目录下/var/lib/docker/volumes/数据卷名称/_data
2. 查看数据卷的详细信息
docker volume inspect 数据卷名称
3. 查看所有数据卷的详细信息
docker volume ls
4. 删除数据卷
docker volume rm 数据卷名称
5. 应用数据卷
当你映射数据卷时,如果数据不存在,Docker会帮你自动创建,会将容器内部自带的文件,存储在默认的存放路径中。
docker run -v 数据卷名称:容器内部的路径 镜像id
直接指定一个就作为数据卷的存放位置,这个路径下是空的
docker run -v 路径:容器内部的路径 镜像id
八,Docker自定义镜像
中央仓库上的镜像,也是Docker的用户自己上传过去的。
1. 创建一个Dockerfile文件,并且指定自定义镜像信息。
Dockerfile文件中含有的内同
from: 指定当前自定义镜像依赖的环境
copy: 将相对路径下的内容复制到自定义镜像中
workdir: 声明镜像的默认工作目录
cmd: 需要执行的命令(在workdir下执行的,cmd可以写多个,只以最后一个为准)
举例:自定义一个tomcat镜像,并且将ssm.war部署到tomcat中
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
2. 将准备好的Dockerfile和相应的文件拖拽到Linux系统中,通过Docker的命令制作镜像
docker build -t 镜像名称[:tag]
九,Docker-Compose
运行一个镜像,需要添加大量的参数。可以通过Docker-compose编写这些参数。Docker-compose可以帮助我们批量的管理容器。只需要通过一个docker-compose.yml文件去维护即可。
1. 下载Docker-Compose
(1). 去github官网搜索docker-compose, 下载docker-compose
(2). 将下载好的文件,拖拽到Linux操作系统中
(3). 需要将DockerCompose文件的名称修改一下,给DockerCompose文件一个可执行的权限
mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose
(4). 方便后期操作,配置一个环境变量
将docker-compose文件移动到了/usr/local/bin,修改了/etc/profile文件,给/usr/local/bin配置到了PATH中
mv docker-compose /usr/local/bin
vi /etc/profile
export PATH=$JAVA_HOME:/usr/local/bin:$PATH
source /etc/profile
(5). 测试一下
在任意目录下输入docker-compose
2. Docker-Compose管理MySQL和Tomcat容器
yml文件以key:value方式来指定配置信息
多个配置信息以换行+缩进的方式来区分
3. 使用docker-compose命令管理容器
在使用docker-compose的命令时,默认会在当前目录下找docker-compose.yml文件
(1). 基于docker-compose.yml启动管理的容器
docker-compose up -d
(2). 关闭并删除容器
docker-compose down
(3). 开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart
(4). 查看由docker-compose管理的容器
docker-compose ps
(5). 查看日志
docker-compose logs -f
4. docker-compose配置Dockerfile使用
使用docker-composer.yml文件以及Dockerfile文件生成自定义镜像的同时启动当前镜像,并且由docker-compose去管理容器。
docker-compose.yml
Dockerfile文件
可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
docker-compose up -d
如果自定义镜像不存在,会帮助我们构建自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像。
重新构建的话:重新构建自定义镜像
docker-compose build
运行前,重新构建
docker-compose up -d --build
十,Docker CI, CD
1. 引言:项目部署
(1). 将项目通过maven进行编译打包
(2). 将文件上传到指定的服务器
(3). 将war包放到tomat目录中
(4). 通过Dockerfile将tomcat和war包转成一个镜像,由DockerCompose去运行容器
项目更新了,将上述流程从头到为执行一次
2. CI介绍
CI (continuous integration) 持续集成
持续集成:编写代码时,完成一个功能后,立即提交代码到GIT仓库中,将项目重新构建并测试。
快速发现错误
防止代码偏离主分支
3. 实现持续集成
(1). 搭建GitLab服务器
创建一个全新的虚拟机,并且至少指定4G的运行内存
安装Docker以及docker-compose
将ssh的默认22端口,修改为60022端口
vi /etc/ssh/sshd_config
PORT 22 -> PORT 60022
systemctl restart sshd
docker-compose.yml文件去安装gitlab(下载和安装的时间比较长)