1、Docker是什么
分布式微服务现在已成为主流技术,但是服务拆分后服务数量庞大,依赖冲突、环境部署会很麻烦,Docker可以解决这一系列问题
如何解决依赖冲突问题
-
将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包,每个容器就像一个小的系统
-
采用容器化技术,将每个服务放到隔离容器,避免互相干扰
如何解决不同系统环境的问题
应用执行步骤:用户应用-->系统应用(操作系统函数库)-->linux内核-->计算机硬件
-
Docker将用户程序与所需要调用的系统函数库一起打包
-
Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行
Docker优势
-
可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
-
运行时利用沙箱机制形成隔离容器,各个应用互不干扰
-
启动、移除都可以通过一行命令完成,方便快捷
Docker和虚拟机的区别
-
docker是一个系统进程仅封装了系统的函数库并没有模拟一个完整的操作系统;虚拟机是在操作系统中的操作系统,模拟了一个完整的操作系统
-
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
2、Docker架构
2.1容器和镜像概念
镜像(Image):
Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):
镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。
一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。而镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。容器呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。
2.2镜像仓库
存储镜像的地方
-
DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。
-
国内也有类似于DockerHub 的公开服务,比如
公司一般会搭建自己的镜像仓库
2.3架构模型
Docker是一个CS架构的程序,由两部分组成:
-
服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
-
客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
3、安装Docker
基于centos7安装流程(其他系统参照官网
3.1 卸载(可选)
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
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-ce
3.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即可安装成功。
3.3 启动docker
Docker应用需要用到各种端口,学习阶段建议大家直接关闭防火墙!企业应用阶段为了安全性需要我们按需开放端口
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
通过命令启动docker:
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
然后输入命令,可以查看docker版本:
docker -v
3.4 配置镜像加速
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://wfdhhn4l.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
4、Docker镜像操作
Docker镜像名称一般包含两部分:名称:版本 如果没有指定版本默认为latest(最新镜像)
docker pull 拉取一个镜像 具体需要去dockerhub查看 docker images 查看镜像 docker save -o [保存的目标文件名称] [镜像名称] 导出保存镜像 docker rmi 删除镜像 docker load -i 加载镜像文件
5、Docker容器操作
创建并运行一个容器
docker run --name 名称 -p 主机端口:容器端口 -d 镜像名称 -p 端口 -name 名称 -d 后台运行
暂停容器
docker pause 实例名称
恢复运行
docker unpause 实例名称
停止容器
docker stop 实例名称
启动容器
docker start 实例名称
删除一个容器
docker rm 实例名称
查看所有容器
docker ps -a
查看运行中容器
docker ps
进入容器(后面会采用挂在数据卷的形式可以使用高级编辑器编辑容器内容)
docker exec -it 容器名称 bash -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互 mn :要进入的容器的名称 bash:进入容器后执行的命令,bash是一个linux终端交互命令
查看容器日志
docker logs
持续查看容器日志
docker logs -f
6、数据卷(容器数据管理)
解决问题:
-
容器数据不便于修改
-
容器数据不可以复用
-
容器升级维护困难
6.1 数据卷定义
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
完成数据卷挂在后,容器内数据通过数据卷可以与本地目录进行双向绑定,对容器的一切操作都会作用在数据卷对应的宿主机目录了。
6.2 操作命令
-
创建一个数据卷
docker volume create
-
显示一个或多个数据卷的信息
docker volume inspect
-
列出所有的数据卷
docker volume ls
-
删除未使用的数据卷
docker volume prune
-
删除一个或多个指定的数据卷
docker volume rm
-
挂载数据卷
docker run --name 名称 -p 主机端口:容器端口 -v 数据卷名称:容器内目录 -d 镜像名称
可以通过多个 -v 挂载多个数据卷
也可以直接挂载本地目录 -v 本地目录:容器内目录
数据卷挂载与目录挂载区别
数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看
7、Dockerfile自定义镜像
7.1 镜像结构
7.2 Dockerfile语法
构建自定义的镜像时,并不需要一个个文件去拷贝,打包。
我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
-
基于Ubuntu构建Java项目
-
新建一个文件夹
-
拷贝jdk,jar包到改文件夹下
-
在文件夹新建文件DockerFile
-
修改文件内容如下
# 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR=/usr/local # 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo.jar /tmp/app.jar # 安装JDK RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8 # 配置环境变量 ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin # 暴露端口 EXPOSE 8090 # 入口,java项目的启动命令 ENTRYPOINT java -jar /tmp/app.jar
-
执行构建命令
docker build -t javaweb:1.0 .
. 表示当前目录
-
-
基于java8构建Java项目
基本上与上面一致,dockerfile文件内容改为无需拷贝jdk 只需要拷贝我们的jar包
FROM java:8-alpine COPY ./app.jar /tmp/app.jar EXPOSE 8090 ENTRYPOINT java -jar /tmp/app.jar
8、Docker-Compose(集群部署)
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:
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的详细语法参考官网:https://docs.docker.com/compose/compose-file/
8.1 安装Docker-Compose
下载
Linux下需要通过命令下载:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
如果下载速度较慢,或者下载失败
可以在网上下载docker-compose文件:上传到/usr/local/bin/
目录也可以。
修改文件权限
# 修改权限
chmod +x /usr/local/bin/docker-compose
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/hosts
8.2 集群部署
-
修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名然后将各个服务打包为jar包
-
每个服务创建一个文件夹,用来存放jar包,以及DockerFile
-
新建一个docker-compose.yml文件 格式例子如下
version
可以看到,其中包含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-compose up -d
9、Docker镜像仓库
9.1 简化版镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。
9.2 带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
version
访问http://ip:5000/v2/catalog 可以查看当前私有镜像服务中包含的镜像
9.3 配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://自己的ip:上面配的端口"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
9.4 镜像仓库的使用
推送镜像到私有镜像服务必须先tag,步骤如下:
docker tag nginx:latest ip:上面配的端口/nginx:1.0
② 推送镜像
docker push ip:上面配的端口/nginx:1.0
③ 拉取镜像
docker pull ip:上面配的端口/nginx:1.0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库