1.1 为什么要用docker
问题
开发、测试、生产环境不统一,造成项目测试、部署时产生问题
解决方案
使用容器化技术,将环境和项目一起发送给测试、部署人员,测试人数和运维人员直接使用发过 来的环境和项目进行操作,避免环境不统一产生的问题.
1.2 什么是docker
docker官网:Docker: Accelerated Container Application Development
- Docker是一种容器化技术,目前市面上流程的容器化技术有两种:Docker和 Kubernetes(K8S)
- Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。
- Docker诞生于2013年,dotCloud公司出品(后改名为Docker Inc)
- Docker 可以让开发者打包他们的应用以及依赖包及环境到一个轻量级、可移植的容器中, 然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
- Docker 容器是完全使用沙箱机制,相互之间不会有任何接口,容器性能开销极低。
- Docker从17.03版本之后分为CE(Community Edition:社区版)和EE(Enterprise Edition:企业 版)
1.3 docker的应用场景
- Web 应用的自动化打包和发布。 docker+jenkins+git+maven+gitee实现项目自动化集成部署
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
1.4 Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与 基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式 来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少 编写代码和在生产环境中运行代码之间的延迟。
- 快速,一致地交付您的应用程序
- 响应式部署和扩展
- 在同一硬件上运行更多工作负载
2.docker的应用场景
2.1 docker的三个基本概念
2.1.1 镜像
Docker 镜像(Image),就相当于是一个 root 文件系统,也可以理解是一个安装软件包 (.exe)(Linux系统+安装的软件)。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统,Tomcat、mysql等也有相关的景象。
2.1.2 容器
就好比安装好的软件(Linux系统+安装的软件),镜像(Image)和容器(Container)的 关系,就像是面向对象程序设计中的类(镜像)和实例(容器)一样,镜像是静态的定义,容器 是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。就好比通过镜像安装 的系统,或者通过安装软件安装的软件的系统环境和软件。
2.1.3 仓库
仓库可看成一个代码控制中心,用来保存镜像。其本质就是一个镜像仓库。
2.2 镜像和容器的关系
- Docker 容器通过 Docker 镜像来创建
- 容器与镜像的关系类似于面向对象编程中的对象与类。
2.3 docker的架构
3.centos7 安装docker
3.1 安装一些必要的工具
# yum 包更新到最新
yum update
# 安装需要的软件包, yum-utils 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum -y install yum-utils device-mapper-persistent-data lvm2
3.2 添加软件源信息
阿里云服务器不用设置,VMware虚拟机需要做。
# 设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo
3.3 安装docker
# 设置yum缓存
yum makecache fast
# 安装docker,出现输入的界面都按 y
yum -y install docker-ce # Vmware中的安装方式
#yum -y install docker #阿里云安装方式
3.4 启动docker服务
# 启动docker
systemctl start docker
# 查看docker版本,验证是否验证成功
docker -v
3.5 配置阿里云镜像仓库
3.5.1 登录阿里云官网,没有的自己注册一个
3.5.2 点击产品,然后鼠标滑到容器与中间件
3.5.3 点击容器镜像服务 ACR
3.5.4 点击管理控制台
3.5.5 点击镜像工具下的镜像加速器,找到加速地址,第一次没有自己生成一下
3.6 配置加速镜像的地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ynzn5u2a.mirror.aliyuncs.com"]
}
EOF
3.7 重启docker
systemctl daemon-reload
systemctl restart docker
docker -v #查看docker版本
4.docker的相关命令
4.1 查看当前本地有哪些镜像
docker images
docker images -q # 查看所有镜像的id
- REPOSITORY镜像名称
- tag 镜像版本,latest表示最新版本。
- image id 镜像的id
- created 创建了的时间
- size 镜像大小
4.2 搜索镜像
docker search tomcat #到docker仓库中搜索对应名称的镜像
- name:镜像名称
- description:镜像描述
- stars:镜像点赞数
- offical:是否是官方
- automated:是否维护
4.3 下载镜像
- docker pull 镜像名称
- docker pull tomcat 默认下载tomcat最新的镜像
- docker pull tomcat:7.0.56 下载7.0.56版的tomcat镜像
docker pull tomcat:7.0.56
docker push : 将镜像上传到镜像仓库
4.4 删除镜像
- docker rmi 镜像名称/镜像ID
- docker rmi docker images -q # 删除所有本地镜像,注意上撇号。
- 如果镜像生成的有容器,需要先停止容器删除容器才能删除镜像
4.5 运行安装镜像
运行安装镜像,就会产生一个容器
docker run hello-world
- 当然你也可以先下载镜像,再通过镜像运行容器
docker pull hello-world
docker run hello-world
镜像运行执行会产生一个容器。安装好的容器是不会运行的。
4.6 Docker数据卷
问题
- Docker容器删除后,在容器中产生的数据也会随之销毁。
- Docker容器和外部机器可以直接交换文件吗?
- 容器之间想要进行数据交互?
数据卷
- 数据卷是宿主机中的一个目录或文件。
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步。
- 一个数据卷可以被多个容器同时挂载。
- 一个容器也可以被挂载多个数据卷。
- 数据卷可在容器之间共享或重用数据
- 不会在容器删除时删除其挂载的数据卷
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
数据卷挂载
docker run -it -v 宿主机目录:容器内目录 centos
-v:目录映射,即数据卷挂载,可以使用多个-v做多个目录或文件映射。
4.7 安装Tomcat
1.拉取tomcat镜像
docker pull tomcat:7.0.56
2.通过tomcat镜像来创建一个容器
docker run -id -p 8080:8080 -v /webapps:/usr/local/tomcat/webapps --name
mytomcat tomcat:7.0.56
- -i:保持容器运行,通常与-t同时使用。加入it这两个参数后,在此命令中表示进入容器中。
- -d: 以守护(后台)模式运行容器。创建一个容器在后台运行,容器不会自动关闭。
- -t:为容器重新分配一个伪输入终端,通常与-i同时使用。
-it和-id可以在docker run指令中使用
-it:创建交互式容器(前台容器),创建容器之后就会自动进入容器中,退出容器,容器自动 停止
-id:创建守护式容器(后台容器),创建容器之后不会自动进入容器中,退出容器,容器不会 自动停止
交互式容器:以交互式方式创建并启动容器(前台),启动完成后,直接进入当前容器。使用 exit命令退出容器,容器就会停止
守护式容器:以守护式方式创建容器(后台),创建容器之后,不会立刻进入容器中,容器是 在后台 运 行的,使用exit命令退出容器后,容器不会停止,会一直运行。
- -p 8080:8080 : 将宿主机的 8080 端口映射到容器的 8080 端口,即端口映射操作。 (docker容器是完全使用沙箱机制,外部机器不能直接访问,如果想要访问必须让宿主机的 端口和容器的端口映射关联,外部机器通过宿主机端口映射访问容器)
- -v:目录映射,即数据卷挂载,可以使用多个-v做多个目录或文件映射。
- --name mytomcat :创建容器的名称
- 最后一个tomcat:7.0.56是镜像的名称
3.在本机进行测试
4.查看容器的id
docker ps #查看正在运行的容器
docker ps -a #查看所有容器
5.进入到tomcat容器中
执行或进入容器
docker exec -it 容器ID /bin/bash
/bin/bash:使用/bin/bash来解释执行指令。
6.退出容器
exit 容器停止退出 #前台容器会停止退出,后台容器只是退出
ctrl+P+Q 容器不停止退出
7.重启容器
docker restart 容器id //需要把防火墙打开 默认要启用iptables规则
8.容器中的命令小结
- docker ps 查看正在运行的容器
- docker ps -a 查看所有的容器
- docker stop 容器ID 停止容器
- docker start 容器id 启动容器 //需要把防火墙打开 默认要启用iptables规则
- docker restart 容器id 重启容器 //需要把防火墙打开 默认要启用iptables规则
- docker kill 容器ID或者容器名 强制停止容器 docker rm 容器ID 删除已停止的容器
- docker logs -f -t --tail n 容器ID 查看容器日志 (--tail 数字 显示最后多少条)
- docker cp 容器ID:容器内路径 宿主机路径 从容器内拷贝文件到宿主机上
9.通过刚才安装tomcat容器他是一个小型的Linux系统,可以在上面安装并执行相关的软件
10.如果出现404错误解决方式(了解)
进入到容器中,再进入到tomcat的目录中执行以下指令:
cp -r webapps.dist/* webapps
- 在容器中执行以上命令,有的tomcat默认没有webapps,而是webapps.dist
4.8 安装redis
1. 搜索redis镜像
docker search redis
2. 拉取redis镜像
docker pull redis:5.0
3. 创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
4. 使用外部机器连接redis
./redis-cli.exe -h 192.168.149.135 -p 6379
5.镜像和容器的本质
Docker容器中使用的Linux系统是centos系统
5.1 进到tomcat容器中
- docker exec -it 容器ID /bin/bash
- 执行命令 cd /
- 查看目录结构
- 这里也就说明一个容器可以看成一个小型的Linux操作系统
5.2 查看是否安装了jdk
- 由于tomcat需要安装jdk才能起作用,我们看一下tomcat容器中是否安装了jdk
- 在tomcat容器中输入java命令
5.3 总结
- 容器化技术,实际就是在一台机器上运行很多虚拟的容器
- 这些虚拟的容器就是一台台小型的操作系统
- 当我们运行容器的时候,它会自动帮助我们安装需要的软件
- 需要的软件安装好后,把对应的程序给启动起来,我们就可以使用了
5.4 镜像底层是什么
tomcat镜像:
- 是一个shell脚本
- 里面首先编写了安装操作系统的脚本
- 其次编写了安装jdk的脚本
- 最后编写了安装tomcat的脚本