Docker简介,可以看上一篇文章:
为什么互联网公司离不开Docker容器化,它到底解决了什么问题?-CSDN博客
Docker体系结构
docker核心就是镜像和容器:
镜像就是应用程序的安装文件,包含了所有需要的资源,但是不能运行。
容器是最终运行的产物,每个容器都是可以独立运行的应用程序。
需要先在服务器上安装docker引擎,才可以进行使用,服务器上安装doker引擎后,会内置一个客户端。docker的执行过程为:客户端发送docker命令,docker引擎接收到命令后,会检查本地是否有镜像,没有的话就用远程仓库把镜像下载,然后创建容器,对外提供服务。
说明:本文章是学习docker的使用,所以是在Windows电脑上,安装了虚拟机,在虚拟机中安装CentOS7操作系统,在CentOS7中进行docker的部署;在实际的项目部署时,不需要虚拟机,而是直接在服务器上进行部署。
环境准备
安装虚拟机的步骤省略。
虚拟机安装后,在虚拟机中安装CentOS7,参考文章:
在VMware中安装和配置linux系统_vmware创建虚拟机-CSDN博客
CentOS7配置网络的教程(让CentOS7可以和物理机网络互通,同时可以访问互联网),参考文章:
VMware虚拟机环境下Centos7 静态IP的设置方法_虚拟机设置ip-CSDN博客
为了操作方便,使用Xsheel和Xftp进行命令操作和文件传输,这两个软件直接从官网下载即可,安装免费版本。下载地址:家庭/学校免费 - NetSarang Website
以上步骤全部操作完成,把虚拟机运行起来,找到安装的操作系统并开机,便可以用Xsheel直接访问CentOS7了。这是在物理机上使用Xsheel连接上CentOS7后的样子:
在CentOS7上安装docker
1.安装底层工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
这是安装Docker的底层工具,它就会自动提示下载,很快下载就完成了。
如果遇到报错的情况,可以参考这个文章进行解决:
安装docker 遇到异常Could not resolve host: mirrorlist.centos.org
2.加入阿里云yum仓库提速docker下载过程
sudo yum-config-manager --add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
增加阿里云的Docker下载仓库,默认情况下,Docker官方是从他的国外的服务器下载速度是非常慢的,所以在这里我们是使用yum config manager组件来指定一个新的下载源,指向的是阿里的应用服务器,通过阿里来提高我们Docker的下载速度。
3.更新一下仓库的源信息
sudo yum makecache fast
4.自动安装下载Docker
sudo yum -y install docker-ce
在这里它就会自动的下载解析,可以看到利用阿里云下载速度是非常快的,Docker便自动安装成功。
5.启动Docker服务
sudo service docker start
6.验证docker是否启动成功
docker version
至此docker安装成功,docker它的安装过程,因为操作系统可能有不同,但是命令每个平台都是一样的,docker version显示我们当前已安装的版本。
7.配置镜像加速器
因为docker需要从远程的仓库中下载镜像,速度比较慢,为了快速下载镜像文件,通过使用国内提供的仓库进行镜像的下载,操作步骤如下:
vi /etc/docker/daemon.json
删除原有的配置,替换为下面的配置:
{
"registry-mirrors": ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"]
}
保存并退出文件编辑。
重新启动docker
systemctl daemon-reload
systemctl restart docker
到此为止,docker镜像加速器配置就完成了。
应用部署实战
部署一个Java编译后的jar包程序,并通过NGINX反向代理服务器,对应用进行访问:
要部署的应用架构如下:
app1、app2、app3代表3个应用,模拟分布式架构。NGINX负责请求转发,分别将用户请求转发给三个应用,三个应用连接MySQL数据库进行数据获取。
以上内容均放在一个虚拟网段中,给该网段起名:my-bridge。
1.创建虚拟网段
docker network create -d bridge my-bridge
2.构建MySQL 5.7 容器,并挂载到容器内部
把素材放到服务器/usr/local目录下
素材文件下载地址:
https://download.csdn.net/download/liangmengbk/90062212?spm=1001.2014.3001.5503
docker run \
-p 3306:3306 \
--network my-bridge \
--name db \
-v /usr/local/bsbdj/sql:/docker-entrypoint-initdb.d \
-v /usr/local/bsbdj/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
命令解读:
- docker run ...mysql 5.7 代表创建并自动运行mysql 5.7 容器,如果宿主机没有mysql 5.7镜像,则自动会从dockerhub进行下载。
- --name db是容器的名字。
- -p 3306:3306 代表将容器内部MySQL5.7 映射到宿主机的3306端口,这样才可以从外界进行访问。
- --network my-bridge 代表将db容器加入到my-bridge虚拟网段,这样才可以和其他容器通信。
- -v /usr/local/bsbdj/sql ... 代表将宿主机的sql目录挂载到容器内的docker-entrypoint-initdb.d,根据dockerhub 的描述,放入docker-entrypoint-initdb.d目录下的SQL文件会在MySQL容器创建后自动执行,完成数据初始化任务。
- -v /usr/local/bsbdj/data ...同样是挂载,因为容器很容易创建或迁移,如果将MySQL数据文件保存在容器内部,容器销毁数据就会丢失,因此同样使用-v命令将容器内产生的数据文件挂载到宿主机的data目录下,这样即使容器销毁数据也不会丢失。
- -e MYSQL_ROOT_PASSWORD=root ,mysql容器要求的环境参数,说明创建容器时默认数据库root密码为root。
- -d 代表采用后台模式运行,不加-d则采用前台独占方式运行。
注意:docker发现宿主机上没有MySQL容器,会自动下载。
安装的MySQL对应的架构图如下:
MySQL安装完成后,使用navicate工具进行访问:
数据库和表都已经创建完成,创建数据库和表用到的脚本就是/usr/local/bsbdj中sql目录中提前准备好的脚本:
3.构建应用镜像
在上传到/usr/local/bsbdj目录下资料中,有个dockerfile文件,这个文件是用来构建应用镜像的,也就是把自己的应用程序,构建为docker的镜像文件。
dockerfile文件内容:
FROM openjdk:11 表示引用openjdk11的镜像,在这个镜像基础上进行扩展,
ADD ./app /usr/local/bsbdj 将指定的宿主机文件,复制到容器内部。
WORKDIR /usr/local/bsbdj 在镜像内部切换工作目录
CMD ["java","-jar", "bsbdj.jar"] 执行 java -jar bsbdj.jar 命令
切换到dockerfile文件所在的路径下面:
cd /usr/local/bsbdj
执行创建镜像的命令:
docker build -t itlaoqi/bsbdj:1.0 .
该命令的作用是读取dockerfile文件,并在宿主机上生成镜像。
镜像的名称是自定义的,这里定义为 itlaoqi/bsbdj:1.0
最后面的点,代表当前目录。
镜像创建完成后,查看所有安装部署在宿主机上的镜像:
docker images
这个就是我们自己创建的镜像文件。
4.创建APP容器
docker run \
--name app1 \
--network my-bridge \
-p 8080:8080 \
-d itlaoqi/bsbdj:1.0
docker run --name app2 \
--network my-bridge \
-p 8081:8080 \
-d itlaoqi/bsbdj:1.0
docker run \
--name app3 \
--network my-bridge \
-p 8082:8080 \
-d itlaoqi/bsbdj:1.0
上面的命令会创建3个应用容器,三个容器都是基于同一个镜像(itlaoqi/bsbdj:1.0)生成的,三个容器名称分别为app1、app2、app3
在浏览器中访问宿主机(CentOS操作系统的IP,我的IP为192.168.1.10),加上应用的端口,就可以访问应用系统了。
三个应用容器通过不同的端口,都可以正常访问。
需要注意的地方,jar包程序中数据库链接需要与数据库容器名称一致,应用才能访问到数据库。
这里的db就是MySQL容器的名称,代码中的名称要跟容器名称一致,才能访问数据库。
5.创建Nginx容器
创建反向代理服务器,配置负载均衡策略。
docker run --name nginx \
-v /usr/local/bsbdj/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network my-bridge \
-p 80:80 \
-d nginx
注意:docker发现宿主机上没有NGINX容器,会自动下载。
命令解读:
docker run --name nginx \ 运行NGINX容器,如果没有则自动部署
-v /usr/local/bsbdj/nginx/nginx.conf:/etc/nginx/nginx.conf \ 用宿主机上的文件替换NGINX容器中的配置文件
-p 80:80 \ 宿主机的80端口对应到NGINX容器的80端口。
/usr/local/bsbdj/nginx/nginx.conf文件是提前准备好的NGINX配置负载均衡策略的文件。
配置文件中核心部分是上图所示的位置,app1、app2、app3指应用容器的名称,后面的8080代表容器内提供服务的端口。这里一定要填写容器内服务的端口,不是宿主机的端口(8080/8081/8082)。
location / 代表对请求做转发,proxy_pass为转发的规则,bsbdj对应到upstream的名称。当前的配置默认采用轮询的方式,对请求均匀进行转发。
通过浏览器访问应用,验证NGINX是否部署成功,通过访问宿主机的IP(80端口可以省略),能够正常访问,就说明NGINX部署完成了。
6.实用脚本
查看网段内的容器信息
docker network inspect my-bridge
my-bridge是指虚拟网段名称。
在containers中看到容器,都是互联互通的。这些容器都是通过容器名称(Name)来互相访问的。
查看当前启动的容器
docker ps
删除上面已经安装的所有容器与镜像
docker rm -f nginx
docker rm -f app1
docker rm -f app2
docker rm -f app3
docker rm -f db
docker rmi -f itlaoqi/bsbdj:1.0
docker rmi -f mysql:5.7
docker rmi -f openjdk:11
docker network rm my-bridge
rm 指移除容器
-f 指强制操作
rmi 指删除镜像
network 虚拟网段
docker官网:https://hub.docker.com/
如果要在多台服务器上进行容器集群部署,需要使用另外的技术Kubernetes(K8s)。K8s被称为容器编排工具,作用是在docker的基础上进行大规模、多节点、多容器的统一管理和统筹。而且提供了响应的监控和管理界面。可以同时管理超过20万台服务器已经上百万个容器实例。