docker(应用程序环境封装,到处运行)
一、docker概述
1.1 docker介绍

问题:运维人员要解决产品上线部署会遇到操作系统,运行环境,应用配置,版本环境兼容,遇到的问题。
doker:官网地址:https://www.docker.com/
开源的应用容器引擎,基于GO语言开发。
解决环境兼容问题
口号:“一次封装,到处运行”
1.2 docker优势
可移植性:docker容器可以在任何支持docker的环境中运行,包括本地开发环境、测试,生产环境。
可伸缩性:可根据负载变化进行快速扩展和收缩。
隔离性:提供隔离的运行环境,不同容器中运行的应用程序互相隔离,避免程序间的干扰。
1.3 docker与虚拟机区别

隔离性:vm对操作系统进行了虚拟化,隔离更彻底。每个 VM 运行独立的操作系统(OS),
docker基于宿主机的操作系统内核。
运行效率:由于vm隔离操作,导致生成虚拟机速率大大低于容器docker生成的速度。docker给予宿主机,启动速度远大于vm虚拟机。
资源利用率:虚拟机隔离彻底,利用率相对较低。
1.4 docker架构
C/S架构。
doker提供命令行工具docker以及整套RESTful API。
使用:本地宿主机运行客户端和守护线程或者本地docker客户端连接另一台宿主机运行的远程docker守护线程。


1.5 docker镜像与容器
镜像:类似虚拟机镜像,特殊文件系统。软件安装包。docker镜像,相当于root文件系统。
容器:类似linux系统环境,镜像和容器关系如类和实例。镜像运行的实体。可被创建,启动,停止删除,暂停。
仓库:集中存放镜像文件的地方
1.6 Docker hub
doker公司运营公共的中央仓库docker hub,Registry存放镜像
官网地址:https://hub.docker.com/

一般都会选择官方的的子镜像仓库:

在子镜像仓库中会存在很多的版本的镜像。
1.7 docker安装与卸载
-
docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),CE版本是免费的,EE版本是收费的。本次我们使用社区版。
docker的安装和卸载可以参考官方文档:CentOS | Docker Docs
1.7.1 卸载
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1.7.2 安装
-
第一步 检查系统版本
注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境,而且Docker很多补丁不支持更新。
# 确定是CentOS7.x及其以上版本 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
-
Docker CE(Community Edition)是 Docker 公司推出的免费社区版容器平台
yum makecache fast yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1.8 docker服务相关命令
docker服务操作的相关命令如下所示:
# 查看docker服务的运行状态
systemctl status docker# 启动docker服务
systemctl start docker# 关闭docker服务
systemctl stop docker# 重启docker服务
systemctl restart docker
1.9 配置镜像加速器
docker的使用过程中,需要从远程仓库下载镜像,但是默认为国外网站,所以在下载时可能会出现下载连接超时导致下载失败,因此需要为其配置镜像加速器,以提高下载速度。目前使用的镜像加速器有很多,比如阿里云,网易云等等。
1.9.1 国内镜像地址
0.优先选用★
https://registry.dockermirror.com1.Docker中国区官方镜像
https://registry.docker-cn.com2.网易
http://hub-mirror.c.163.com
3.中国科技大学
https://docker.mirrors.ustc.edu.cn
1.9.2 阿里云镜像地址
阿里云镜像加速器的使用步骤:
1、注册和登录
2、进入管理后台
3、搜索容器镜像服务
4、查看示例代码进行配置即可

1.9.3 配置过程
-
创建文件daemon.json
vim /etc/docker/daemon.json
-
文件中添加如下内容
{
"registry-mirrors":[
"https://registry.dockermirror.com",
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://docker.unsee.tech",
"https://hub.geekery.cn",
"https://mirror.ccs.tencentyun.com",
"https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://hub.rat.dev",
"https://dislabaiot.xyz"
]
}
-
重启docker生效
二、docker镜像操作
2.1 搜索远程镜像
相关命令:
# 命令:
docker search# 格式:
docker search 镜像关键字# 示例:搜索镜像名称中包含redis关键字的镜像
docker search redis
docker search --limit 5 redis
执行效果:

列介绍:
1、name: 镜像仓库源名称
2、description: 镜像的描述
3、official: 是否 docker 官方发布
4、stars: 镜像的收藏数,收藏数越多表示此镜像的受欢迎程度越高
5、automated: 是否自动构建
2.2 拉取镜像
命令:
# 命令:
docker pull# 格式: tag表示的镜像的标签,也可以理解为就是镜像的版本
docker pull 镜像名称[:tag]# 示例1: 默认拉取的是最新的redis镜像
docker pull redis# 示例2: 拉取redis7.0.10镜像,一个镜像到底存在哪些标签,需要上docker hub中进行查看
docker pull redis:7.0.10
执行结果:

docker load -i xxx.tar
2.3 查看本地镜像
命令:
# 命令:
docker images# 示例:
docker images
docker images -qa
执行结果:

列介绍:
1、repository:镜像来源仓库名称
2、tag: 镜像标签
3、image id: 镜像id
4、created: 创建时间
5、size: 镜像的大小
2.4 删除本地镜像
命令:
# 命令:
docker rmi# 删除单个镜像(-f 强制删除):
docker rmi -f 镜像ID# 删除多个镜像:
docker rmi -f 镜像名1:TAG 镜像名2:TAG
# 根据镜像的id或者镜像的名称进行删除,如果不添加镜像的标签删除的就是最新的镜像# 示例:
docker rmi redis:7.0.10 # 删除redis:7.0.10镜像
执行效果:
-
根据镜像名称删除

-
根据镜像id删除

-
注意:如果一个镜像存在对应的容器,此时这个镜像是无法进行删除的。
-
删除所有镜像:
-
docker rmi $(docker images -q)
2.5 帮助文档使用
docker中提供了很多命令,每一个命令也可以加很多的参数选项。把一个命令以及对应的参数选项都记住很显然是不太现实的。可以通过查看docker
帮助文档来学习docker的常用命令以及参数选项的使用。
帮助文档的使用如下所示:
# 查询docker可以使用到的命令 docker --help # 查询images命令的使用文档 docker images --help
执行效果如下所示:

三、docker容器操作
3.1 查询容器
命令:docker ps
格式:docker ps [options] # 可以添加一些参数选项,如果不添加表示查询本地所有正在运行的容器
示例: docker ps # 查看本地正在运行的容器
执行效果:

列介绍:
1、container id: 容器名称
2、image: 镜像名称
3、command: 容器启动时所执行的命令
4、created: 创建时间
5、status: 容器状态
6、ports: 端口映射情况
7、names: 容器的名称
常见参数选项:
-a,--all # 查询所有,包含未运行的容器
-q,--quiet # 查询容器的id示例1:docker ps -a # 查询所有的容器包含未运行的容器
示例2:docker ps -q # 查询容器的id
3.2 创建容器
- 容器分类
- 交互型容器:具有和用户交互的输入和输出终端,容器创建之后自动进入容器,首次退出exit容器后,容器自动关闭。
- 守护型容器:没有和用户交互终端,需要使用docker exec进入容器,退出后,容器不会关闭
- 命令:
命令: docker run
格式: docker run [OPTIONS] 镜像的名称:镜像标签/镜像id [COMMAND] [ARG...]
类型参数选项:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
- 交互式方式创建容器
以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态,可以理解成交互式容器 是前台容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
# 比如:docker run -it --name=mycentos centos:7 /bin/bash
# docker run:表示创建容器
# -it:表示运行容器并进入它的命令行
# --name=mycentos:给当前的容器命名
# centos:7:使用该镜像创建
# /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
# 准备测试镜像
docker pull centos:7
方式创建
docker run -it --name=mycentos centos:7 /bin/bash
#效果:

交互型容器创建好了以后,直接进入到容器的内部了。
退出当前容器:exit,退出之后,容器也退出了,没有删除

- 守护方式创建容器
# 守护式容器和交互式容器的创建方式区别:
# -it 换成 -di
# 去掉后面的 /bin/bash
docker run -di --name=容器名称 镜像名称:标签
# 比如:docker run -di --name=mycentos10 centos:7
效果:

3.3 容器服务管理
docker stop 容器名称/容器id # 关闭容器
docker start 容器名称/容器id # 启动容器
docker restart 容器名称/容器id # 重启容器
3.4 删除容器
命令: docker rm
格式:docker rm 容器名称/容器的id # 删除容器
示例:docker rm mycentos10 # 删除mycentos10容器
注意:上述的命令只能删除已经关闭的容器,如果想删除正在运行的容器,可以通过添加 -f 参数进行实现。
删除所有的容器
docker rm $(docker ps -aq)
3.5 进入容器
命令:docker exec
格式:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常见的参数选项:
-t, --tty # 分配一个虚拟终端,通常和-i参数一起使用
-i,--interactive # 把交互界面一直保留,通常和-t参数一起使用示例1:docker exec -it mycentos10 /bin/bash # 进入到容器中同时打开一个shell窗口
3.6 其他命令
docker logs -f 容器名称/容器的id # 查询容器内进程日志,-f参数表示实时监控日志信息
docker inspect 容器名称/容器的id # 查看容器的详情信息
docker cp # 完成容器和宿主机之间的文件copy示例1: docker logs -f redis01 # 实时查看redis01这个容器中的日志信息
示例2: docker inspect redis01 # 查看容器的详情信息,主要就是:目录映射情况、端口映射情况、ip地址
示例3: docker cp a.txt redis01:/root # 把宿主机中a.txt文件拷贝到redis01的root目录中
示例4: docker cp redis01:/root/a.txt . # 把容器中的root目录下的a.txt文件拷贝到宿主机中当前目录中
3.7 备份与迁移
对某一个容器修改完毕以后,我们可以把最新的容器部署到其他的环境中。具体的流程操作如下所示:

