微服务之Docker
一.Docker简介
1.Docker是什么
1.1 Docker的出现
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。这家公司主要提供基于PaaS的云计算技术服务。就是和LXC(Linux container)有关的容器技术。后来改名为——Docker
-
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验
-
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
-
Docker是开发人员和系统管理员 使用容器开发,部署和运行应用程序的平台。使用Linux容器部署应用程序称为容器化。容器不是新的,但它们用于轻松部署应用程序。
容器化越来越受欢迎,因为容器是:
-
灵活:即使是最复杂的应用也可以集装箱化。
-
轻量级:容器利用并共享主机内核。
-
可互换:您可以即时部署更新和升级。
-
便携式:您可以在本地构建,部署到云,并在任何地方运行。
-
可扩展:您可以增加并自动分发容器副本。
-
可堆叠:您可以垂直和即时堆叠服务。
1.2 Docker的理念
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
1.3 Docker总结
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
2.Docker作用
2.1 虚拟机时代
虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
虚拟机的缺点:
①.资源占用多
②.冗余步骤多
③.启动慢
2.2 容器新时代
由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
比较了 Docker 和传统虚拟化方式的不同之处:
-
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
-
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
-
每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序对主机资源进行虚拟访问。通常,VM提供的环境比大多数应用程序需要的资源更多。
-
infrastructure:基础设施
-
Host OS:物理机(主机操作系统)
-
Guest OS:虚拟机
-
Hyprervisor:虚拟机监视器
-
Bins/Libs:从服务器中独立划出去的资源
-
App:应用
对比传统虚拟机总结
特性 | Docker容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
2.3 开发/运维一体化(DevOps)
目的:一次构建、随处运行
-
更快速的应用交付和部署
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
-
更轻松的迁移和扩展
随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
-
更简单的系统运维
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
-
更高效的计算资源利用
Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
3.下载地址
官网:
-
docker官网:http://www.docker.com
仓库:
-
Docker Hub官网: https://hub.docker.com/
二.Docker安装部署
-
目前,CentOS 仅发行版本中的内核支持 Docker。
-
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
-
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
-
查看自己的内核
-
uname -a命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。
uname -a , --all | 展示所有,如上图所示 | |
---|---|---|
-s, --kernel-name | 输出内核名称 | Linux |
-n, --nodename | 输出网络节点上的主机名 | bigdata11 |
-r, --kernel-release | 输出内核发行号 | 3.10.0-862.11.6.el7.x86_64 |
-v, --kernel-version | 输出内核版本 | #1 SMP Tue Aug 14 21:49:04 UTC 2018 |
-m, --machine | 输出主机的硬件架构名称 | x86_64 |
-o, --operating-system | 输出操作系统名称 | GNU/Linux |
Docker架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
Docker三大核心组件
镜像(image)
-
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
容器(container)
-
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
-
它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
-
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
-
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库(repository)
-
仓库(Repository)是集中存放镜像文件的场所。
-
仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
-
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
-
最大的公开仓库是 Docker Hub(https://hub.docker.com/),类似Git Hub
-
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云 等
Docker安装步骤
官方网站:https://docs.docker.com/install/linux/docker-ce/centos/
(1)确认Centos7版本
cat /etc/redhat-release
显示:CentOS Linux release 7.5.1804 (Core)
(2)安装配置环境
yum -y install gcc gcc-c++
前提:虚拟机能联网
(3)安装Docker
#注:安装前可以其他版本Docker yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine #安装新Docker依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2
(4)设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(5)更新yum软件包索引
yum makecache fast
(6)安装最新版本的Docker CE和containerd
yum -y install docker-ce docker-ce-cli containerd.io
#主机上的图像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷:
#注:如果卸载Docker yum remove docker-ce rm -rf /var/lib/docker
(7)启动Docker
systemctl start docker
配置阿里镜像加速器
-
登录:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
-
点击左下角“镜像加速器”
-
在Linux中如图操作
三. Docker案例实战
常用命令
常用命令 | 描述 |
---|---|
docker pull 镜像名:版本号 | 拉取对应的软件及版本 |
docker images | 查询有多少镜像 |
docker ps | 查询正在运行的容器 |
docker run -d -it -p 81:80 nginx | 后台运行nginx,并对外暴露端口为81 |
docker exec -it 容器ID /bin/bash | 进入某个容器[前提启动容器],-it 交互式 |
docker exec -it 容器ID ls -l | 不进入容器,直接使用命令[不会启动容器] |
docker start|stop|restart 容器ID | / |
docker build -f 文件 -t 镜像名:版本号 . | 通过dockerfile文件构建一个新的镜像 |
docker commit -a "" -m "" 容器ID 镜像 | 创建镜像, -a 作者 -m 具体信息 |
docker tag 镜像ID mysql:5.6 | 修改某镜像的版本号 |
docker save -o mysql-5.6.tar mysql:5.6 | 把某个镜像存出/储到本地 |
docker export 容器ID > nginx.tar | 导出容器镜像到本地 |
docker load < mysql-5.6.tar | 加载某个本地镜像, < 也可以用--input |
docker import *.tar/URL | 导入一个本地容器快照,或者一个URL地址 |
docker rmi/rm 镜像/容器 | 删除镜像/容器 |
docker logs 容器ID | 查看日志 |
docker rmi $(docker images -q) | 删除所有镜像; $()可以用``代替 |
docker rm $(docker ps -aq) | 删除所有镜像; $()可以用``代替 |
注:用户既可以使用 docker load
来导入镜像存储文件到本地镜像库,也可以使用 docker import
来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
helloworld实例
前提:启动Docker,systemctl start docker
docker run hello-world
Tomcat实例
docker run -it -p 8888:8080 tomcat
下载拉取tomcat,并对外暴露端口为8080
验证:bigdata11:8080 可以访问到Tomcat的主页
docker exec -it 42a8dbd329df /bin/bash #删除tomcat的webapps #更改webapps.dist 为 webapps #进入可视化web页面 #提交docker docker commit -a="Andy" -m="tomcat" 01c8d75a4dda itstar/tomcat:8.5 #查看已有的镜像,就可以看到itstar/tomcat docker images #运行这个你会发现这个没有docs,而原来的有 docker run -it -p 8080:8080 itstar/tomcat:8.5
Nginx实例
#拉取nginx的Docker镜像 docker pull nginx #运行nginx,并对外暴露端口为81(默认为80) docker run -it -p 81:80 docker.io/nginx #打开页面访问 主机名:81,显示如下
扩展Dockerfile
#创建dokcer文件并进入docker文件 mkdir /opt/docker cd /opt/docker vi Dockerfile #编写最简单的Dockerfile (后边会讲到) #依赖于nginx FROM nginx #更改页面中的大字报 RUN echo '<h1>Hello, My name is Docker,I am A Dockerfile!</h1>' > /usr/share/nginx/html/index.html #构建Dockerfile(注意数据的层卷变化) docker build -t andy1/nginx . #运行刚刚已构建好的dockerfile docker run -it -p 82:80 andy1/nginx #打开页面访问 主机名:82,显示如下
四. 容器数据卷
简述
卷就是目录或文件,存在于一个或多个容器中,由 docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System提供一些用于持续存储或共享数据的特性
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker不会在容器删除时删除其挂载的数据卷
特点
-
数据卷可在容器之间共享或重用数据
-
卷中的更改可以直接生效
-
数据卷中的更改不会包含在镜像的更新中
-
数据卷的生命周期一直持续到没有容器使用它为止
有点类似Redis中的RDB和AOF文件,主要作用用于数据的持久化操作,容器间继承和共享数据
数据同步
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 #下载执行nginx [任意拉取一个可进入镜像即可],完成后悬停 [root@bigdata111 /]# docker run -it -v /a:/b nginx 注1:会自动在linux的目录下创建/a目录,在nginx的镜像中创建/b目录 注2:如果出现创建不成功的情况,可以设置--privileged-true #进入镜像查看 b25dcdb463ed 为 CONTAINER ID [root@bigdata111 ~]# docker exec -it b25dcdb463ed /bin/bash #能看到有目录b root@b25dcdb463ed:/# ls -l drwxr-xr-x 2 root root 6 Jul 11 09:30 b #在镜像中的b目录中任意创建一个文件并写入内容 root@b25dcdb463ed:/b# echo "11" >> a.txt #在linux中的a目录中查看该文件,发现该文件中有内容,且不管在linux中更新还是镜像中更新。都会更新该文件。所以,我们可以理解为/a:/b为共享文件夹
容器停止
结论:容器停止后,数据依然会同步
#linux中创建新文件 [root@bigdata111 a]# touch aaa [root@bigdata111 a]# ll total 8 -rw-r--r-- 1 root root 0 Jul 11 20:29 aaa -rw-r--r-- 1 root root 3 Jul 11 18:36 abc.txt -rw-r--r-- 1 root root 6 Jul 11 18:54 a.txt #查询容器是否运行 [root@bigdata111 a]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES #查询之前运行的容器 [root@bigdata111 a]# docker ps -l CONTAINER ID IMAGE COMMAND .. b25dcdb463ed nginx "/docker-entrypoint.…" .. #根据查询的容器来启动容器 [root@bigdata111 a]# docker start b25dcdb463ed b25dcdb463ed #进入容器,发现数据已经同步过来 [root@bigdata111 a]# docker exec -it b25dcdb463ed /bin/bash root@b25dcdb463ed:/# cd /b root@b25dcdb463ed:/b# ls -l total 8 -rw-r--r-- 1 root root 6 Jul 11 10:54 a.txt -rw-r--r-- 1 root root 0 Jul 11 12:29 aaa -rw-r--r-- 1 root root 3 Jul 11 10:36 abc.txt #注:修改文件内容,数据同样也会同步
关联只读容器
#在一个连接客户端创建关联数据卷 ro: readonly [root@bigdata111 a]# docker run -it -v /c:/d:ro nginx #进入linux的 c目录,并创建文件 [root@bigdata111 c]# touch c.txt #查询容器ID [root@bigdata111 c]# docker ps CONTAINER ID IMAGE COMMAND ... 14939c05ef25 nginx "/docker-entrypoint.…" ... #进入容器中的d目录 [root@bigdata111 /]# docker exec -it 14939c05ef25 /bin/bash root@14939c05ef25:/# cd /d #发现文件已同步 root@14939c05ef25:/d# ls -l total 0 -rw-r--r-- 1 root root 0 Jul 11 12:43 c.txt #但在d目录中创建文件或者写入数据都会【失败】 root@14939c05ef25:/d# touch ccc touch: cannot touch 'ccc': Read-only file system root@14939c05ef25:/d# echo "77" >> c.txt bash: c.txt: Read-only file system
查询数据关系
#b25dcdb463ed 为 CONTAINER ID [root@bigdata111 a]# docker inspect b25dcdb463ed "HostConfig": { "Binds": [ "/a:/b" ]
docker 继承关系
#启动一个数据关联卷 [root@bigdata111 /]# docker run -it -p 81:80 -v /a:/b nginx #查询正在启动中的容器 [root@bigdata111 d]# docker ps CONTAINER ID IMAGE .. PORTS NAMES 5a1a3716ad9d nginx .. 0.0.0.0:81->80/tcp friendly_swirles #继承数据容器卷,并命名为nginx2 [root@bigdata111 d]# docker run -it --name nginx2 --volumes-from friendly_swirles nginx #继承模板 docker run -it --name 子类名 --volumes-from 父类名
五、Dockerfile
简介
从应用软件的角度来看, Dockerfile、 Docker镜像与 Docker容器分别代表软件的三个不同阶段,
-
Dockerfile是软件的原材料
-
Docker镜像是软件的交付品
-
Docker容器则可以认为是软件的运行态。
Dockerfile面向开发, Docker镜像成为交付标准, Docker容器则涉及部署与运维,三者缺一不可,合力充当 Docker体系的基石
Dockerfile体系结构
指令 | 解释 |
---|---|
FROM | 基础镜像,当前新镜像是基于哪个镜像的 |
MAINTAINER | 镜像维护者的姓名和邮箱地址 |
RUN | 容器构建时需要运行的命令 |
EXPOSE | 当前容器对外暴露出的端口 |
WORKDIR | 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点 |
ENV | 用来在构建镜像过程中设置环境变量 |
ADD | 将宿主机目求下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 |
copy | 类似ADD,拷贝文件和日录到镜像中 将从构建上下文目录中<源路径>的文件/录复制到新的一层的镜像内的<目标路径>位置 |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定一个容器启动时要运行的命令,Docker.Dockerfile中可以有多个CMD命令,但只有一个最后生效,CMD会被Docker run之后的参数替换 |
ENTRYPOINT | 指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数 |
ONBULD | 当构建一个被继承的 Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发 |
Dockerfile案例
构建Centos
#创建docker文件 touch myCentos FROM centos MAINTAINER yqzdy1207@163.com ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools lrzsz EXPOSE 88 CMD $$MYPATH CMD echo "second 2 CMD" CMD /bin/bash #docker build -f linux文件地址 -t 镜像名:tag版本 [root@bigdata111 docker]# docker build -f /opt/module/datas/docker/myCentos -t mycentos:7.0 . Sending build context to Docker daemon 2.048kB Step 1/10 : FROM centos ---> 831691599b88 Step 2/10 : MAINTAINER yqzdy1207@163.com ---> Using cache ---> db96aff0c2a1 Step 3/10 : ENV MYPATH /usr/local ---> Using cache ---> 4127d7a2ee2d Step 4/10 : WORKDIR $MYPATH ---> Using cache ---> 4c02a38599ee Step 5/10 : RUN yum -y install vim ---> Using cache ---> cd732f3d817a Step 6/10 : RUN yum -y install net-tools lrzsz ---> Using cache ---> 0108e354dc86 Step 7/10 : EXPOSE 88 ---> Using cache ---> 786c201f05fa Step 8/10 : CMD $$MYPATH ---> Using cache ---> 08f62301f673 Step 9/10 : CMD echo "second 2 CMD" ---> Using cache ---> 246cf1b40c47 Step 10/10 : CMD /bin/bash ---> Using cache ---> 55bed6117cd7 #注:改镜像ID和下面IMAGE ID一致 Successfully built 55bed6117cd7 Successfully tagged mycentos:7.0 [root@bigdata111 docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 7.0 55bed6117cd7 11 minutes ago 295MB #运行该镜像 [root@bigdata111 docker]# docker run -it mycentos:7.0 #默认启动的目录已发生了改变 [root@8dea5df14c9f local]# pwd /usr/local #查询镜像信息 [root@bigdata111 docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 7.0 55bed6117cd7 19 minutes ago 295MB nginx latest 0901fa9da894 35 hours ago 132MB tomcat 8.5 34d28186c789 5 days ago 529MB centos latest 831691599b88 3 weeks ago 215MB #查询该镜像的构成信息 [root@bigdata111 docker]# docker history 55bed6117cd7 IMAGE CREATED CREATED BY SIZE COMMENT 55bed6117cd7 19 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B 246cf1b40c47 19 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 08f62301f673 19 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "$$MY… 0B 786c201f05fa 19 minutes ago /bin/sh -c #(nop) EXPOSE 88 0B 0108e354dc86 19 minutes ago /bin/sh -c yum -y install net-tools lrzsz 23MB cd732f3d817a 20 minutes ago /bin/sh -c yum -y install vim 57.2MB 4c02a38599ee 21 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B 4127d7a2ee2d 21 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B db96aff0c2a1 21 minutes ago /bin/sh -c #(nop) MAINTAINER yqzdy1207@163.… 0B 831691599b88 3 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 3 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:84700c11fcc969ac0… 215MB
#点击docker CMD链接观看Tomcat的dockerfile #查看最后一行,及执行该dockerfile会运行tomcat CMD ["catalina.sh" "run"] #以拉取tomcat为例,只显示ls -l 的目录,不会启动tomcat docker run -it tomcat ls -l ls -l 相当于 CMD ["ls -l"],从而覆盖掉CMD ["catalina.sh" "run"],所以当使用docker ps时,tomcat不会启动
CMD和ENTRYPOINT
#查看带-i和不带的区别 -i : include 包含信息头 -s : 静默模式 curl -s -i www.baidu.com curl -s www.baidu.com #创建cmd docker文件 touch cmd FROM centos RUN yum -y install curl CMD [ "curl","-s","www.baidu.com"] #创建entrypoint docker文件 touch entrypoint FROM centos RUN yum -y install curl ENTRYPOINT [ "curl","-s","www.baidu.com"] #构建由cmd结尾的镜像文件 [root@bigdata111 docker]# docker build -f ./cmd -t cmd:1 . #运行,发现打印出来没header的访问信息 [root@bigdata111 docker]# docker run cmd:1 #报错因为,-i这个命令无法单独执行 [root@bigdata111 docker]# docker run cmd:1 -i #构建由entrypoint结尾的镜像文件 [root@bigdata111 docker]# docker build -f ./entrypoint -t entrypoint:1 . #发现header的访问信息 [root@bigdata111 docker]# docker run entrypoint:1 -i #总结:CMD和ENTRYPOINT的区别在于在后续添加新的参数时,CMD是覆盖上一个CMD命令,而ENTRYPOINT是组合/包含
ONBUILD触发器
# father 的 dockerfile FROM centos RUN yum -y install curl ENTRYPOINT [ "curl","-s","www.baidu.com"] ONBUILD RUN echo "I am Father" #son 的 dockerfile FROM father:1 RUN yum -y install curl ENTRYPOINT [ "curl","-s","www.baidu.com"] [root@bigdata111 docker]# docker build -f ./father -t father:1 . [root@bigdata111 docker]# docker build -f ./son -t son:1 . # 发现日志中有这一行,会执行触发器 # Executing 1 build trigger
综合案例
#创建tomcat目录 mkdir /opt/module/datas/docker/tomcat #上传apache-tomcat-9.0.12.tar.gz和jdk-8u144-linux-x64.tar.gz至tomcat目录 #创建文件 touch c.txt dockerfile #准备完毕后,tomcat目录中有如下四个文件 apache-tomcat-9.0.12.tar.gz jdk-8u144-linux-x64.tar.gz c.txt dockerfile #编写dockerfile,如下 #构建镜像 [root@bigdata111 tomcat]# docker build -f ./dockerfile -t selftomcat9 . #运行 docker run -d -p 9080:8080 --name mytomcat9 \ -v /opt/module/datas/docker/tomcat/test:/usr/local/apache-tomcat-9.0.12/test \ -v /opt/module/datas/docker/tomcat/logs:/usr/local/apache-tomcat-9.0.12/logs \ --privileged=true \ selftomcat9
dockerfile内容
FROM centos MAINTAINER yqzdy1207@163.com COPY c.txt /usr/local/cincontainer.txt ADD jdk-8u144-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.12.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local/ WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_144 ENV PATH $PATH:$JAVA_HOME/bin ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.12 ENV PATH $PATH:$CATALINA_HOME/bin EXPOSE 8080 #启动运行tomcat #ENTRYPOINT ["/usr/local/apache-tomcat-9.0.12/bin/startup.sh"] #CMD ["/usr/local/apache-tomcat-9.0.12/bin/startup.sh","run"] CMD /usr/local/apache-tomcat-9.0.12/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.12/logs/catalina.out
docker 安装mysql
#拉取镜像 [root@bigdata111 tomcat]# docker pull mysql:5.6 #创建mysql目录 mkdir /opt/module/datas/docker/mysql #运行docker docker run -p 1234:3306 --name mysql5.6 \ -v /opt/module/datas/docker/mysql/conf:/etc/mysql/conf.d \ -v /opt/module/datas/docker/mysql/logs:/logs \ -v /opt/module/datas/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=000000 \ -d mysql:5.6 #1.进入docker 登录mysql #2.可以用navicat登录 #把库中所有的数据格式全部输出到linux的文件中 docker exec c3f5e028dd05 \ sh -c 'exec mysqldump \ --all-databases \ -uroot \ -p"000000"' \ > /opt/module/datas/docker/mysql/all-databases.sql
docker安装redis
docker pull redis:5.0.9 #运行docker docker run -p 6379:6379 --name redis6379 \ -v /opt/module/datas/docker/redis/conf/redis.conf:/usr/local/redis/redis.conf \ -v /opt/module/datas/docker/redis/data:/data \ -d redis:5.0.9 redis-server /usr/local/redis/redis.conf \ --appendonly yes #进入docker redis
上传到阿里云
地址:https://cr.console.aliyun.com/cn-beijing/instances/repositories
#提交镜像 docker commit -a andy -m "mysql5.6" 容器ID mysql5