目录
1.1准备docker-compose.yml文件配置文件(内容详解)
编辑1.3进入cloud-demo目录下启动docker-compose
前言:本篇是针对讲解Docker的使用步骤和Dokcer能帮助我们完成什么样的需求,所以将会通过实例进行推动讲解,让内容不显空洞, 同时提供案例,方便读者更好掌握与理解
为什么需要使用Docker?使用Docker有什么好处?Docker和虚拟机有什么不同如何解决不同的运行系统环境的问题?
问题一:
一般我们在进行大型的项目部署时,通常会遇到因为大型项目组件多,运行环境复杂、依赖关系复杂、容易出现兼容性问题;同时在进行项目开发的过程中也可能因为项目的开发环境变更(比如开发环境、测试环境、生产环境)导致出现的各种兼容性问题
问题二:
而Dokcer通过将项目中的依赖(如Node.js、redis、Mysql等)的函数库、依赖、配置及其应用通过打包,形成可移植镜像,将每个应用放到一个隔离容器中进行单独运行,使用沙箱机制,相互隔离就解决了项目依赖兼容问题。
同时Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
问题三:
关于第三个问题我们需要知道docker封装的函数库其实封装的库函数是可以直接调用Linux内核的函数,所以docker可以运行在linux的不同版本中(如ubuntu、centos)
同时Docker是一个CS架构程序,由两部分组成:
- 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
- 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
而虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。
所以docker和虚拟机的区别如下
- docker是一个系统进程;虚拟机是在操作系统中的操作系统
- docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
那么什么是镜像什么又是容器呢?
镜像:Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。容器:镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
注意:一个镜像可以对应多个容器
一、在Linux虚拟机中安装Docker
首先需要大家虚拟机联网,安装yum工具(如果虚拟机无法联网和yum无法正常使用可以参考我的另一篇博客(CentOS7--IP地址初始化失败、配置静态ip地址后dns解析错误、yum无法使用,yum镜像问题---超详细解决方法-CSDN博客)
第一步安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
第二步更新本地docker-ce的镜像源,提高下载速度(如果已经配置则可以跳过)
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.repoyum makecache fast
第三步安装docker-ce(社区免费版本)
yum install -y docker-ce
二、Docker基本操作指令讲解以及使用
镜像docker操作有哪些?
- docker images #查看已拉取镜像
- docker rmi #删除镜像
- docker pull #拉取镜像
- docker push #推送镜像
- docker save #将镜像导出到磁盘
- docker load #将导出的镜像导入
1.镜像操作
镜像名称一般分为两部分组成:[repository]:[tag](在没有指定tag时,默认是latest,代表最新版本的镜像)
同时因为Docker应用需要用到各种端口,逐一去修改防火墙设置。博主这里为了方便直接将防火墙进行关闭演示
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
1.1拉取nginx镜像
启动下载的docker
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
配置docker下载镜像源(防止不能连接到docker-hub官网无法进行正常拉取抛出异常:Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers))
输入以下指令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
通过配置镜像加速连接到国内的registry mirror完成文件拉取
再次拉取nginx最新版本
docker pull nginx
查看docker已经安装的镜像文件
docker images
1.2启动nginx镜像
docker run --name nginx-latest -p 80:80 -d nginx
指令解读
- docker run :创建并运行一个容器
- --name : 给容器起一个名字,比如叫做nginx-latest(可以任意起名)
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx(只有一个nginx默认启动latest版本,如果不是latest版本则需要添加tags如:nginx:1.18.0)
查看已经运行的容器
docker ps [option] # 可以添加-a参数查看所有状态的容器(不添加只会查看已启动的容器)
其他容器操作
删除容器:
- docker rm
- 不能删除运行中的容器,除非添加 -f 参数
进入容器:
- 命令是docker exec -it [容器名] [要执行的命令]
- exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的
通过浏览器检查nginx容器运行
ip addr #获取本机的IP地址
这里博主能直接访问是因为已经关闭了linux的防火墙
2.数据卷操作
2.1数据卷讲解
docker提供了可以对容器内的数据直接进行修改的接口,为什么不建议使用呢?
- 不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部修改无法使用第三方提供的操作工具,很不方便。
- 数据不可复用:在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的。
- 升级维护困难:数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了
所以数据卷诞生了
数据卷是一个虚拟目录指向了主机系统中某个物理存在的目录,这么说可能比较抽象
下面用一幅图展示
比如这里的数据卷是conf,html两个文件,它关联了容器中对应的两个文件同时也关联了宿主机自己创建的两个文件,当你对宿主机的这两个文件进行操作和修改时,他同时也会修改容器内对应的两个文件,同时在通过指令创建数据卷并挂载时,宿主机如果不存在数据卷对应的文件则宿主机会自动创建对应文件,同时文件的内容会自动同步为挂载的容器文件的内容。
而且我们也可以提前准备数据卷文件,让容器在启动时加载我们准备的数据卷。
数据卷的基本操作如下:
docker volume [COMMAND]
docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
2.2数据卷挂载 (nginx挂载)
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器目录
#运行名为nginx-volume的nginx容器,挂载html文件(容器内的挂载文件地址可以通过官网查询,或者可以进入容器内进行查看) 同时关联宿主机端口号为8080
docker run --name mn -v html:/usr/share/nginx/html -p 8080:80 -d nginx
#查看数据卷位置在宿主机的挂载位置
docker volume inspect html
#进入目录进行查看
cd /var/lib/docker/volumes/html/_data
修改html文件
vi indes.html
进入网站查看页面信息
这样,我们就完成了数据挂载以及演示
2.3数据卷挂载(将本地文件挂载到容器中)
这里博主演示使用的mysql5.7,挂载本地的data目录到mysql容器内数据存储目录以及hmy.cnf配置文件到mysql容器的配置文件,以及配置docker镜像容器mysql的密码
docker pull mysql:5.7 #拉取mysql5.7版本的镜像
#指令
docker run \
--name mysql-5.7 \
-e MYSQL_ROOT_PASSWORD=1234 \
-p 3307:3306 \
-v /test/mysql/data:/var/lib/mysql \
-v /test/mysql/conf/hny.cnf:/etc/mysql/conf.d/hmy.cnf \
-d mysql:5.7#指令解析:
-e 配置启动容器的环境变量,这里是配置mysql容器的root密码为1234
“\” 表示换行输入
注意:我的本地目录/test/mysql/data是自己创建的一个空目录,在挂载对应容器的目录后,会自动写入相关数据
hmf.cnf文件会在创建容器时被容器挂载并读取文件的配置内容进行配置
检验数据库(这里通过navicat进行连接查看)
能够正确连接和远程访问说明我们的容器启动成功
三、DockerCompose的微服务集群部署
在进行DockerCompose部署之前我们需要先了解docker-compose是什么,以及什么是dockerfile
Dockerfile 就是一个文本文件,其中包含一个个的 指令 (Instruction) , 用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层 Layer 。
- Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。
- Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
- DockerCompose的详细语法参考官网:Compose file reference | Docker Docs
指令
说明
示例
FROM
指定基础镜像
FROM centos:6
ENV
设置环境变量,可在后面指令使用
ENV key value
COPY
拷贝本地文件到镜像的指定目录
COPY ./mysql-5.7.rpm /tmp
RUN
执行Linux的shell命令,一般是安装过程的命令
RUN yum install gcc
EXPOSE
指定容器运行时监听的端口,是给镜像使用者看的
EXPOSE 8080
ENTRYPOINT
镜像中应用的启动命令,容器运行时调用
ENTRYPOINT java -jar xx.jar
将要部署的微服务的项目层级
1.1准备docker-compose.yml文件配置文件(内容详解)
version: "3.2" #指定语法版本
#下面是微服务配置
services:
#nacos配置
nacos: #服务名称(容器名称)
image: nacos/nacos-server #镜像名称
environment: #配置环境变量
MODE: standalone #以单节点的方式进行启动
ports: #配置端口
- "8848:8848"
#mysql配置
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
userservice:
build: ./user-service #找到user-service目录下的Dockerfile文件,并通过dockerfile文件构建userservice的镜像容器
#自定义微服务orderservice
orderservice:
build: ./order-service
#自定义网关
gateway:
build: ./gateway
ports:
- "10010:10010"
1.2准备每个微服务的jar包以及Dockerfile文件
Dockerfile文件内容详解
FROM openjdk:8-jre-alpine #指定基础镜像为java8,通过此镜像配置基本的Java环境
COPY ./app.jar /tmp/app.jar #拷贝本地文件到镜像的指定目录
ENTRYPOINT java -jar /tmp/app.jar #运行jar包
在linux中微服务文件目录
1.3进入cloud-demo目录下启动docker-compose
docker-compose up -d
注意:
如果compose文件中有未引入的镜像文件将会自动从镜像仓库拉取
启动成功
查询页面
完成部署