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系统上演示

官网: https://www.docker.com

# 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架构概念

  • Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

  • 容器(Container) :Docker 利用容器(Container)独立运行的一个或一组应用。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台

  • 仓库(Repository)是集中存放镜像文件的场所。

 其类似

Maven仓库,存放各种jar包的地方;

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

  1. 拉取镜像  docker pull tomcat:版本号

  2. 运行容器  docker run -id --name=tomcat -p 8088:8080 tomcat:8

  3. 测试访问tomcat      虚拟机ip:8088

  如果你下载的是tomcat8以上,可能会出现404的现象

了解原因后才知道tomcat8以后里面没有webapps中没有Root目录

但是其自带的有一个叫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 绑定数据卷命令

  1. 创建一个目录 /app/redis 并把redis.conf放入该目录. 之前一定有redis配置文件【注:这里放入的redis.conf文件,其Redis一样要与你的Redis镜像版本一致,要不然会报错】

  2. 创建一个目录/app/redis/data  【注:存放redis持久化数据 --->dump.rdb】

 

docker run -id --name=redis6 -v /app/redis/redis.conf:/usr/redis/redis.conf  -v /app/redis/data:/data  -p 6380:6379  redis:6.0.20 redis-server /usr/redis/redis.conf

 

测试: 修改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

 

docker run \ -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 \ -d nginx:1.24.0

【浏览器访问即可】

 

测试:

修改html中的index.html文件

保存退出

刷新Nginx容器

docker restart nginx

【注:再次访问虚拟机/服务器ip:82】

测试成功,数据共享成功,配置文件共享成功!

 

8. 自定义镜像

8.1 dockerfile知识扩充

  • Dockerfile是一个文本---任意一个镜像都是通过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中的内容,如有漏缺请在下方留言告知,我会及时补充 

posted @ 2023-09-06 20:53  九极致之术  阅读(17)  评论(0编辑  收藏  举报