docker官方文档:https://docs.docker.com
第一章 docker环境准备和安装
1.镜像下载:http://mirrors.163.com/centos/7.9.2009/isos/x86_64/
2.CentOS7.x系统Minimal安装(略)
3.进入系统安装软件,配置国内阿里yum源:https://yq.aliyun.com/articles/525282?spm=5176.10695662.1996646101.searchclickresult.4dab2ffdCAzsGt
yum -y install epel-release 开源的yum源(可装,默认很多包)
yum clean all &&yum repolist
yum -y install conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccamp iproute net-tools telnet wget vim git yum-utils device-mapper-persistent-data lvm2
4.配置网络地址
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
UUID=5a729bbe-61a7-48be-b8cc-8d4586f64cdb
DEVICE=ens33ONBOOT=yes
IPADDR=172.16.20.xx
NETMASK=255.255.255.0
GATEWAY=172.16.20.2
DNS1=114.114.114.114
5. 安装docker地址:
服务器时区和时间保持国内
同步时间:ntpdate time.windows.com
同步时区: cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hostnamectl set-hostname xxx
####selinux和firewalld关闭
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
systemctl restart docker &&systemctl enable docker
6 配置docker加速器
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload&&systemctl restart docker
7 查看docker版本
docker version
docker info
默认存储位置:/var/lib/docker/overlay2/ => docker inspect image nginx
第二章 为什么学习docker
1. 上线流程繁琐 开发->测试->申请资源->审批->部署->测试等环节
2. 资源利用率低 普遍服务器利用率低,造成过多浪费
3. 扩容/缩容不及时 业务高峰期扩容流程繁琐,上线不及时
4. 服务器环境臃肿 服务器越来越臃肿,对维护、迁移带来困难为什么使用容器?
Docker设计目标:
提供简单的应用程序打包工具 ;开发人员和运维人员职责逻辑分离;多环境保持一致性
Kubernetes设计目标:集中管理所有容器;资源编排;资源调度 ;弹性伸缩;资源隔离
选择docker的优势之处:
环境治理;提高服务器资源利用率;快速搭建新技术环境,不用学习复杂的部署环境;轻量级;虚拟化满足不了一些业务场景;完美构建微服务部署环境;一次构建,多地方部署;快速部署、迁移、回滚,不依赖底层环境;高度保持多个环境一致性
docker与传统虚拟机相比的不足之处:
安全性不如VM;隔离性不如VM;大规模不易管理,K8s应用而生;不易有状态应用部署;排查问题比较难;不支持Windows
Docker 基本使用
镜像是什么?一个分层存储的文件;一个软件的环境;一个镜像可以创建N个容器;一种标准化的交付;一个不包含Linux内核而又精简的Linux操作系统
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/\中。
镜像从哪里来?Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。地址:https://hub.docker.com
配置镜像加速器:https://www.daocloud.io/mirrorcurl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
docker与传统虚拟机的对比
手动创建docker volume
docker volume create www
docker volume ls
docker volume inspect www
[
{
"CreatedAt": "2020-xx-xx T14:19:10+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/www/_data",
"Name": "www",
"Options": {},
"Scope": "local"
}
]
docker run -d -v www:/usr/share/nginx/html nginx
Dockerfile 构建常见基础镜像
镜像用什么隔离
cgroups 资源限制:比如内存、CPU、硬盘、网络
namespace 资源隔离:进程、文件系统、用户等
ufs 联合文件系统:镜像增量式存储,提高磁盘利用率
需要持久化的数据:
1、日志,一般用于方便日志采集和故障排查;2、配置文件,比如nginx配置文件;3、业务数据,比如mysql,网站程序;4、临时缓存数据,比如nginx-proxy-cache
-v 数据卷名称或者源目录:容器目标
bind mounts注意点:
1、宿主机文件或者目录必须存在才能成功挂载 2、宿主机文件或者目录覆盖容器中内容
镜像分类:
1、基础镜像,例如centos(yum)、ubuntu(apt)、alpine(apk);2、环境镜像,例如php、jdk、python;3、项目镜像,打包好的可部署镜像。
第三章:企业级 Harbor 镜像仓库
Harbor是由VMWare公司开源的容器镜像仓库。事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求。官方地址:https://vmware.github.io/harbor/cn/
1、安装docker与docker-compose
chmod +x docker-compose-Linux-x86_64 #单机容器编排工具
mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
2、解压离线包部署
# tar zxvf harbor-offline-installer-v1.9.1.tgz
# cd harbor # vi harbor.yml
hostname: 192.168.31.70
# ./prepare # ./install.sh
3.上传的时候可能会报错 需要添加
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
"insecure-registries": ["172.16.20.24"]
}
4. 上传harbor镜像服务器
docker tag nginx:v1 172.16.20.xx/library/nginx:v1
docker login 172.16.20.xx
docker push 172.16.20.xx/library/nginx:v1
第四章 基于 Docker 构建企业 Jenkins CI平台
高效的CI/CD环境可以获得: 及时发现问题;大幅度减少故障率;加快迭代速度; 减少时间成本
安装gitlab
docker run -d \
--name gitlab \
-p 8443:443 \
-p 9999:80 \
-p 9998:22 \
-v $PWD/config:/etc/gitlab \
-v $PWD/logs:/var/log/gitlab \
-v $PWD/data:/var/opt/gitlab \
-v /etc/localtime:/etc/localtime \
lizhenliang/gitlab-ce-zh:latest
访问地址:http://172.16.20.24:9999初次会先设置管理员密码 ,然后登陆,默认管理员用户名root,密码就是(Gaogao520)
git init
git add .
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
git commit -m 'test-master'
git remote add origin http://172.16.20.24:9999/root/java-demo.git
git push origin master
安装Jenkins
准备JDK和Maven环境
# tar zxvf jdk-8u45-linux-x64.tar.gz
# mv jdk1.8.0_45 /usr/local/jdk
# tar zxf apache-maven-3.5.0-bin.tar.gz
# mv apache-maven-3.5.0 /usr/local/maven
docker run -d --name jenkins -p 80:8080 -p 50000:50000 -u root \
-v /opt/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/local/maven:/usr/local/maven \
-v /usr/local/jdk:/usr/local/jdk \
-v /etc/localtime:/etc/localtime \
--name jenkins jenkins/jenkins:lts
使用/root/.ssh中私钥访问gitlab
Manage Jenkins->Manage Plugins-> Advanced ->Update Site
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
修改国内源:
cd /opt/jenkins_home/updates
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && \
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
docker restart jenkins #重启jenkins容器生效。
系统管理-->插件管理-->Installed 搜索git/pipeline,点击安装[非常快]。
发布测试
CI流程:
1、拉取代码;2、代码编译(java项目),产出war包;3、打包项目镜像并推送到镜像仓库;4、部署镜像测试
#添加参数化构建
This project is parameterized -> String Parameter
Name:Branch # 变量名,下面脚本中调用
Default Value:master # 默认分支
Description:发布的代码分支 # 描述
Pipeline脚本
#!/usr/bin/env groovydef registry = "172.16.20.24"def project = "dev"def app_name = "java-demo"def image_name = "${registry}/${project}/${app_name}:${Branch}-${BUILD_NUMBER}"def git_address = "http://172.16.20.24:9999/root/java-demo.git"def docker_registry_auth = "a0a1386a-954b-42be-bc86-3fd473da193e"def git_auth = "4bdbdd5f-55a5-4bd8-946a-f618a916f652"pipeline { agent any stages { stage('拉取代码'){ steps { checkout([$class: 'GitSCM', branches: [[name: '${Branch}']], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]]) } } stage('代码编译'){ steps { sh """ pwd ls JAVA_HOME=/usr/local/jdk PATH=$JAVA_HOME/bin:/usr/local/maven/bin:$PATH mvn clean package -Dmaven.test.skip=true """ } } stage('构建镜像'){ steps { withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) { sh """ echo ' FROM ${registry}/library/tomcat:v1 LABEL maitainer lizhenliang RUN rm -rf /usr/local/tomcat/webapps/* ADD target/*.war /usr/local/tomcat/webapps/ROOT.war ' > Dockerfile docker build -t ${image_name} . docker login -u ${username} -p '${password}' ${registry} docker push ${image_name} """ } } } stage('部署到Docker'){ steps { sh """ REPOSITORY=${image_name} docker rm -f tomcat-java-demo |true docker container run -d --name tomcat-java-demo -p 88:8080 ${image_name} """ } } }}
Prometheus+Grafana 监控 Docker
cAdvisor (Container Advisor) :用于收集正在运行的容器资源使用和性能信息。
https://github.com/google/cadvisor
Prometheus(普罗米修斯):容器监控系统。
https://prometheus.io
https://github.com/prometheus
Grafana:是一个开源的度量分析和可视化系统。
https://grafana.com/grafana/download
https://grafana.com/dashboards/193 (监控Docker主机模板)