目录
docker的优势
docker的优势包括:
1、可移植性:docker容器可以在任何支持docker的环境中运行,包括本地开发环境、测试环境和生产环境,从而提高了应用程序的可移植性。
2、可伸缩性:docker容器可以根据负载的变化进行快速扩展和收缩,从而更好地满足应用程序的需求。
3、隔离性:docker容器提供了隔离的运行环境,从而使得不同容器中运行的应用程序互相隔离,避免了应用程序之间的干扰。
docker和虚拟机的区别
隔离性:在于隔离性上面,由于vm对操作系统也进行了虚拟化,隔离的更加彻底。而docker共享宿主机的操作系统,隔离性较差。
运行效率:由于vm的隔离操作,导致生成虚拟机的速率大大低于容器docker生成的速度,因为docker直接利用宿主机的系统内核。它们的启动速度是在数量级上的差距。
资源利用率:在资源利用率上虚拟机由于隔离更彻底,因此利用率也会相对较低。
经典名句:虚拟机已死,容器才是未来
docker架构
docker是一个客户端-服务器(C/S)架构程序。docker客户端只需要向docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。docker提供了一个命令行工具docker以及一整套RESTful API。你可以在同一台宿主机上运行docker守护进程和客户端,也可以从本地的docker客户端连接到运行在另一台宿主机上的远程docker守护进程。
docker镜像与容器
镜像:类似虚拟机镜像 , 是一个特殊的文件系统
操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而docker镜像(Image),就相当于是一个root文件系统。
docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器:类似linux系统环境,运行和隔离应用。是镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
仓库:集中存放镜像文件的地方。
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中存储、分发镜像的地方,比如后面我们要学的,docker Registry就是这样的服务。
docker的安装与卸载
docker的卸载
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
docker的安装
第一步检查系统版本
cat /etc/redhat-release
第二步检查环境安装gcc 和g++
yum -y install gcc
yum -y install gcc-c++
第三步 安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
第四步 添加软件源信息(设置阿里云镜像地址,提高下载速度)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第五步 更新yum软件包索引并安装Docker-CE
yum makecache fast
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker服务相关命令
# 查看docker服务的运行状态
systemctl status docker
# 启动docker服务
systemctl start docker
# 关闭docker服务
systemctl stop docker
# 重启docker服务
systemctl restart docker
配置镜像加速器
优先使用阿里云镜像加速器
阿里云镜像加速器的使用步骤:
1、注册和登录
2、进入管理后台
3、搜索容器镜像服务
4、查看示例代码进行配置即可
配置过程
创建文件daemon.json
vim /etc/docker/daemon.json
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
重启docker生效
docker镜像操作
2.4 容器远程连接失败问题解决
如果容器启动成功(状态为up)
宿主机和虚拟机的网络互相可以ping通
远程连接时等待很长时间 网络超时 连接失败
一般时网络转发的问题
vi /usr/lib/sysctl.d/00-system.conf
# 添加 地址转发
net.ipv4.ip_forward=1
# 重启网络
systemctl restart network
搜索远程镜像
# 命令:
docker search
# 格式:
docker search 镜像关键字
# 示例:搜索镜像名称中包含redis关键字的镜像
docker search redis
1、name: 镜像仓库源名称
2、description: 镜像的描述
3、official: 是否 docker 官方发布
4、stars: 镜像的收藏数,收藏数越多表示此镜像的受欢迎程度越高
5、automated: 是否自动构建
拉取镜像
# 命令:
docker pull
# tag表示的镜像的标签,也可以理解为就是镜像的版本
docker pull 镜像名称[:tag]
# 默认拉取的是最新的redis镜像
docker pull redis
# 拉取redis7.0.10镜像,一个镜像到底存在哪些标签,需要上docker hub中进行查看
docker pull redis:7.0.10
查看本地镜像
docker images
删除本地镜像
docker rmi -f 镜像id #删除单个镜像
docker rmi -f redis #根据镜像名删除
docker rmi -f 镜像名1:TAG 镜像名2:TAG #删除多个镜像
删除全部镜像
docker rmi $(docker images -q) -f
帮助文档的使用
docker --help #查询docker可以使用的命令
docker images --help #查询镜像可以使用的文档
docker 容器操作
查询容器
docker ps #查看本地的容器
docker ps -a #查看本地正在运行的容器
1、container id: 容器名称
2、image: 镜像名称
3、command: 容器启动时所执行的命令
4、created: 创建时间
5、status: 容器状态
6、ports: 端口映射情况
7、names: 容器的名称
创建容器
docker run #容器运行
格式: docker run [OPTIONS] 镜像的名称:镜像标签/镜像id [COMMAND] [ARG...]
类型参数:
-i表示容器运行
-t 表示容器启动后会进入其命令行
--name为创建的容器命名
-v表示目录映射关系
-d在run后面加上,表示创建守护容器在后台运行
-p表示端口映射
交互式方式创建容器
docker run -it --name=mycentos centos:7 /bin/bash
run 运行容器 -i 运行当前容器 -t 进入当前容器行 -- name 指定镜像名称 centos:7 使用该镜像创建
/bin/bash 交互式方式进入容器内部
exit退出当前容器
守护式方法创建线程
docker run -di --name=mycentos10 centos:7
容器服务管理
docker stop 容器名称/容器id # 关闭容器
docker start 容器名称/容器id # 启动容器
docker restart 容器名称/容器id # 重启容器
删除容器
docker rm 格式
docker rm 容器id/名称
删除所有的容器
docker rm $(docker ps -aq)
进入容器
docker exec -it mycentos10 /bin/bash
-i 把交互页面一直保留 -t分配一个虚拟机终端 /bin/bash 交互式的方法进入容器内部
docker logs -f mycentos 查看容器内进程日志 -f 表示实时监控
docker inspect 查看容器详细信息
docker cp 完成容器和宿主机之间的文件copy
备份与迁移
对某个容器进行修改后,可以把最新的容器部署到其他环境中
docker commit mycentos10 mycentos 把docker容器保存成一个镜像
docker save -o mycentos.tar mycentos 镜像保存为tar文件
docker rmi mycentos 删除之前的镜像
docker load -i mycentos.tar 将mycentos.tar恢复成一个镜像
docker数据卷的操作
docker volume ls 查看数据卷
docker volume create redis-cli 创建数据卷
docker volume inspect redis-cli 查看数据卷详情
docker volume rm redis-cli 删除数据卷
数据卷挂载
docker run -d --name=redis02 -p 6380:6379 -v redis-data:/data redis:7.0.10 将创建好的容器挂载到某个目录
目录挂载
通过-v参数也可以将宿主机上的某一个目录挂载到容器中的某一个目录下
docker run -d --name=redis02 -p 6380:6379 -v redis-data:/data redis:7.0.10
Portainer工具
Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护docker环境,管理镜像,容器,数据卷。
docker search portainer 搜索portainer
docker pull portainer/portainer 拉取portainer
创建容器运行: portainer用来对docker的镜像容器进行管理,所以必须挂载docker引擎的文件
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
选择portainer需要管理的环境(本地还是远程)
Portainer的首页
镜像管理
选择docker服务,进入到如下页面
镜像8个,数据卷11
点击镜像页签,对镜像进行相关管理
1,pull 拉取镜像 2.删除镜像 3.镜像id列表
容器管理
点击容器页签,对容器进行相关管理
创建容器
springboot项目部署
6.1.1 dockerfile简介
前面我们所使用的镜像都是别人构建好的,但是别人构建好的镜像不一定能满足我们的需求。为了满足我们自己的某一些需求,此时我们就需要构建自己的镜像,怎么构建?使用dockerfile。
dockerfile就是一个文本文件,在这个文本文件中可以使用docker所提供的一些指令来指定我们构建镜像的细节,后期就可以使用这个dockerfile文件来构建自己的镜像。
dockerfile文件内容一般分为4部分:
1、基础镜像信息(必选)
2、维护者信息(可选)
3、镜像操作指令(可选)
4、容器启动时执行的指令(可选)
指令 | 用法 | 作用 |
---|---|---|
FROM | FROM image_name:tag | 指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,可以出现多次,如果需要在一个dockerfile中构建多个镜像。 |
MAINTAINER | MAINTAINER user_name | 描述镜像的创建者,名称和邮箱 |
RUN | RUN "command" "param1" "param2" | 用来执行一些命令,可以写多条 |
ENV | ENV key value | 设置容器的环境变量,可以写多条。 |
ADD | ADD source_dir/file | 将宿主机的文件复制到容器内,如果是压缩文件,则复制后自动解压 |
ENTRYPOINT | ENTRYPOINT "command" "param1" "param2" | 用来指定容器启动时所执行的命令 |
6.1.2 入门案例
需求:使用dockerfile来构建一个包含Jdk17的centos7镜像
分析:
1、基础的镜像的应该选择centos:7
2、在自己所构建的镜像中需要包含Jdk17,就需要把Jdk17添加到centos:7的基础镜像中
3、为了方便的去使用自己构建的镜像中的Jdk17,就需要去配置环境变量
4、因为Jdk17仅仅是一个开发工具,并不是一个服务进程,因此在启动容器的时候可以不指定任何的执行命令
实现步骤:
1、将Jdk17的安装包上传到linux服务器的指定目录下
2、在Jdk17所在的目录下创建一个dockerfile文件
3、使用docker build命令构建镜像
4、使用docker images查看镜像构建情况
5、使用自己所构建的镜像创建容器,测试Jdk17的安装情况
# 1、创建目录
mkdir –p /usr/local/dockerfilejdk17
cd /usr/local/dockerfilejdk17
# 2、下载jdk-17_linux-x64_bin.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerfilejdk17目录
# 3、在/usr/local/dockerfilejdk17目录下创建dockerfile文件,文件内容如下:
vim dockerfile
FROM centos:7
MAINTAINER atguigu
RUN mkdir -p /usr/local/java
ADD jdk-17_linux-x64_bin.tar.gz /usr/local/java/
ENV JAVA_HOME=/usr/local/java/jdk-17.0.7
ENV PATH=$PATH:$JAVA_HOME/bin
# 4、执行命令构建镜像;不要忘了后面的那个 .
docker build -t centos7-jdk17 .
# 5、查看镜像是否建立完成
docker images
# 6、创建容器
docker run -it --name atguigu-centos centos7-jdk17 /bin/bash
6.2 案例介绍与需求分析
需求:将提供的Spring Boot项目使用容器化进行部署
分析:
1、Spring Boot项目中使用到了Mysql环境,因此需要先使用docker部署mysql环境
2、要将Spring Boot项目使用docker容器进行部署,就需要将Spring Boot项目构建成一个docker镜像
实现步骤:
1、使用docker部署mysql
2、使用dockerfile构建Spring Boot镜像
-
将Spring Boot打包成一个Jar包
-
把Jar包上传到Linux服务器上
-
编写dockerfile文件
-
构建Spring Boot镜像
3、创建容器进行测试
docker部署Mysql
# 创建容器。 -e: 设置环境变量 --privileged=true 开启root用户权限
docker run -di --name=mysql -p 3306:3306 -v mysql_data:/var/lib/mysql -v mysql_conf:/etc/mysql --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql:8.0.30
并创建对一个的数据库和数据库表
创建数据库:docker
创建表:
create database docker;
use docker;
CREATE TABLE `tb_school` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tb_school` VALUES (1, '北京', '北京市昌平区宏福科技园');
INSERT INTO `tb_school` VALUES (2, '上海', '上海市松江区');
INSERT INTO `tb_school` VALUES (3, '深圳', '深圳市宝安区');
INSERT INTO `tb_school` VALUES (4, '西安', '西安市雁塔区');
INSERT INTO `tb_school` VALUES (5, '成都', '成都市成华区');
INSERT INTO `tb_school` VALUES (6, '武汉', '武汉市东湖高新区');
6.4 dockerfile构建镜像
6.4.1 项目打包
具体步骤:
1、在idea中部署资料\基础项目\ebuy-docker项目,并启动项目访问:http://localhost:8081/
2、执行mvn package命令进行项目打包
3、上传jar包到linux服务器上
6.4.2 dockerfile文件
dockerfile文件的内容如下所示:
FROM centos7-jdk17
MAINTAINER shunfeng
# 声明容器内主进程所对应的端口
EXPOSE 8081
ADD ebuy-docker-1.0-SNAPSHOT.jar /ebuy-docker-1.0-SNAPSHOT.jar
# 相当于windows中的cd命令
WORKDIR /
ENTRYPOINT ["java" , "-jar" , "ebuy-docker-1.0-SNAPSHOT.jar"]
6.4.3 构建镜像
命令如下所示:
docker build -t ebuy-docker:v1.0 .
6.5 创建容器
命令如下所示: docker run -d --name ebuy-docker -p 8081:8081 ebuy-docker:v1.0
访问测试: http://192.168.6.131:8081 我的虚拟机地址
8 docker compose
8.1 docker compose简介
1、Docker Compose是一个工具,用于定义和运行多容器应用程序的工具;
2、Docker Compose通过yml文件定义多容器的docker应用;
3、Docker Compose通过一条命令根据yml文件的定义去创建或管理多容器;
Docker Compose 是用来做Docker 的多容器控制,有了 Docker Compose 你可以把所有繁复的 Docker 操作全都一条命令,自动化的完成。
官网地址:https://docs.docker.com/compose/install/linux/
8.2 下载与安装
下载与安装:
-
在安装docker时候已经完成了安装,直接查看版本号,查看是否安装成功
# 创建指定目录存储docker compose
mkdir -p /usr/local/lib/docker/cli-plugins
# 下载并移动
curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
# 给docker-compose文件赋予可执行权限
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
# 查看docker compose的版本
docker compose version
docker 镜像仓库
9.1 镜像仓库简介
镜像仓库作用:存储镜像,可以通过镜像仓库实现镜像的共享
镜像仓库的使用流程:
像仓库分类:
1、公有镜像仓库:可以理解成云仓库、公有仓库,是由某个组织、公司维护的仓库,对互联网开放,所有人共享。如官方的仓库docker hub。
2、私有镜像仓库:不对外开放。一般情况下只在公司内网中使用,用于加快镜像拉取速度、维护公司资产。
私有镜像仓库种类:
1、Registry是Docker自带的镜像仓库,部署运行非常简洁,非常适合在测试时使用。
2、Harbor
9.2 Harbor简介
Harbor是VMware公司开源的企业级DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的Dockerregistry服务。它以Docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。
9.3 下载与安装
Harbor被部署为多个Docker容器,因此可以部署在任何支持Docker的Linux服务器上,且需要Docker和Docker Compose才能安装。
wget https://github.com/goharbor/harbor/releases/download/v2.8.0/harbor-online-installer-v2.8.0.tgz
3.2 安装
具体步骤如下所示:
1、解压并修改配置文件
cd /opt #文件目录
tar -zxvf harbor-online-installer-v2.8.0.tgz # 解压tgz包
cp harbor.yml.tmpl harbor.yml # 创建一个配置文件
vim harbor.yml
配置的文件的修改如下所示:
2、启动Harbor
# 1、 进入到Harbor的解压目录
# 2、执行安装脚本
sh install.sh
注意:如果安装的时候报错了,可以给docker配置多个镜像地址:
// 编辑文件
vim /etc/docker/daemon.json
// 文件内容
{
"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","http://f1361db2.m.daocloud.io","https://mirror.ccs.tencentyun.com","https://phtv51hj.mirror.aliyuncs.com"]
}
3、启动关闭命令
docker compose -f docker-compose.yml up -d 启动 Harbor
docker compose -f docker-compose.yml stop 关闭 Harbor
4、访问Harbor 192.168.150.102
用户名/密码:admin/Harbor12345
9.4 Harbor使用
9.4.1 上传镜像
需求:将本地的ebuy-docker镜像上传到Harbor中
实现步骤:
1、在Harbor上创建一个项目
2.docker添加访问权限
# 编辑/etc/docker/daemon.json文件
vim /etc/docker/daemon.json
# 添加安全访问权限
{
"insecure-registries":["http://192.168.6.131"]
}
# 重启Docker
systemctl restart docker
3、推送docker镜像到该项目中
docker login -u admin -p Harbor12345 192.168.6.131 # 登录到Harbor
docker tag ebuy-docker 192.168.6.131/ebuy-docker/ebuy-docker:latest # 给镜像重新打一个标签
docker push 192.168.6.131/ebuy-docker/ebuy-docker:latest # 推送镜像到Harbor中
推送完毕以后,在ebuy-docker项目中会自动创建一个ebuy-docker的镜像仓库
9.4.2 拉取镜像
命令操作如下所示:
docker login -u admin -p Harbor12345 192.168.150.102 # 登录到Harbor
docker pull 192.168.136.142/ebuy-docker/ebuy-docker:latest # 拉取镜像