一.Docker基础概述
1.Docker是什么?
简单的的说Docker就是一种虚拟机的容器引擎,可以由以下四点概括
(1).是一种最广泛的开源容器引擎
(2).一种操作系统级的虚拟化技术
(3).依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)
(4).一个简单的应用程序打包工具
2.Docker的设计目标
(1).提供简单的应用程序打包工具
(2).开发人员和运维人员职责逻辑分离
(3).多环境保持一致性
3.Docker的基本组成
包含五个组成部分:
- Docker Client 客户端
- Docker Daemon 守护进程
- Docker Images 镜像
- Docker Container 容器
- Docker Registry 镜像仓库
Docker服务安装成功后,每个节点伴随着启动两个服务一个docker的客户端,一个docker的守护进程
当我们运行服务时,可以从镜像仓库拉取基础镜像也可以使用dockerfile自主制作镜像,镜像制作完毕,我们可以通过镜像生成容器,容器里面运行着业务
如下图所示:
4.容器和虚拟机的区别
docker的最小单元是容器,是与宿主机完全隔离的虚拟化应用程序,那么他与虚拟机有什么区别呢?如图
简单来说容器与虚拟机的区别可以如下表格概括出来:
5.Docker的应用场景
docker可以在以下场景中应用:
- 应用程序打包和发布
- 应用程序隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供Paas产品(产品即服务)
二.Linux 安装Docker
1.Docker的版本
关于docker的详细官方文档,我们可以在这里查看到https://docs.docker.com/
Docker目前分为社区版(CE)和企业版(EE)两个版本
一般开发常用的社区版就足够了,企业版面向无应用能力的企业收费,提供技术服务的群体,本篇安装也是基于社区版进行安装部署的
2.支持平台
目前docker基本支持Linux各种平台包括:CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu
支持Mac操作系统
支持windows操作系统
3.Centos7.X安装Docker
这里我们直接参考官方文档进行安装
如果做测试,建议找一个干净的操作系统,安装docker的步骤如下:
安装之前最好先关闭防火墙和selinux
- 如果已经安装过docker,可以执行命令卸载:yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
- 安装依赖工具包:yum install -y yum-utils device-mapper-persistent-data lvm2
- docker默认使用的repo源,所以这里我们要为Docker添加软件包源:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装docker-ce 默认安装的是docker-ce最新版本的:yum install -y docker-ce
- 启动docker服务并设置开机自启:systemctl start docker(启动) systemctl enable docker(加入开机自启)
安装完毕启动成功如下即可:
三.Docker镜像管理
1.镜像是什么
- 镜像是一个分层存储的文件
- 一个软件的环境
- 一个镜像同时可以创建N个镜像
- 一种标准化的交付手段
- 一个不包含Linux内核而又精简的Linux操作系统
镜像不是一个单一的文件,而是有多层构成,我们可以通过docker history 《ID/NAME》 查看镜像中的各层内容及大小,每层对应着Dockerfile中的一条指令
Docker镜像默认存储在/var/lib/docker/<storage-driver>/中
这里我们可以使用命令简单创建一个镜像:docker run -it nginx
本地不存在这个镜像时,会默认从镜像仓库下载
如图:我们的镜像就被下载成功:
那么我们的镜像从哪里来呢?
- Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像,地址是:https://hub.docker.com/explore
由于镜像镜像仓库地址属于国外,因此我们这里配置下镜像加速器:
- curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
重启docker即可
2.镜像与容器的联系
如图:镜像与容器的关系
如图,容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中
如果容器删除了,最上面的读写层也就删除了,改动也就丢失了,所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。
若想持久化这些改动,可以通过docker-commit 将容器保存为一个新的镜像
- 一个镜像创建多个容器
- 镜像增量式存储
- 创建的容器里面修改不会影响到镜像
3.管理镜像的常用命令
一般我们常用的管理镜像命令有以下这么多,其他不常用的这里不再一一列出。
可以通过docker images --help查看所有
简单测试:查看镜像历史分层
四.容器管理
1.创建容器的常用选项
我们在创建容器时,最常用的命令如下:
创建一个容器并启动:
2.容器资源限制
一个镜像可以创建很多个容器,我们不可能让一个容器无限制的使用所有空间,因此可以通过命令限制容器的内存和cpu,以使资源能够更好的得到利用
比如以下例子对内存限额:
允许容器最多使用500M内存和100M的Swap,并禁用 OOM Killer:
docker run -d --name nginx03 --memory="500m" --memory-swap=“600m" --oom-kill-disable nginx bash
对CPU限额:
允许容器最多使用一个半的CPU:
docker run -d --name nginx04 --cpus="1.5" nginx bash
允许容器最多使用50%的CPU:
docker run -d --name nginx05 --cpus=".5" nginx bash
3.管理容器常用命令
管理容器常用的命令如下所示:
查看容器详细信息:
进入容器:
删除容器:
五.管理应用程序数据
1.将数据从宿主机挂载到容器中的三种方式
Docker提供三种方式将数据从宿主机挂载到容器中:
- volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes),保存数据的最佳方式
- bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中
- tmpfs:挂载存储到主机系统的内存中,而不会写入主机的文件系统,如果不希望将数据持久化存储在任何位置,可以使用tmpfs.同时避免写入容器可写层提高性能。
2.Volume数据卷
管理卷:
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol
用卷创建一个容器:
docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
这种方法和mount的一样,创建完数据卷和宿主机的默认映射位置在/var/lib/docker/volumes/nginx-vol/_data目录下,不支持修改
清理数据卷:
# docker stop nginx-test
# docker rm nginx-test
# docker volume rm nginx-vol
注意如果事先没有指定卷,则自动创建,建议使用--mount,更通用
3.Bind Mounts
利用此方法创建数据卷,先要创建本地的映射目录:
mkdir -p /root/wwwroot
docker run -d -it --name=nginx-test --mount type=bind,src=/root/wwwroot,dst=/usr/share/nginx/html nginx
查看映射目录:docker inspect nginx-test
清除:
注意:如果源文件/目录没有存在如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏;映射目录需要提前创建,不会自动创建,会抛出一个错误
4.小结
Volume特点:
- 多个运行容器之间共享数据,多个容器可以同时挂载相同的卷。
- 当容器停止或被移除时,该卷依然存在。
- 当明确删除卷时,卷才会被删除。
- 将容器的数据存储在远程主机或其他存储上(间接)
- 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
Bind Mounts 特点:
- 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析
- 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机 上构建Maven项目时,容器都可以访问构建的项目包。
- 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时
六.容器网络
1.网络模式
docker的网络模式可以分为5种:
bridge: --net=bridge
默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
宿主机会产生一个docker0网桥
host: --net=host 容器不会获得一个独立的network namespace,而是与宿主机共用一个,这就意味着容器不会有自己的网卡信息,而是使用宿主机的,容器除了网络,其他都是隔离的
docker run -itd --net=host busybox
none:--net=none 获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置
docker run -it --net=none busybox
container:--net=container:Name/ID 与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的
自定义网络:与默认的bridge原理一样,但自定义的网络具备内部DNS发现,可以通过容器名容器之间网络通信。
创建自定义网络:docker network create test 查看:docker network ls
创建容器并加入自定义网络中:
docker run -it --name c3 --net=test busybox
docker run -it --name c4 --net=test busybox
之后容器内就可以相互ping通主机名:
2.容器网络访问原理
七.Dockerfile实践
1.Dockerfile格式
Dockerfile文件是分步执行,从上到下依次执行,每执行一条指令将会产生一层镜像,因此命令中最好使用&&拼接起来,并及时清理yum clean和没有的安装包
语法格式如下:
2.Dockerfile指令
Dockerfile指令:常用的如下表格:
3.Build镜像
build 语法格式:
可以通过docker build --help查看
Usage: docker build [OPTIONS] PATH | URL | - [flags]
Options:
-t, --tag list # 镜像名称
-f, --file string # 指定Dockerfile文件位置
# docker build -t shykes/myapp .
# docker build -t shykes/myapp -f /path/Dockerfile /path
# docker build -t shykes/myapp http://www.example.com/Dockerfile
4.构建Nginx,PHP,Tomcat基础镜像
(1).构建Ngin镜像:
nginx的镜像dockerfile
1 FROM centos:7 2 label maintainer www.ctnrs.com 3 RUN yum install -y gcc gcc-c++ make 4 openssl-devel pcre-devel gd-devel 5 iproute net-tools telnet wget curl && 6 yum clean all && 7 rm -rf /var/cache/yum/* 8 RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && 9 tar zxf nginx-1.15.5.tar.gz && 10 cd nginx-1.15.5 && 11 ./configure --prefix=/usr/local/nginx 12 --with-http_ssl_module 13 --with-http_stub_status_module && 14 make -j 4 && make install && 15 rm -rf /usr/local/nginx/html/* && 16 echo "ok" >> /usr/local/nginx/html/status.html && 17 cd / && rm -rf nginx-1.15.5* && 18 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 19 20 ENV PATH $PATH:/usr/local/nginx/sbin 21 COPY nginx.conf /usr/local/nginx/conf/nginx.conf 22 WORKDIR /usr/local/nginx 23 EXPOSE 80 24 CMD ["nginx", "-g", "daemon off;"]
构建命令:docker build -t nginx:v1 -f Dockerfile-nginx .
(2).构建php镜像:
php镜像dockerfile
FROM centos:7 MAINTAINER www.ctnrs.com RUN yum install epel-release -y && yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel libmcrypt-devel libxslt-devel libtidy-devel autoconf iproute net-tools telnet wget curl && yum clean all && rm -rf /var/cache/yum/* RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && tar zxf php-5.6.36.tar.gz && cd php-5.6.36 && ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --enable-opcache --with-mysql --with-mysqli --with-pdo-mysql --with-openssl --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-mbstring --with-mcrypt --enable-hash && make -j 4 && make install && cp php.ini-production /usr/local/php/etc/php.ini && cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && sed -i "90a daemonize = no" /usr/local/php/etc/php-fpm.conf && mkdir /usr/local/php/log && cd / && rm -rf php* && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/php/sbin COPY php.ini /usr/local/php/etc/ COPY php-fpm.conf /usr/local/php/etc/ WORKDIR /usr/local/php EXPOSE 9000 CMD ["php-fpm"]
构建命令:docker build -t php:v1 -f Dockerfile-php .
(3).构建tomcat镜像
1 FROM centos:7 2 MAINTAINER www.ctnrs.com 3 4 ENV VERSION=8.5.43 5 6 RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && 7 yum clean all && 8 rm -rf /var/cache/yum/* 9 10 RUN wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && 11 tar zxf apache-tomcat-${VERSION}.tar.gz && 12 mv apache-tomcat-${VERSION} /usr/local/tomcat && 13 rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && 14 mkdir /usr/local/tomcat/webapps/test && 15 echo "ok" > /usr/local/tomcat/webapps/test/status.html && 16 sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && 17 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 18 19 ENV PATH $PATH:/usr/local/tomcat/bin 20 21 WORKDIR /usr/local/tomcat 22 23 EXPOSE 8080 24 CMD ["catalina.sh", "run"]
构建命令:docker build -t tomcat:v1 -f Dockerfile-tomcat .
5.快速搭建LNMP网络平台
自定义网络:docker network create lnmp
创建Mysql容器:docker run -d --name lnmp_mysql --net lnmp --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8
创建PHP容器:docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v1
创建Nginx容器:docker run -d --name lnmp_nginx --net lnmp -p 88:80 --mount src=wwwroot,dst=/wwwroot nginx:v1
之后进入挂载目录:
将wordpress安装包放置下面即可访问站点:http://IP:88
八.企业级镜像仓库Harbor的使用
1.Harbor概述
Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的 企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访 问控制 ,AD/LDAP集成以及审计日志等,足以满足基本企业需求。
官方地址:https://vmware.github.io/harbor/cn/
Harbor的组件:
2.Harbor部署
Harbor安装有3种方式:
• 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小
• 离线安装:安装包包含部署的相关镜像,因此安装包比较大
• OVA安装程序:当用户具有vCenter环境时,使用此安装程序,在部署OVA后启动Harbor
下载安装包:tar zxvf harbor-offline-installer-v1.6.1.tgz
下载docker-composew二进制文件放置/usr/bin下
安装docker服务并启动即可
# tar zxvf harbor-offline-installer-v1.6.1.tgz
# cd harbor
# vi harbor.cfg hostname = 10.206.240.188 ui_url_protocol = http harbor_admin_password = 123456
# ./prepare
# ./install.sh
之后通过admin 123456访问即可:
3.基本使用
配置http镜像仓库可信任:
vi /etc/docker/daemon.json
给要上传的标签打标签:
docker tag tomcat:v1 192.168.1.242/library/tomcat:v1
上传:docker push 192.168.1.242/library/tomcat:v1
这里提示权限失败,先要登录:docker login 192.168.1.242 输入账户名密码登录成功即可
再次推送成功:
从镜像仓库下载镜像:
docker pull 192.168.1.242/library/tomcat:v1
九.基于Docker构建企业Jenkins CI平台
1.什么是CI/CD
持续集成(Continuous Integration,CI):代码合并、构建、部署、测试都在一起,不断地执行这个过程,并对结果反馈。
持续部署(Continuous Deployment,CD):部署到测试环境、预生产环境、生产环境。
持续交付(Continuous Delivery,CD):将最终产品发布到生产环境,给用户使用。
高效的CI/CD环境可以获得:
- 及时发现问题
- 大幅度减少故障率
- 加快迭代速度
- 较少时间成本
2.CI流程
开发上传代码至git服务器,触发jenkins,进行代码编译构建镜像并推送至远程服务器启动docker镜像完成CI这部分流程
3.部署Git代码版本仓库
在harbor服务器上安装git服务:yum install -y git
创建git用户和密码,并切换至git账户建立demo.git文件夹,执行初始化:git --bare init
4.上传java项目代码
模拟开发在docker服务器安装安装git服务端,之后clone java代码实例:
git clone https://github.com/lizhenliang/tomcat-java-demo
5.部署Harbor镜像仓库
见上述操作
6.配置JDK和Maven环境
将安装包上传配置环境环境变量即可
7.安装Jenkins
将jenkins,war放置tomcat的webapps/ROOT下直接启动tomcat,访问8080端口即可:
安装插件git和pipeline即可完成配置
8.安装Docker
各个机器安装Docker服务即可
9.构建Tomcat基础镜像
jenkins创建项目:
简单pipeline:
结果:
10.流水线发布测试
提交java代码:
先拷贝至本地目录:
提交代码:
编写pipeline:
1 node { 2 // 拉取代码 3 stage('Git Checkout') { 4 checkout([$class: 'GitSCM', branches: [[name: '$branch']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '8db1da0a-bcf7-43c5-b98d-a711d6119933', url: 'git@192.168.1.242:/home/git/demo.git']]]) // 代码编译 5 } 6 stage('Maven Build') { 7 sh ''' 8 export JAVA_HOME=/usr/local/jdk 9 /usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true 10 ''' 11 } 12 // 项目打包到镜像并推送到镜像仓库 13 stage('Build and Push Image') { 14 sh ''' 15 REPOSITORY=192.168.1.242/library/tomcat-java-demo:${branch} 16 cat > Dockerfile << EOF 17 FROM 192.168.1.242/library/tomcat:v1 18 MAINTAINER www.ctnrs.com 19 RUN rm -rf /usr/local/tomcat/webapps/* 20 ADD target/*.war /usr/local/tomcat/webapps/ROOT.war 21 EOF 22 docker build -t $REPOSITORY . 23 docker login 192.168.1.242 -u admin -p 123456 24 docker push $REPOSITORY 25 ''' 26 } 27 // 部署到Docker主机 28 stage('Deploy to Docker') { 29 sh ''' 30 REPOSITORY=192.168.1.241/library/tomcat-java-demo:${branch} 31 docker rm -f tomcat-java-demo |true 32 docker pull $REPOSITORY 33 docker container run -d --name tomcat-java-demo -p 88:8080 $REPOSITORY 34 ''' 35 } 36 }
配置git通信:
构建完成:
访问: