传统的产品的开发和发布过程中,开发人员在本机测试通过的产品,一般打成war包或者jar包交付给运维人员进行部署上线,但是由于双方的环境和配置存在差异,特别是版本迭代之后,不同版本环境的兼容等问题,往往产品在部署后无法正常运行甚至部署不成功。docker对这一系列问题提供了标准的解决方案。即是运维人员不是安装单纯的软件,而是带上原始的环境,包括代码、配置、数据、系统等,把原始环境一模一样的复制过来,从而消除了开发人员“在我的电脑上能正常工作,在你那不行”的问题。
1、docker概述
docker的三大要素:
镜像(image)、容器(container)、仓库(repository)
镜像是一个只读的模板,镜像可以用来创建docker容器,一个镜像可以创建多个容器,类比来说,镜像类型与java的类,容器相当于通过类创建的对象实例;
docker利用容器一个或一组应用,他可以被启动,停止,删除,每个容器相互隔离,互不影响;可以把容器看做是一个简易版的linux环境和运行在其中的应用程序;仓库是存放镜像的地方,仓库和仓库注册服务器是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库包含多个镜像,每个镜像有不同的标签(tag),仓库分为公开仓库和私有仓库,公开仓库最大的为官网的仓库,国内的公开仓库包括阿里云,网易云等。
1.1、docker包含两方面的技术
1镜像技术
打破代码即应用的观念,从系统环境开始,自底至上打包应用,类似于jvm一次构建,处处运行。
2
1.2、虚拟机vm与docker的区别
虚拟机是带环境安装的,连硬件也模拟了,存在占用资源多、冗余步骤多、启动慢等。后来的linux container 技术在此基础上做了减法,保存了公共使用的部分资源,容器内的应用进程直接运行与宿主内核,同时也不需要进行硬件虚拟,并且每个容器之间相互隔离,每个容器都有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。可以这样说,docker是精简版,压缩版的linux系统,其仅包含了操作系统的内核等必须的文件。
2、docker安装
前提:很重要,docker支持centos6.5或更高版本,在centos6.5上,要求系统为64位,系统内核版本为3.6.32-431及更高版本,centos7上要求系统64位,系统内核版本3.10以上。
在centos上查看系统的内核版本命令:
uname -r
以下为centos7的安装步骤,只有7以上的版本才支持社区版
1、卸载老版本
yum rm docker
2、安装yum工具
yum install -y yum-utils device-mapper-persistent-data lvm2
3、
按照上述步骤执行完命令就安装成功了
3、阿里云镜像加速
细节自行百度
4、docker命令
帮助命令
docker --help
镜像命令
1显示本地存在的镜像
docker images
2在仓库中查找镜像
docker search xxx
3拉取xxx镜像的yyy版本,省略yyy表示拉取最新版本,一般不使用
docker pull xxx:yyy
4删除镜像,以镜像名或者image ID删除
docker rmi xxx/yyy
强制删除加 -f参数
同时还可以删除多个镜像,镜像之间用空格隔开
容器命令
1新建并启动容器
docker run [OPTIONS] IMAGE [CAMMAND] [ARGS]
最常用的例如,假设有了镜像tomcat
docker run -d -p 8080:8080 --name tomcat8080 [-v /usr/local/tomcat8080/webapps:/usr/local/tomcat/webapps] tomcat
-i以交互模式运行容器,通常与-t搭配使用
-t为容器分配一个伪终端
-d 后台启动
-p端口映射
-P随机端口映射
-v 文件挂载
--name 给容器取名字叫做tomcat8080
但是加了-v参数,浏览器无法访问,目前还没解决
2查看启动的容器
docker ps
-a 正在运行的容器和历史上运行过的
-l 显示最近创建的容器
-n n 显示最近创建的n个容器
-q静默模式,只显示编号
--no-trunc 不截断输出
3退出容器
exit 容器停止并退出
ctrl+P+Q 容器不停止退出
4启动容器
docker start 容器id或者容器名
5重新启动容器
docker restart 容器id或者容器名
6停止容器
让容器走正常流程关闭
docker stop 容器id或者容器名
强制停止容器
docker kill 容器id或者容器名
7删除已停止的容器
docker rm 容器id或者容器名
-f 强制删除
8查看容器日志
docker logs -f -t --tail 容器ID
-t 加入时间戳
-f 跟随最新的日志打印
--tail n 显示最后n条
9查看容器内运行的进程
docker top 容器ID
10查看容器内部细节
docker inspect 容器ID
11进入容器
首先得进入容器,再执行其他操作
docker attach 容器ID
例如:先执行docker attach aaa
再执行ls -l /tmp
直接在宿主机内执行容器内的命令,并返回结果
docker exec -t 容器ID 容器内命令
例如:docker exec -t aaa ls -l /tmp
二者结果一样,但后者依然在宿主机内,没有进入容器内部
docker exec -t 容器ID /bin/bash 也可以进入容器
exec 功能比attach强大,建议使用exec
12容器内拷贝文件到宿主机上
docker cp 容器ID:容器内路径 目的主机路径
5、docker镜像
镜像原理
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。
unionFS(联合文件系统)是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下,Union文件系统是docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。特性:一次同时加载多个文件系统,但从外面看,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
正是因为这样,在docker中下载tomcat镜像时不需要单独安装jdk,原因是虽然docker最外层只给我们暴露了tomcat,但是其把其需要的其他文件自动给我们安装好了。
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作容器层,容器层之下的都叫做镜像层。
docker镜像commit操作
docker commit提交容器副本使之成为新的镜像,命令:docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名];例如
docker commit -a=“francie” -m=“my test image” b77088fe0fe3 francis/tomcat:1.0。注意francis/tomcat:1.0是规范的写法,前面带的francis部分为命名空间,类似于java的包名,tomcat:1.0为类名。
目前这个操作镜像只能发布到本地,发布到阿里云请看第9节。
6、docker容器数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器中,但不属于联合文件系统,因此能绕过联合文件系统提供一些用于持续存储或共享数据的特性;卷的设计目的就是数据持久化,完全独立于容器的生命周期,因此docker不会在删除容器时删除其挂载的数据卷。
特点:
1、数据卷可在容器之间共享或重用数据
2、卷中的修改可以直接生效,
3、数据卷中的修改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
数据卷的添加
1、直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名;例如:
docker run -it -v /myDataVolume:/dataVolumeContainer b77088fe0fe3
挂载目录之后,容器重启后,宿主机修改的内容会被完全同步。如果想要容器内目录只读,可通过加:ro来设置。例如
docker run -it -v /myDataVolume:/dataVolumeContainer :ro b77088fe0fe3
容器间还可以实现多数据卷挂载和容器间继承实现数据卷共享,实验有点不好做,需要的时候百度。
总结:1、编写一个dockerfile文件
2、有了dockerfile文件后,docker build命令执行,获得自定义镜像
3、run 这个自定义镜像
7、dockerFile解析
dockerfile是是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步走:
1、编写一个dockerfile文件
2、有了dockerfile文件后,docker build命令执行,获得自定义镜像
3、run 这个自定义镜像
dockerfile基础知识
1、每条保留字指令都必须大写且后面至少要跟随一个参数
2、指令按照从上到下的顺序执行
3、#号是注释符号
4、每条指令都会创建一个新的镜像层,并对镜像进行提交。
docker执行dockerfile的大致过程
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器进行修改
3、执行类似docker commit的操作提交一个新的镜像层
4、执行dockerfile中的下一条指令直到所有的指令都执行完成
dockerfile体系结构
FROM 基础镜像,当前镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露的端口
WORKDIR 指定在创建容器后,终端默认登录的工作目录
ENV 用来在构建镜像过程中设置环境变量
ADD 拷贝并解压缩
COPY 拷贝
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要执行的命令,dockerfile可以有多个CMD命令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT 也是启动容器时要执行的命令,不同之处在于docker run之后的参数不会覆盖,而是追加
ONBUILD 当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发。
8、docker常用安装
总体步骤:
搜索镜像–>拉取镜像–>查看镜像–>启动镜像–>停止容器–>移除容器–>删除镜像
tomcat
mysql
docker run -d --name mysql5.7 -p 3306:3306
-v /root/mysql/conf:/etc/mysql/conf.d
-v /root/mysql/logs:/logs
-v /root/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=root 3473143edd4d
用数据库连接工具测试mysql,成功
redis
docker run -d -p 6379:6379 -v /root/redis/data:/data
-v /root/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
7359b9f8c54e
redis-server /usr/local/etc/redis/redis.conf --appendonly yes
在本机输入命令 docker exec -it 3e3a1826ed34 redis-cli,成功!
9、本地镜像发布到阿里云
1、镜像的生成方法
(1)方式一:编写dockerfile,执行dockerfile
(2)从容器中创建一个新的镜像,docker commit [OPTIONS] 容器ID:TAG
2、创建仓库镜像
然后点击个人版,(第一次进来是让创建个人版实例)
镜像仓库,创建仓库,填写好相应参数
其中有一步,选择本地仓库
成功
3、将镜像推送到阿里云
(1)登录阿里云Docker Registry
docker login --username= registry.cn-shanghai.aliyuncs.com
会提示输入密码。
(2) sudo docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/francis_zend/francis:[镜像版本号]
(3)推送
docker push registry.cn-shanghai.aliyuncs.com/francis_zend/francis:[镜像版本号]
(4)拉取
sudo docker pull registry.cn-shanghai.aliyuncs.com/francis_zend/francis:[镜像版本号]
在阿里云镜像站中搜索francis_zend/francis也能查看到上传的镜像,但是现在在维护中,或者是我找的地方不对。