Docker——初识
1、Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
-
Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
-
Docker应用运行在容器中,使用沙箱机制,相互隔离
2、Docker如何解决开发、测试、生产环境有差异的问题?
-
Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
3、Docker是一个快速交付应用、运行应用的技术,具备下列优势:
-
可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
-
运行时利用沙箱机制形成隔离容器,各个应用互不干扰
-
启动、移除都可以通过一行命令完成,方便快捷
4、Docker的架构——镜像和容器
Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
运行时利用沙箱机制形成隔离容器,各个应用互不干扰
启动、移除都可以通过一行命令完成,方便快捷
Docker中有几个重要的概念:
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。
一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。
而镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。
容器呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。
我们要使用Docker来操作镜像、容器,就必须要安装Docker。
Docker是一个CS架构的程序,由两部分组成:
-
服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
-
客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
Docker——安装 1、安装Docker
Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。
Docker CE 分为 stable test 和 nightly 三个更新频道。
官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。
2、CentOS 安装DockerDocker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。
2.1 卸载(可选)yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine docker-ce2.2 安装Docker
首先大家虚拟互联网,安装yum工具
yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken
然后更新本地镜像源:
# 设置docker镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i 's/download.docker.com/mirrors.aliyun.com/docker-ce/g' /etc/yum.repos.d/docker-ce.repo yum makecache fast
然后,输入命令:
yum install -y docker-ce
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
2.3 启动DockerDocker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
# 关闭 systemctl stop firewalld # 禁止开机启动防火墙 systemctl disable firewalld
然后输入命令,可以查看docker版本:
docker -v
如图:
2.4 配置镜像加速docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
如果你机器是国内的机器,那么需要配置镜像加速,一般使用阿里云镜像加速 阿里云加速官网
Docker——基本操作
1、Docker——操作镜像
常见的镜像操作命令:
1.1 案例——拉取、查看镜像1.2 案例——保存、导入镜像(企业一般用的比较少,了解即可)
2、Docker——操作容器
常见容器的常用操作命令:
2.1 案例——创建并运行一个容器
3、数据卷(容器数据管理)
要解决这个问题,必须将数据与容器解耦,这就要用到数据卷了。
3.1 什么是数据卷 3.2 数据集操作命令 3.3 创建和查看数据卷
3.4 挂载数据卷 3.5 案例——给Nginx挂载数据卷数据卷的作用:
将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
数据卷操作:
docker volume create:创建数据卷
docker volume ls:查看所有数据卷
docker volume inspect:查看数据卷详细信息,包括关联的宿主机目录位置
docker volume rm:删除指定数据卷
docker volume prune:删除所有未使用的数据卷
Docker-Compose——分布式应用部署
对于熟悉 Docker 的开发者来说,使用 Docker 部署管理更加的简单高效!Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
1、初识Docker ComposeCompose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:
version: "3.8" services: mysql: image: mysql:5.7.25 environment: MYSQL_ROOT_PASSWORD: 123 volumes: - "/tmp/mysql/data:/var/lib/mysql" - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf" web: build: . ports: - "8090:8090"
上面的Compose文件就描述一个项目,其中包含两个容器:
- mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录
- web:一个基于docker build临时构建的镜像容器,映射端口时8090
DockerCompose的详细语法参考官网:Compose specification | Docker Documentation
其实DockerCompose文件可以看做是将多个docker run命令写到一个文件,只是语法稍有差异。
2、 安装DockerCompose2.1 下载
Linux下需要通过命令下载:
# 安装 curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2.2 修改文件权限
修改文件权限:
# 修改权限 chmod +x /usr/local/bin/docker-compose
2.3 Base自动补全命令
# 补全命令 curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果这里出现错误,需要修改自己的hosts文件:
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts3、部署微服务集群
需求:创建一个cloud-demo微服务集群利用DockerCompose部署(此处不写如何创建Cloud项目了,需要的话查看以往的文章。)
实现思路:
① 查看提供的cloud-demo文件夹,里面已经编写好了docker-compose文件
② 修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名
③ 使用maven打包工具,将项目中的每个微服务都打包为app.jar
④ 将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中
⑤ 将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署
version: "3.2" services: nacos: image: nacos/nacos-server environment: MODE: standalone ports: - "8848:8848" mysql: image: mysql:5.7.25 environment: MYSQL_ROOT_PASSWORD: 123 volumes: - "$PWD/mysql/data:/var/lib/mysql" - "$PWD/mysql/conf:/etc/mysql/conf.d/" userservice: build: ./user-service orderservice: build: ./order-service gateway: build: ./gateway ports: - "10010:10010"
4、修改微服务配置可以看到,其中包含5个service服务:
* nacos:作为注册中心和配置中心
image: nacos/nacos-server: 基于nacos/nacos-server镜像构建
environment:环境变量
* MODE: standalone:单点模式启动
ports:端口映射,这里暴露了8848端口
* mysql:数据库
image: mysql:5.7.25:镜像版本是mysql:5.7.25
environment:环境变量
* MYSQL_ROOT_PASSWORD: 123:设置数据库root账户的密码为123
volumes:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据
* userservice、orderservice、gateway:都是基于Dockerfile临时构建的
因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。这里我们将order-service、user-service、gateway服务的mysql、nacos地址都修改为基于容器名的访问。
spring: datasource: url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false username: root password: 123 driver-class-name: com.mysql.jdbc.Driver application: name: orderservice cloud: nacos: server-addr: nacos:8848 # nacos服务地址5、打包
6、拷贝jar包到部署目录
因篇幅和案例项目问题,详细的项目部署流程请参考作者的——项目部署文章内容。