Docker深入浅出系列 | Image实战演练
Posted lonelyxmas
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker深入浅出系列 | Image实战演练相关的知识,希望对你有一定的参考价值。
原文:Docker深入浅出系列 | Image实战演练
目录
Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会根据本人理解去做阐述,具体官方概念可以查阅官方教程,因为本系列教程对前一章节有一定依赖,建议先学习前面章节内容。
本系列教程导航:
Docker深入浅出系列 | 容器初体验
1|0课程目标
- 回顾Container与Image核心知识
- 了解如何制作自定义Image的两种方式
- 了解Dockerfile的一些常用指令
- 了解Image一些常用命令
- 了解如何基于现有Image创建新的Image
- 了解如何运行一个Springboot容器
2|0Container与Image核心知识回顾
在上一篇已经提到过,Docker Image是有多层结构,实际上由一层一层的文件系统组成,底层都是共享宿主Linux内核,Image的分层结构是是为了提高复用性。Image可以看作是Java的class文件,容器可以看成是JAVA的对象去理解,下层的每一层镜像可以看作是JAVA中的父类,上层镜像可以共享底层镜像的组件,类似JAVA中的继承规则。
Docker Image 基于 Union file systems做镜像和容器分层,避免在每次以新容器运行图像时复制一组完整的文件。将更改分隔为其自身层中的容器文件系统,允许将同一容器置于从已知内容重新启动(因为在删除容器时,更改的图层将被关闭)。
面向用户的是Container层,所有用户新增环境依赖和数据都会保存在容器层,下层Image只可读、不可修改。
Container是一种轻量级的虚拟技术,不需要模拟硬件创建虚拟机启动内核空间,因此启动速度很快
Docker是基于Linux Kernel的Namespace、CGroups、UnionFileSystem等技术封装成的一种自
定义容器格式,从而提供一套虚拟运行环境。
- Namespace:对全局系统资源的一种封装隔离,使得处于不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前namespace里的进程,对其他namespace中的进程没有影响,比如pid[进程]、net[网络]、mnt[挂载点]等
- CGroups: cgroup和namespace类似,也是将进程进行分组,但它的目的和namespace不一样,namespace是为了隔离进程组之间的资源,而cgroup是为了对一组进程进行统一的资源监控和限制,比如内存、CPU、进程数等
- Union file systems:用来做image和container分层
3|0制作Docker Image的两种方式
- 通过Dockerfile制作(推荐) - Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
- 通过
Docker commit
操作 - 通过docker commit命令反向基于容器副本创建一个新的镜像文件。但是使用docker commit
看不到Image的创建过程,因此对排查问题不友好。
4|0Dockerfile常用指令
- FROM
指定基础镜像,比如FROM centos:6
FROM centos:6
- RUN
在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用
groupadd -r mysql && useradd -r -g mysql mysql
- ENV
设置变量的值,ENV MYSQL_MAJOR 5.7,可以通过docker run --e key=value修改,后面可以直接使
用${MYSQL_MAJOR}
ENV MYSQL_MAJOR 5.7
- LABEL
设置镜像标签
- VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷,在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
作用:- 避免重要的数据,因容器重启而丢失,这是非常致命的。
- 避免容器不断变大。
VOLUME /var/lib/mysql
- COPY
将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和
解压
COPY demo-api.jar /usr/loacl/app/
- ADD
将主机的文件复制到镜像内,和COPY类似,只是ADD会对压缩文件提取和解压
ADD demo-api.jar /usr/loacl/app/
- WORKDIR
指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建
会在/usr/local/tomcat下创建test.txt文件
- CMD
容器启动的时候默认会执行的命令,若有多个CMD命令,则最后一个生效
- ENTRYPOINT
和CMD的使用类似,但docker run
执行时,会覆盖CMD的命令,而ENTRYPOINT
不会
- EXPOSE
声明容器运行的服务端口,启动镜像时,可以使用-p将该端口映射给宿主机
EXPOSE 3306 3307
更多操作可以查看菜鸟教程
5|0Image实战篇
5|1通过Dockerfile制作Image
(1)在IDEA创建一个Springboot项目
(2)创建一个Rest Api
(3)通过maven命令 mvn clean package
打包应用
target目录会生成了一个demo-api-0.0.1-SNAPSHOT.jar
(4)进入上一章创建的虚拟机Centos7服务器中创建一个目录demo-dockerfile
目录
- 使用前一章创建的密码
evan123
去登陆Centos7服务器
- 创建文件夹
(4)回到宿主机器,上传demo-api-0.0.1-SNAPSHOT.jar
到Centos7服务器demo-dockerfile
目录,我这里用使用命令行操作,其他童鞋可以使用其他sfpt工具上传
(5)回到虚拟机,在刚才创建的目录下创建一个Dockerfile
文件
(6)填入以下内容到Dockerfile
(7)先启动Docker服务,假如不存在
(8)在该目录下基于Dockerfile
构建自定义的镜像
命令:docker build -t demo-api-image .
运行结果如下:
(9)基于我们自定义的image启动容器,容器命名为demo-api
(10)查看容器的启动日志
(11)在宿主机器上访问容器服务,测试Api是否成功部署
(12)再启动多一个容器实例测试
(12)登陆Docker镜像仓库,没有账号的童鞋提前到hub.docker.com
注册
(13)推送定制的Docker镜像到远程仓库,镜像名称要跟Docker id一致
(15)从远程仓库把Image拉到本地
(16)基于远程10856214/demo-api-image
启动容器
5|2通过Docker Commit创建Image
(1)查看运行中的容器
(2)进入我们在上一节从远程仓库拉回来的自定义镜像内部
(3)修改容器demo-api03,在容器内部安装yum工具
- 尝试运行yum指令,默认是不带yum工具,因为容器里的linux操作系统只保留基本指令
- 查看下容器内部的linux操作系统版本
内置的操作系统用的Debian
- 使用apt-get更新系统组件
- 安装容器内置操作系统必要依赖
- 下载安装yum组件
- 测试
yum
是否安装成功
(4)通过以上步骤,我们已经成功修改了容器,接下来我们推出容器,基于当前容器版本创建一个新的Image,命名为demo-api-image-v1
这时候创建出来的Image是默认已经携带了yum
组件
(5)基于上面更新的新镜像demo-api-image-v1
创建一个容器
(6)进入demo-api-v2
容器验证是否已经存在yum
组件
6|0附录
6|1Image常用操作
- 查看本地image列表
docker images docker image ls
- 获取远端镜像
docker pull
- 删除镜像[注意此镜像如果正在使用,或者有关联的镜像,则需要先处理完]
docker image rm imageid docker rmi -f imageid docker rmi -f $(docker image ls)
删除所有镜像 - 运行镜像
docker run image
- 发布镜像
docker push
6|2Container常用操作
- 根据镜像创建容器
docker run -d --name -p 9090:8080 my-tomcat tomcat
- 查看运行中的container
docker ps
- 查看所有的container[包含退出的]
docker ps -a
- 删除container
docker rm containerid docker rm -f $(docker ps -a)
删除所有container - 进入到一个container中
docker exec -it container bash
- 根据container生成image
docker commit demo-api03 demo-api-image-v1
- 查看某个container的日志
docker logs container
- 查看容器资源使用情况
docker stats
- 查看容器详情信息
docker inspect container
- 停止/启动容器
docker stop/start container
6|3项目Demo Github
https://github.com/EvanLeung08/eshare-docker-in-action.git
__EOF__
出 处:https://www.cnblogs.com/evan-liang
关于博主:热爱生活,爱读书/旅游,乐于专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
以上是关于Docker深入浅出系列 | Image实战演练的主要内容,如果未能解决你的问题,请参考以下文章