Docker 技术
一、docker简介
文档位置:https://docs.docker.com/ 文档很详细
仓库地址 https://hub.docker.com/ 命令和git一致
简介:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
- dockerClient客户端
- Docker Daemon守护进程
- Docker Image镜像
- DockerContainer容器
虚拟机缺点:
1、资源占用十分多
2、冗余步骤多
3、启动很慢
容器化技术:
容器化技术不是模拟的一个完成的操作系统
比较Docker和虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。
DevOps (开发、运维)
- 应用更快速的交付和部署
1、传统:一堆帮助文档,安装程序
2、Docker :打包镜像发布测试,一键运行
- 更便捷的升级和扩缩容
1、使用了Docker之后,我们部署应用就和搭积沐一样!
2、项目打包为一个镜像,扩展服务器A!服务器B
-
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。 -
更高效的计算资源利用:
Docker是内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
二、Docker基本安装
[HTML_REMOVED]
(一)Docker 的基本组成
镜像( image ) :
- docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像-=-=> run ==> tomcat01容器(提供服务 器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器( container ) :
- Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。启动,停止,删除,基本命令!
- 目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository ) :
- 仓库就是存放镜像的地方!
- 仓库分为公有仓库和私有仓库!
- Docker Hub(默认是国外的)
- 阿里云....都有容器服务器(配置镜像加速!)
(二)安装Docker
环境准备
1、服务器版本 CentOS 8.2.2004 x86_64
2、连接工具 宝塔
环境查看
# 系统内核
[root@my-hecs ~]# uname -r
4.18.0-240.10.1.el8_3.x86_64
# 系统版本
[root@my-hecs ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="8"
安装
# (1)卸载旧的版本
[root@my-hecs ~]# yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
# (2)安装需要的安装包
[root@my-hecs ~]# yum install -y yum-utils
Last metadata expiration check: 0:44:27 ago on Mon 06 Dec 2021 10:48:54 PM CST.
Package yum-utils-4.0.18-4.el8.noarch is already installed.
Dependencies resolved.
Nothing to do.
Complete!
# (3)设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #国外的地址
# 设置阿里云的Docker镜像仓库
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国外的地址
#(4)更新yum软件包索引
yum makecache fast # 该命令适用于centos7版本及以下
yum makecache # 该命令适用于centos8版本
#(5)安装docker相关的配置
docker-ce 是社区版,docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io
# (6) 启动Docker
systemctl start docker
# (7) 查看当前版本号,是否启动成功
docker version
# (8) 设置开机自启动
systemctl enable docker
# (9)下载hello-world镜像进行测试
docker run hello-world
# (10)查看镜像文件
docker images
# (11) Docker的卸载
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源 . /var/lib/docker是docker的默认工作路径
rm -rf /var/lib/docker
(三)配置华为云镜像加速器
1、进入华为云官网,搜索容器镜像服务
https://console.huaweicloud.com/console/?region=cn-north-4#/home
2、点击镜像中心,然后添加镜像加速器
3、找到华为云的镜像加速器地址
镜像加速地址: https://0c87f5266b800f2a0f58c005d8cd7f40.mirror.swr.myhuaweicloud.com
4、将加速地址配置到文件中
[root@my-hecs ~]# cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
[root@my-hecs ~]# chmod 777 /etc/systemd/system/docker.service
[root@my-hecs ~]# vi /etc/systemd/system/docker.service
把ExecStart这一行后面的改为
–registry-mirror=华为云加速网址
ExecStart=/usr/bin/dockerd --registry-mirror=你的华为云加速地址
# 最后重启docker
systemctl daemon-reload
systemctl restart docker
# 如果出现重启失败,则需要删除 /etc/docker/daemon.json 下的文件中 `registry-mirrors` 的内容
vim /etc/docker/daemon.json
# 验证docker加速配置情况
ps -ef | grep docker
# 如果有以下内容,表示配置成功
三、Docker容器运行流程
启动一个容器,Docker的运行流程如下图:
四、底层原理
Docker 是一个 Client-Server 结构的系统,Docker 的守护进程运行在主机上,通过 Docker 从客户端访问!
Docker Server 接收到 Docker-Client 的指令,就会执行这个指令!
# Docker为什么比VM Ware快?
1、Docker比虚拟机更少的抽象层
2、docker利用宿主机的内核,VM需要的是Guest OS
Docker新建一个容器的时候,不需要像虚拟机一样重新加载一个操作系统内核,直接利用宿主机的操作系统,而虚拟机是需要加载Guest OS。Docker和VM的对比如下:
五、Docker常用命令
[HTML_REMOVED]
(一)基础命令
docker version #查看docker的版本信息
docker info #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令(可查看可选的参数)
docker COMMAND --help
命令的帮助文档地址: https://docs.docker.com/engine/reference/commandline/docker/
(二)镜像命令
1、docker images 查看本地主机的所有镜像
[root@my-hecs ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest bbf6571db497 4 days ago 516MB
hello-world latest feb5d9fea6a5 2 months ago 13.3kB
mysql 8.0.19 0c27e8e5fcfa 19 months ago 546MB
#解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id
2、docker search 搜索镜像
[root@my-hecs ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11789 [OK]
mariadb MariaDB Server is a high performing open sou… 4488 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 882 [OK]
#可选参数
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
#搜索收藏数大于3000的镜像
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10308 [OK]
mariadb MariaDB is a community-developed fordockerk of MyS… 3819 [OK]
3、docker pull 镜像名[:tag] 下载镜像
## 下载最新版
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
Using default tag: latest #如果不写tag默认就是latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete #分层下载,docker image的核心-联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #下载来源的真实地址 #docker pull mysql等价于docker pull docker.io/library/mysql: latest
## 指定版本下载
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec7b7d162b2: Already exists
fedd960d3481: Already exists
7ab947313861: Already exists
64f92f19e638: Already exists
3e80b17bff96: Already exists
014e976799f9: Already exists
59ae84fee1b3: Already exists
7d1da2a18e2e: Pull complete
301a28b700b9: Pull complete
529dc8dbeaf3: Pull complete
bc9d021dc13f: Pull complete
Digest: sha256:c3a567d3e3ad8b05dfce401ed08f0f6bf3f3b64cc17694979d5f2e5d78e10173
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
4、docker rmi 删除镜像
#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id
#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f $(docker images -aq)
(三)容器命令
# 1、如拉取一个centos容器
docker pull centos
docker run [可选参数] image
#参数说明
--name="名字" 指定容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
(
-p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
)
-P 随机指定端口(大写的P)
# 2、退出容器
#exit 停止并退出容器(后台方式运行则仅退出)
#Ctrl+P+Q 不停止容器退出
# 3、列出运行过的容器
# docker ps
# 列出当前正在运行的容器
-a # 列出所有容器的运行记录
-n=? # 显示最近创建的n个容器
-q # 只显示容器的编号
# 4、删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
# 5、启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器
docker kill 容器id #强制停止当前容器
(四)其他常用命令
# 1、日志的查看
六、SpringBoot项目部署
[HTML_REMOVED]
(一)查看是否有centos镜像文件,如果没有就拉取centos镜像文件
查看结果:
没有centos镜像文件就需要拉取
(二)拉取成功后就将制作镜像的文件上传到服务器(虚拟机)
我这里是一个SpringBoot项目,所以有一个jar包、前端dist目录、jdk11 压缩包、redis压缩包、xampp集成器软件(包含mysql数据库)、mysql文件。
(三)启动 centos 镜像文件并且进入
(四)将这些文件拷贝到centos镜像文件中
按住 ctr + p + q 退出容器但是不关闭容器,然后将刚刚上传的文件拷贝到镜像文件中
(五)再次进入刚刚的容器,然后进入到更目录,查看是否存在刚刚复制的目录以及目录下的文件
(六)安装NGINX
(七)安装vim编辑器
因为镜像文件本身就省略了很多命令,所以需要重新下载vim编辑器
(八)编辑 NGINX 配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {p
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /root/campus-visitor/management-system/manage/dist; # 项目的路径
include /etc/nginx/default.d/*.conf;
location = / {
root /root/campus-visitor/management-system/manage/dist;
index index.html;
}
location / {
proxy_pass http://127.0.0.1:8899/;
}
location ~* \.(html|css|js)$ {
root /root/campus-visitor/management-system/manage/dist;
}
location ~* \.(png|jpg|jpeg|woff|woff2|ico)$ {
root /root/campus-visitor/management-system/manage/dist;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
启动 nginx ,查询运行效果
(九)搭建mysql数据环境
1、进入 xmapp 软件目录,给xmapp 赋予运行权限,然后运行 xampp-linux-x64-7.4.26-0-installer.run ,
2、进入 lampp 安装目录,默认目录是在 opt/lampp下,并且查看当前进程
3、安装 net-tools 网络工具
4、启动 lampp ,并查看进程
5、因为 xampp 软件关闭的时候不能关闭 mysql ,所以需要手动关闭或者 kill mysql进程
6、因为只需要 mysql 的服务,所以只需要启动 mysql
7、进入数据库,并且查看当前有的数据库
8、创建项目需要的数据库
9、退出数据库,将数据库文件导入新建的数据库,并且查看新增的数据表
10、设置数据库密码,将数据库密码设置到和 java 项目中的配置文件中的密码和账号,并且退出后使用新密码登录
(十)安装JDK环境
1、进入 /usr/local 目录,新建一个用于存放 jdk 的 java 目录
2、解压 jdk 到 java 目录
3、修改环境变量
export JAVA_HOME=/www/wwwroot/Java/jdk-16.0.2
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
4、查看 jdk 和 jre 是否安装好
(十一)安装 Redis 或者 Redis集群
1、解压 redis 安装包l
- 进入之前导入文件的资源目录,找到redis压缩包,为了方便管理,在改目录下新建一个redis目录,再将压缩包移动到该目录下
- 解压文件 redis 压缩包
- 查看解压后的文件夹
2、编译 redis
- redis 编译之前需要安装C语言运行的环境,及安装 gcc-c++
- centos镜像文件中没有make指令,所以需要安装 make 指令
- 进入 安装目录,然后使用 make 命令进行编译
- 进入安装目录下的src文件夹,安装 redis
- 安装完成后,通过过滤查看redis的客户端程序和服务器端程序
3、启动redis服务器端
4、新打开一个窗口,启动redis客户端,进行简单的连接测试
5、搭建 redis 集群环境
1、新建 conf 和 data两个目录,用于存放数据和配置文件
2、新建 redis-6380.conf 文件,并编写配置文件
bind 127.0.0.1
port 6380
# 日志记录文件名
#logfile "/root/campus-visitor-management-system/redis/redis-6.2.5/data/6380.log"
# 数据库的个数
databases 16
# 启动日志是否打印在控制台 设置服务器以守护进程的方式运行
daemonize yes
# 目录的位置
dir /root/campus-visitor-management-system/redis/redis-6.2.5/data
# rdb快照文件的存放的位置
dbfilename dump-6380.rdb
# 设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩
rdbcompression yes
# 设置是否进行RDB文件格式校验,该校验过程在写文件和读文件过程均进行
rdbchecksum yes
# 每10s改变两个就保存一次
save 10 2
# 默认值是No,意思是不使用AOF增量持久化的方式,使用RDB全量持久化的方式。把No值改成Yes,使用AOF增量持久化的方式
appendonly yes
# 密码配置
requirepass abc123456abc
# 主节点的密码
masterauth abc123456abc
# 保护模式
protected-mode yes
# 因为这种模式下每write后都会调用fsync
appendfsync always
# 云服务器上部署需指定公网ip
# cluster-announce-ip 123.60.224.189
# Redis总线端口,用于与其它节点通信
cluster-announce-bus-port 16380
# aof持久化文件存放位置
appendfilename appendonly-6380.aof
# 开启集群的节点配置
cluster-enabled yes
# 节点配置文件的名字
cluster-config-file nodes-6380
# 节点挂机询问时间
cluster-node-timeout 10000
3、依次新建其他节点的配置文件
可使用如下命令将 6380的配置文件复制,然后将里面的6380的串给替换掉
4、启动 redis 集群
- 进入 redis 安装目录中的 src 目录,查看当前redis的进程,然后分别以配置文件的形式启动,然后再查看 redis 进程
- 启动redis3主3从的集群架构
./redis-cli --cluster create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 --cluster-replicas 1 -a abc123456abc
- 启动客户端,连接集群,测试集群是否搭建成功
(十二)启动 jar 包
(十三)制作镜像文件
1、以退出但不关闭镜像文件的形式退出,将制作好的项目提交成镜像文件
- 新建一个目录用于存放镜像文件
- 提交制作镜像文件
- 镜像文件制作成功
(十四)启动镜像文件
1、启动镜像文件
2、启动 mysql
3、启动 nginx
4、启动 JDK
5、启动 redis 节点以及 redis 集群
6、进入项目更目录,启动 jar 包
7、在浏览器输入服务器ip和端口进行访问
(十五)将项目部署为一键启动的镜像文件
1、编辑 Dockerfile 文件
- 以不关闭镜像文件的方式退出镜像文件,进入项目根目录中之前新建的 images 目录,然后新建 Dockerfile 文件,文件名必须是这个名字,然后编辑文件
From campus-visitor-management-system:1.0
Maintainer kin wuchengxiang
env HOME /root
WorkDir $HOME
Add docker-entrypoint.sh $HOME
run chmod 777 docker-entrypoint.sh
Entrypoint ["./docker-entrypoint.sh"]
Expose 80 8899 3306
2、编辑 docker-entrypoint.sh 脚本文件
#! /bin/bash
/opt/lampp/lampp startmysql;
nginx;
source /etc/profile;
redis-server /root/campus-visitor-management-system/redis/redis-6.2.5/conf/redis-6380.conf;
redis-server /root/campus-visitor-management-system/redis/redis-6.2.5/conf/redis-6381.conf;
redis-server /root/campus-visitor-management-system/redis/redis-6.2.5/conf/redis-6382.conf;
redis-server /root/campus-visitor-management-system/redis/redis-6.2.5/conf/redis-6383.conf;
redis-server /root/campus-visitor-management-system/redis/redis-6.2.5/conf/redis-6384.conf;
redis-server /root/campus-visitor-management-system/redis/redis-6.2.5/conf/redis-6385.conf;
nohup java -jar /root/campus-visitor-management-system/campus-visitor-management-system-1.0.0.jar > campus-visitor-management-system.txt ;
tql