docker
在单体应用流行的年代,docker还无法想现在这么流行。一个应用就是一个jar包,找两台服务器用nginx做个负载就可以搞定。
但随着大数据行业在国内的发展,单体应用在一定程度上无法支撑互联网的发展;
所以微服务架构出现,在是在一定程度上将业务系统进行模块拆分,最大限度的去利用服务器资源,增加应用的高性能。
同时也导致了我们一个程序需要几十甚至几百上千的不同jar来进行部署,如果用传统的方式来进行部署,工作量非常大,还很容易出错,这时虚拟化技术就可以很好的来解决这个问题,docker只虚拟化技术中最主流的方式之一。
Docker 主要解决环境配置问题,对进程进行隔离
优点:
1.部署方便,安全
2.隔离性好
3.快速回滚
4.成本低 (他能让服务器的性能配置得到充分的利用)
缺点:
性能上和原生有细微的差别;针对部署的内容和需求有不同的选择;
(比如数据一套mysql数据,如果该数据库只是用来开发一些小型应用,为了方便开发和部署,可以用docker直接进行。但是如果你的mysql要存储大量的数据,我们要的就是性能,这时就不建议用docker部署mysql)
docker三剑客
docker只是一个容器引擎
一、docker-machine
docker-machine是解决docker运行环境问题。
你可以把它理解为virtualbox或者vmware,hyper-v.目前基本弃用
二、dcoker-compose
dcoker-compose主要是解决单机docker容器编排问题。
一般是通过yaml配置文件来使用它,这个yaml文件里能记录多个容器启动的配置信息(镜像、启动命令、端口映射等),最后只需要执行docker-compose对应的命令就会像执行脚本一样地批量创建和销毁容器。
三、docker-swarm
docker-swarm是解决多主机多个容器调度部署得问题。
swarm是基于docker平台实现的集群技术,他可以通过几条简单的指令快速的创建一个docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。
swarm技术相当不成熟,很多配置功能都无法实现,只能说是个半成品,目前更多的是使用Kubernetes来管理集群和调度容器。
1.k8s
当前开源的,最主流的用于管理云平台中多个主机上的容器化的平台,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),k8s提供了应用部署,规划,更新,维护的一种机制。
Kubernetes它本身的角色定位是和Docker Swarm 是一样的。目前最流行的集群容器管理和调度平台
ps:k8s不止是可以用docker来作为容器引擎,docker只是最主流的容器引擎之一,如:rkt、OpenShift等
docker常用命令
在centos7下安装
在线安装
# 卸载旧版本
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
# 设置 yum repository
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装并启动 docker
yum install -y docker-ce-18.09.7 docker-ce-cli-18.09.7 containerd.io
systemctl enable docker
systemctl start docker
离线安装
# 下载地址 https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
rpm -ivh containerd.io-1.2.13-3.2.el7.x86_64.rpm docker-ce-19.03.7-3.el7.x86_64.rpm container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm docker-ce-cli-19.03.7-3.el7.x86_64.rpm --force --nodeps
设置docker数据存储位置
# docker 下载镜像默认是官方,速度较慢,所以我们会换镜像源(如阿里,网易等)
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
#重启
systemctl reload-daemon && systemctl restart docker
# 默认情况下存储在/var/lib/docker目录,如果他是系统盘,那么很容易磁盘爆满,所以一般情况下,我们会对存储地址进行映射到数据盘
# 查看当前docker运行的工作目录
docker info |grep "Docker Root Dir"
# 新建或者编辑 /etc/docker/daemon.json
{
"data-root": "/mnt/docker"
}
# 或者
systemctl stop docker
rm -rf /var/lib/docker
ln -s /mnt/dockers/ /var/lib/docker
systemctl start docker
构建属于自己的docker镜像
下面我以打包一个springboot项目为镜像为例
创建一个名为Dockerfile文件(注意大小写,也没有文件后缀名),内容如下:
# 基于某个基础镜像进行创建
FROM openjdk:8u191-jre-alpine3.9
# 镜像参数
ARG JAR_FILE
# 设置环境变量
ENV PROFILE default
ADD ${JAR_FILE} /opt/app.jar
# 暴露的端口
EXPOSE 8080
# entrypoint和cmd的区别
# cmd给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。重点就是这个“默认”。意味着,如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用cmd指定的默认的执行命令执行。同时也从侧面说明了entrypoint的含义,它才是真正的容器启动以后要执行命令
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8 -Dspring.profiles.active=${PROFILE} -jar /opt/app.jar
我们也可以直接看看常用的镜像构建文件
这个docker 社区构建的一个redis的Dockerfile
https://hub.docker.com/layers/redis/library/redis/4.0.14-alpine3.11/images/sha256-3e99741f293147ff406657dda7644c2b88564b80a498cd00da8f905743449c9f?context=explore
https://github.com/silsuer/yapi-docker/blob/master/Dockerfile
docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
docker容器硬件资源占用查看
sudo docker stats
容器拷贝文件到宿主机
sudo docker cp mysql:/var/log/mysql/error.log /mnt/project/docker-compose/docker-env-zs/nacos/mysql/log
宿主机拷贝文件到容器
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js
yapi
是一个前后分离开发的便捷工具,也是一个接口管理工具,
运用docker 搭建一个 yapi接口管理平台
源码安装
> Yapi项目地址: https://github.com/YMFE/yapi
> https://github.com/silsuer/yapi-docker/blob/master/Dockerfile
# 下载镜像
docker pull silsuer/yapi
# 用容器运行一个应用
docker run -dit -p 27017:27017 -p 9090:9090 -p 3000:3000 silsuer/yapi
# 找到容器
docker ps| grep 'silsuer/yapi'
# 进入容器
docker attach container-id
启动mongodb
sudo service mongodb start
启动yapi安装程序
yapi server
根据提示在浏览器中输入ip:9090进行安装,管理员账号默认账号名:"admin@admin.com",密码:"ymfe.org"
回到终端,执行nohup node /my-yapi/vendors/server/app.js 2>&1 & 在后台运行yapi
cd /my-app
执行ctrl+p+ctrl+q 退出容器即可