Docker
1. Docker概述
Docker是基于Go语言实现的云开源项目
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”
也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”
在我们正常工作中,主要有以下环境:
1.开发环境
2.测试环境
3.上线环境
现想象,如果在开发过程中,我们已经开发后,将项目进行打包编译后,交给测试人员,那么,测试人员会将工程包放入到测试服务器中
but
如果在开发中,我们使用的开发版本与测试服务器运行环境的版本不同,而造成的项目运行不起来,这一现象我们称为‘水土不服’
那么现在引入docker概念,将开发时的环境统一与项目工程打包在一起,形成一个个容器,这样,这个工程无论在哪个环境都可以正常运行
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的
将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器
只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
2.安装Docker
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上
本次测试以Centos系统上演示
# 1、yum包更新到最新--更新centos7系统
yum update
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源--指定docker下载路径
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#4、安装docker ,出现输入的界面都按y。 ce:社区版【】 ee:企业版【收费】
yum install -y docker-ce
# 5、查看docker版本,验证是否验证成功
docker -v
【注:第一步可能会有点慢,因为要更新系统中的软件等】
3.Docker架构概念
容器(Container) :Docker 利用容器(Container)独立运行的一个或一组应用。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
其类似
github仓库,存放各种git项目的地方;
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方
仓库分为公开仓库(Public)和私有仓库(Private)两种形式
最大的公开仓库是 Docker Hub(https://hub.docker.com/)
4.配置Docker镜像加速器
打开浏览器搜索阿里云
登录或注册后进入后搜索镜像(容器镜像服务)
点击进入打开管理控制台面板
找到图中位置,并且复制红框框中的命令到linux系统终端里运行命令(不用管它,一条龙服务)
如果不放心,可以去这个地址 /etc/docker/daemon.json 查看文件内容
cat /etc/docker/daemon.json
【注:每个人的镜像加速器命令是不一样的】
5.Docker相关命令
5.1 关于Docker服务命令
systemctl start docker 【注:启动docker】
systemctl stop docker 【注:关闭docker】
systemctl restart docker 【注:重启docker】
systemctl enable docker 【注:开启开机不关闭docker】
systemctl status docker 【注:查看docker状态 | 开启/关闭状态】
docker --help 【注:查看docker帮助,能查看关于docker命令】
docker 具体命令 --help 【注:查看docker帮助,能查看docker中具体命令的语法】
5.2 关于Docker镜像命令
docker images 【注:查看本地都有哪些镜像】
docker search 具体某物
【注:查看远程仓库的镜像,例:docker search mysql,其会搜索远程仓库中关于mysql的所有版本】
docker pull 具体某物:版本号
【注:将从远程仓库中拉取指定的某物到本地下载,例:docker pull mysql:5.7 【注:如果不输入版本号默认最新的版本】】
docker rmi 镜像名:版本号 【注:删除本地已下载的镜像,后面可跟镜像名,也可跟镜像ID】 docker rmi 镜像ID
docker 命令 --help 【注:docker帮助命令,可帮助你查看命令的语法格式】
5.3 关于Docker容器命令
docker ps 【注:查看本地正在运行的容器】
docker ps -a 【注:查看本地所有的容器 |不管在不在运行都会被查看】
docker run -it --name=容器名 镜像名:版本 /bin/bash 【注:创建一个容器且进入已创建好的容器】
exit 【注:退出当前容器】【注:在此命令下,退出的容器会关闭 |进程会关闭】
Ctrl+Q+P 【注:退出当前容器】【注:在此命令下,退出的容器不会关闭,会在后台继续运行着】
docker exec -it 容器名/容器ID /bin/bash
【注:进入正在运行的容器内】【注:在此命令下进入的容器,在次使用exit命令退出,容器不会关闭了】
docker start 容器名/容器ID 【注:启动docker容器】
docker stop 容器名/容器ID 【注:关闭docker容器】
docker rm 容器名/容器ID 【注:删除已关闭的容器【注:不能删除已开启的容器】】
【注:强制删除容器【注:不管容器是否已启动都会强制删除】】
docker rm -f 容器名/容器ID docker logs 容器名/容器ID 【查看容器启动异常的日志】
6.容器的数据卷
【注:容器的数据卷需要引入三个问题】
1.docker容器被删除后,那么docker容器中的数据会被删除吗?答案是肯定的
2.docker容器可以与外部机器进行文件传输吗?答案是否定的
3.容器与容器之间如果进行数据交互?
这里就可以引入容器的数据卷概念,其是通过在宿主机(也就是linux系统)创建一个目录与docker容器中某个目录进行绑定
绑定后,数据即可进行共享
数据卷的概念:
数据卷是宿主机中的一个目录或文件
当容器目录和数据目录绑定后,对方的修改会立即同步
一个数据卷可以被多个容器同时挂载
一个容器也可以被挂载多个数据卷
作用:
1.解决数据持久化问题
2.解决外部机器和容器的间接通讯问题
3.解决容器之间的数据交换
6.1配置数据卷
docker run -it --name=容器名 -v 宿主机目录:容器内目录 镜像名:版本 /bin/bash
【注:在创建容器时,将数据卷与容器中某个目录进行绑定】
【注:目录必须是绝对路径】
【注:如果目录不存在会自动创建】
【注:可以挂载多个数据卷,多个数据卷绑定空格分隔】
【注:列:docker run -it --name=容器名 -v 宿主机目录:容器目录 -v 宿主机目录:容器目录 -v 宿主机目录:容器目录 ...... 镜像:版本 /bin/bash】
7. Docker应用部署
7.1 安装mysql
1. 从远程仓库拉取mysql镜像: docker pull mysql:5.7
2. 运行mysql容器:
docker run -id --name=容器名 -p 宿主机端口:容器的端口 -e MYSQL_ROOT_PASSWORD=密码 镜像名:版本
> -p :表示宿主机的端口和容器内部端口映射
> -e :表示环境设置
3. 外界navicat连接mysql容器.
连接外界连接成功
【注;如果删除容器后,容器内部的数据是否还存在。必须使用数据卷】
【注:因此在次创建docker容器时将宿主机上的mysql数据卷与docker容器绑定】
docker run -id -p 3308:3306 -v /app/mysql/log:/var/log/mysql -v /app/mysql/data:/var/lib/mysql -v /app/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name=c12 mysql:5.7
那么此时将容器删除,再次创建一个新的容器,令端口指向3308:3306 ,创建好容器后,去数据库刷新连接,发现数据并没有丢失
7.2 安装tomcat
运行容器 docker run -id --name=tomcat -p 8088:8080 tomcat:8
但是其自带的有一个叫webapps.dist目录,其中携带的有
docker exec -it tomcat /bin/bash 【注:进入到容器中】
将原本自带的webapps目录删除,且将webapps.dist目录修改为webapps
修改后再次访问浏览器 虚拟机/服务器ip:8088
7.3 安装Redis
7.3.1 不绑定数据卷的命令
docker run -id --name=redis6 -p 6380:6379 redis:6.0.20
【注:如果本地不存在你下载的版本或者镜像,它会自动帮你从远程仓库自动拉取下载,所以一个命令两个作用】
连接redis--window图形化界面
【注:这种方式有个弊端:因为如果想修改redis的配置文件,或者redis重启后数据丢失。就比较麻烦了】
7.3.2 绑定数据卷命令
测试: 修改redis.conf配置文件 默认数据库16 改为15个,查看宿主机与容器配置文件同步
测试: docker exec -it 容器名 /bin/bash 【注:向Redis中存入数据】
redis-cli
set k1 v1
save
测试:把容器删除 在重写启动一个容器 新的容器中是否存在原来的数据
7.4 安装RabbitMQ
这个就很好安装了
docker run -id --name=rabbit -p 5673:5672 rabbitmq:management
【注:当然,你也可以先通过镜像拉取将RabbitMQ下载好,然后在创建启动容器】
【注:在浏览器访问的时候有可能需要你输入15673端口才能进入】
7.5 安装Nginx
准备工作:
在自己宿主机分别创建:
html
log
conf
目录
我的三个目录创建在了 /app/nginx/
# 生成容器 docker run --name nginx -p 9001:80 -d nginx:1.24.0 # 将容器nginx.conf文件复制到宿主机 docker cp nginx:/etc/nginx/nginx.conf /app/nginx/conf/nginx.conf # 将容器conf.d文件夹下内容复制到宿主机 docker cp nginx:/etc/nginx/conf.d /app/nginx/conf/conf.d # 将容器中的html文件夹复制到宿主机 docker cp nginx:/usr/share/nginx/html /app/nginx/
创建容器并运行:
在创建容器之前首先要把咱们之前的生成的容器删除
docker rm -f nginx
-p 82:80 \ --name nginx \ -v /app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /app/nginx/conf/conf.d:/etc/nginx/conf.d \ -v /app/nginx/log:/var/log/nginx \ -v /app/nginx/html:/usr/share/nginx/html \
【浏览器访问即可】
测试:
修改html中的index.html文件
保存退出
刷新Nginx容器
docker restart nginx
【注:再次访问虚拟机/服务器ip:82】
测试成功,数据共享成功,配置文件共享成功!
8. 自定义镜像
8.1 dockerfile知识扩充
文件包含了一条条的指令
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
图解:
8.2 dockerfile中的关键字
9. dockerfile实例
9.1 实例一(编写简单dockerfile)
在虚拟机/服务器随便一个位置创建一个dockerfile文件
这里就在 /app/dockerfile/ 中创建了一个名为 CentosDockerFile 文件
构建镜像文件:
docker build -f 写的镜像文件名 -t 新的镜像名:镜像版本 .
-f:表示dockerfile文件
-t: 镜像名称版本号
. : 必须加上
创建自己定义的容器
docker run -it --name myc1 mycentos:1.0 /bin/bash
测试:
创建容器进入后,输入vim命令是否成功运行
成功!
【注:使用 :exit 命令即可退出】
9.2 实例二(将java工程编写成镜像)
【注:这里以新建工程作为测试,你也可以直接打包你的项目进行测试】
打开idea创建一个新的springboot工程
创建controller层中的HelloController类
随后直接打包成jar包
将jar包移入宿主机中
这里就直接移入到 /app/dockerfile/ 目录中
创建dockerfile文件并编辑,这里就以MyProjectDockerFile来命名
FROM java:8 MAINTAINER baby<6666@163.com> ADD DockerTestProject-0.0.1-SNAPSHOT.jar test.jar EXPOSE 8080 CMD java -jar test.jar
构建此镜像
docker build -f MyProjectDockerFile -t myproject:1.0 .
创建此镜像容器
docker run -id --name p1 -p 8085:8080 myproject:1.0
创建好容器后直接打开浏览器访问咱们的接口 虚拟/服务器ip:8080/index
自定义镜像,与创建容器成功!!
10. 上传远程镜像仓库
【注:这里是将自己写好的镜像上传到远程镜像仓库】
【注:这里选择的是阿里云镜像仓库】
进入阿里云官网,如果没有账号需要注册和实名认证
搜索容器镜像服务
进入管理控制台
选择创建个人实例(这里为了测试,所以个人版就够了)
点击创建镜像仓库
此时,等创建后,打开服务器/虚拟机 按照阿里云为你提供的步骤一步一步走
$ docker login --username=熊某不是熊某 registry.cn-hangzhou.aliyuncs.com $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/aaaqy/mywarehouse:[镜像版本号] $ docker push registry.cn-hangzhou.aliyuncs.com/aaaqy/mywarehouse:[镜像版本号]
docker images 查看本地镜像,找到刚才我们自定义的项目镜像
docker tag f366162abc0c registry.cn-hangzhou.aliyuncs.com/aaaqy/mywarehouse:1.0
使用阿里云的命令将镜像的id和版本号填入命令中的括号中,版本一定要对应
docker push registry.cn-hangzhou.aliyuncs.com/aaaqy/mywarehouse:1.0
使用阿里云的命令将镜像版本号填入命令中的括号中,版本一定要与上一条命令中填入的版本号一致
镜像推送成功!
10.1 测试拉取镜像且运行容器
测试:从远程仓库中拉取自己刚刚传入的镜像且创建运行容器
我们先把自己刚刚自定义的镜像和容器删除 -->
删除容器:docker rm -f p1
删除镜像:docker rmi -f myproject:1.0
从远程仓库拉取自己的镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/aaaqy/mywarehouse:[镜像版本号]
拉取成功
创建运行容器
docker run -id --name myp1 -p 8086:8080 registry.cn-hangzhou.aliyuncs.com/aaaqy/mywarehouse:1.0
直接打开浏览器输入 服务器/虚拟机ip:8086/index
成功!!!!
以上便是Docker中的内容,如有漏缺请在下方留言告知,我会及时补充