涉及的docker命令:
docker commit 容器名称/容器的id 镜像名称 # 把docker容器保存成一个镜像 docker save -o 镜像tar文件名称 镜像名称/镜像id # 把镜像保存为tar文件 docker load -i 镜像tar文件名称 # 把tar文件恢复成为一个镜像
示例代码:
docker commit mycentos10 mycentos # 将mycentos10容器保存为一个镜像 docker save -o mycentos.tar mycentos # 将mycentos镜像保存为一个tar文件 docker rmi mycentos # 删除之前的mycentos镜像 docker load -i mycentos.tar # 将mycentos.tar恢复成一个镜像
四、docker数据卷操作
4.1 数据卷概述
思考:若redis容器中存储的容器,Redis容器被删除后,数据还存在吗?
解决:将数据存储到Linux宿主机的磁盘目录中
数据卷概述:数据卷是docker所提供的一个虚拟目录,这个虚拟目录会对应苏追的一个真实目录。在创建容器的时候就可以将这个数据卷挂载到容器中的某一个目录下,此时该目录下产生的数据就会被存储到宿主机的目录下,实现容器和宿主机之间的文件共享。

4.2 常见命令
4.2.1 查看数据卷
命令:docker volume ls
效果:
4.2.2 创建数据卷
命令:docker volume create 数据卷名称
效果:
4.2.3 查询数据卷详情
命令:docker volumn inspect 数据卷名称
效果:
4.2.4 删除数据卷
命令:docker volume rm 数据卷名称
效果:
4.3 数据卷挂载
数据卷创建好后,创建容器时可通过-v参数,将创建好的数据卷挂载到容器中的某一个目录下。
命令:
格式: -v 数据卷名称:容器目录
示例:docker run -d --name=redis02 -p 6380:6379 -v redis-data:/data redis:7.0.10Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
tips:
1、如果数据卷没有提前创建好,那么在创建容器的时候会自动创建对应的数据卷
2、数据卷挂载的时候数据卷名称前面没有/
3、容器目录不存在会自动创建
4、数据卷目录如果不为空,此时会使用数据卷目录内容覆盖容器目录内容
5、数据卷目录如果为空,容器目录不为空,此时就会使用容器目录内容覆盖数据卷目录![]()

4.4 目录挂载
通过-v参数可以将宿主机上的某一个目录挂载到容器中的某一个目录下。
命令:
格式: -v 宿主机目录:容器目录
示例:docker run -d --name redis03 -p 6381:6379 -v /redis-data:/data redis:7.0.10
tips:
1、如果宿主机目录没有提前创建好,那么在创建容器的时候会自动创建对应的宿主机目录
2、宿主机目录挂载的时候宿主机目录名称前面有/
3、容器目录不存在会自动创建
4、宿主机目录如果不为空,此时会使用宿主机目录内容覆盖容器目录内容
5、宿主机目录如果为空,容器目录不为空,此时就会将容器目录内容清空掉
五、Spring Boot项目部署
将SpringBoot项目使用docker进行部署,减少项目维护成本。
5.1 dockerfile
5.1.1 dockerfile简介
之前创建的镜像是已经构建好的,不一定满足自身需求,自己构建镜像怎么构建,需要dockerfile
文件来构建自己的镜像。
文件内容构成4部分
1、基础镜像信息(必选)
2、维护者信息(可选)
3、镜像操作指令(可选)
4、容器启动时执行的指令(可选)
常用指令

5.1.2 案例
构建一个包含JDK17的centos7的镜像
1.基础镜像选择centos:7
2.把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 dockerfileFROM 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
5.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、创建容器进行测试
5.3 docker部署Mysql
使用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=1234 mysql:8.0.30 # 进入容器 docker exec -it -e LANG=C.UTF-8 mysql /bin/bash mysql -uroot -p # 登录mysql
并创建对一个的数据库和数据库表
创建数据库: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, '武汉', '武汉市东湖');
5.4 dockerfile构建镜像
5.4.1 项目打包
具体步骤:
1、在idea中部署资料\基础项目\ebuy-docker项目,并启动项目访问:http://localhost:8081/
2、执行mvn package命令进行项目打包
3、上传jar包到linux服务器上
5.4.2 dockerfile文件
dockerfile文件的内容如下所示:
FROM centos7-jdk17 MAINTAINER atguigu # 声明容器内主进程所对应的端口 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"]
目录结构如下所示:
![]()
5.4.3 构建镜像
命令如下所示:
docker build -t ebuy-docker:v1.0 .
执行效果如下所示:

docker服务端开启远程访问
#修改该文件
vim /lib/systemd/system/docker.service
#找到ExecStart行,修改成如下内容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
systemctl daemon-reload #重启守护进程
systemctl restart docker #重启docker
5.4.4 推送镜像
推送到阿里云镜像
-
开通阿里云镜像仓库
-
登录镜像仓库
-
重命名镜像,按照阿里云规范
-
推送镜像

5.5 创建容器
命令如下所示:
docker run -d --name ebuy-docker -p 8081:8081 ebuy-docker:v1.0
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)