Docker的个人理解
首先我对于Docker的理解分为两部分,第一是对名字上的理解,我们都知道docker的英文翻译是“码头工人”的意思,所以我们也可以理解为docker是码头上的一个个集装箱的使用。这也与他的图标很相似。其次我是对于其功能上的理解,他跟我们电脑上的虚拟机很相似,但又不同,相似的是他也同虚拟机一样,把每个项目都部署在了一个包里面,但不同的地方是Docker他是直接把这个项目的系统函数库、依赖、配置和环境都给打包了起来。这与JVM虚拟机不同,JVM虚拟机还需要通过Hypervisor来再一次部署。
从这里不难看出,Docker给我们的项目部署提供了比较好的方案,也可以简单的来说docker相当于在操作系统上的软件,而虚拟机搞出来的相当于是在操作系统里面又搞了一个操作系统
Docker的架构
Docker的架构,在这里面我们需要明白Docker两个最重要的东西,一个是镜像(Image)另一个是容器(container)。
镜像(image)相当于是一个可读性光盘,我们可以从里面复制出很多个容器但不能对光盘本身进行一个修改
容器(container)相当于是我们拿出来的项目,我们需要在这个项目里面进行我们自己需要的逻辑操作。
我们在实现Docker的架构的时候,我们把它分成两个部分:客户端——Docker Server(docker daemon)——Docker镜像仓库(registry)
Docker的基本使用
在Docker中,我们需要使用它,往往在Linux系统中去使用
docker的安装
首先:安装Docker之前为了避免安装错误,我们先把之前可能安装过的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
然后我们需要联网下载yum-utils工具
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.reposed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repoyum makecache fast
最后我们开始安装我们的docker:
yum install -y docker-ce
等待安装好了之后我们还需要做的事情就是把防火墙给关闭
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
然后使用docker -v查看Docker的版本信息,查到了证明我们安装成功了
其实到了这一步我们还没有完全结束Docker的安装,在安装完这些之后我们还需要安装相应的镜像加速器-参考阿里云的镜像加速文档:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
docker的使用
镜像的基本操作指令如上诉图片
操作指令遇到不会的我们可以使用类似于docker save --help的操作来查找自己想要的操作
除了镜像的基本操作之外我们更需要学习的还有容器的基本操作,容器的基本操作就会涉及到数据卷(volume)的概念
其实我们在有了docker容器之后我们虽然可以在容器中进行一个操作,但是有很多其他的基本操作我们还是实现不了,所以这个时候我们就很自然的引出了卷的概念
通过volume的映射来达到操作容器内文件的效果,其基本语法为:
数据卷的重点(挂载的使用)
docker run \
--name mn \
-v html:/root/html \
-p 8080:80
nginx \
通过上面哪个代码我们可以实现在创建nginx容器的时候把html文件数据挂载在/root/html文件里面
之后我们通过Linux的操作就可以实现对容器内文件的操作了
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
这样我们就成功的挂载数据卷了,我们在Linux系统中操作html文件,容器中的html目录下的html文件也会相应的改变
除了挂载数据卷,我们还可以进行数据目录的挂载
以MySQL数据挂载为例子:
我们在tmp文件目录下进行操作,把mysql.tar文件加载进来之后我们执行:
docker load -i mysql.tar 进行镜像导入
然后我们再在tmp目录下创建两个目录/mysql/conf和/mysql/data两个目录
在进入mysql目录后上传conf文件到conf目录下
去DockerHub查阅资料,创建并运行MySQL容器
两种方式的比较:
一个是自动处理,一个是手动处理,但是自己知道在什么位置
docker镜像的结构
docker的镜像结构可以分为三个类别:Entrypoint(入口)、Layer(层:可以有很多)、BaseImage(基础镜像)
更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
我们需要建立一个自定义java运行镜像的流程大致是这样的:
第一:首先把jdk跟项目jar包给拉到一个自己创建的目录下,然后编写一个dockerfile文件也拉进来然后运行(最后那个点很重要,他表示在当前目录下创建镜像)
dockerfile文件:
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/# 安装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/binCOPY ./docker-demo.jar /tmp/app.jar
#这行代码才是真正的Java运行其他的都可以使用FROM java:8-alpine(版本号)来实现# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
docker build -t 名字:版本 .
然后我们跑起来:
docker run --name 随便取 -p 端口映射:实际端口 -d 名字:版本
Docker部署微服务集群
部署集群:Docker-Compose
对于dockerCompose的理解:用来部署分布式的一个帮手(要基于compose文件实现)
compose文件就是n个docker run命令的集合,但是它用语法替代掉了run,具体是一个yml文件:
version: "3.8" #版本号services:mysql: #服务名就是mysqlimage: mysql:5.7.25environment: 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"
DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/
DockerCompose的安装
不过我们在使用DockerCompose的时候我们需要先对dockerCompose进行一个安装
安装:
# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 修改权限
chmod +x /usr/local/bin/docker-compose
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果这里有错误需要修改host文件
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
如何使用dockerCompose去部署一个服务集群:
首先我们需要一个跟你的Java项目相对应的一个服务包,然后再父工程下面要有一个yml配置文件,然后再每个服务里面还需要又相应的dockerfile文件
#父工程下的yml文件version: "3.2"services:nacos:image: nacos/nacos-serverenvironment:MODE: standaloneports:- "8848:8848"mysql: #并没有端口,因为不对外访问image: mysql:5.7.25environment:MYSQL_ROOT_PASSWORD: 123volumes:- "$PWD/mysql/data:/var/lib/mysql" #PWD是当前的意思,方便挂载- "$PWD/mysql/conf:/etc/mysql/conf.d/"userservice:build: ./user-serviceorderservice:build: ./order-servicegateway: build: ./gateway
#dockerfile完成当前构建(这句话的意思是在yml当前文件下找到gateway文件里面的dockerfile文件)ports:- "10010:10010" #只对外提供10010端口
然后我们在去自己的Java项目中修改相对应的配置(如之前的localhost要改成相应的服务名字,比如mysql中url的localhost就需要改成mysql,其他服务也类似nacos地址要改成nacos),并且打包后的名字改成dockerfile的内容写名字
最后准备就绪之后我们使用docker-compose up -d即可后台运行项目
然后我们使用docker-compose logs -f 来查看日志
结束
Docker的私有镜像仓库
个人理解:当我们进入公司工作的时候,我么不可能把公司的镜像放在比如阿里啊
什么的公共镜像仓库里面,所以我们就有了私有镜像仓库。
搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。
官网地址:https://hub.docker.com/_/registry
我们有两个版本:一个是简化版另一个是带图形化界面的版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:
version: '3.0'
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE=自己取一个自定义名字- REGISTRY_URL=http://registry:5000depends_on:- registry
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
操作之后我们还需要再去新建一个文件夹用来存储镜像mkdir registry-ui
之后我们在去执行touch docker-composer.yml 建立一个文件用来编写compose文件内容
编写好了之后我们就可以基于compose文件内容创建自己的镜像docker-compose up -d
结束~~
我们可以在自己定义的网址里面看到自己的私有的镜像仓库有些什么内容了。
====================下面是个人感悟============================
学习了docker之后我想更多的是对集群部署有了更多的办法,比如我们在创建java项目的时候,可以想着我们在虚拟机上进行部署的时候我们需要先做哪些工作。我想这也是docker最大的贡献吧,可以在不同的环境下进行程序的部署以及微服务集群的部署,总之很强大的一个功能吧。