Docker进阶——再次认识docker的概念 Docker的结构 Docker镜像结构 镜像的构建方式

在这里插入图片描述

前言

在微服务大量应用的互联网时代,经常能看到docker的身影。作为docker的爱好者(在服务器安装MySQL,Redis。。。我用的都是docker),我也会持续深入学习和认识docker。

本篇博客再次介绍docker的基本概念,拆解docker的结构,介绍常用的相关命令,给出了制作镜像的两种方式,并给出操作案例。

其他相关的docker的博客文章如下

  • Docker——认识Docker & 常用命令 & Linux中安装docker & 常见问题及其解决
  • SpringBoot项目部署(Docker)——通过Dockerfile将打包好的jar包创建成镜像 & 在IDEA中配置docker,一键启动容器 & 用swagger进行测试

目录

  • 前言
  • 引出
  • 一、认识Docker
    • 1、docker的概念
    • 2、Linux中安装Docker
    • 3、docker相关概念
  • 二、Docker相关命令
    • 1、进程命令
    • 2、镜像容器命令
  • 三、Docker镜像结构
    • 1、Linux文件系统组成
    • 2、Docker镜像原理
  • 四、Docker镜像制作
    • 1、普通方式
    • 案例一:制作centos-java镜像
      • 1、首先创建一个centos容器
      • 2、安装JDK
      • 3、配置/etc/bashrc
      • 4、制作镜像
    • 2、dockerfile方式
    • 案例一:自定义centos7镜像
    • 案例二:定义dockerfile文件构建镜像,发布springboot项目
  • 总结

引出


1.介绍docker的基本概念,拆解docker的结构;
2.常用的相关命令,进程命令和容器镜像命令;
3.制作镜像的两种方式,并给出操作案例。

一、认识Docker

1、docker的概念

1、Docker 是一个开源的应用容器引擎
2、诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
3、Docker 是一个可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器引擎(好比汽车发动机),然后发布到任何流行的 Linux 机器上。
4、容器是完全使用沙箱机制,相互隔离
5、容器性能开销极低。
6、Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

在这里插入图片描述

docker扮演的是图中鲸鱼的角色,而鲸鱼之上的集装箱就是一个个容器,容器中是我们开发的应用程序(不仅限于web应用),每个容器都有自己独立的环境(环境设置、网络、文件系统…),互不干扰。而每个箱子,又可以打包成一个新的镜像,放到其它服务器的docker环境中直接运行,不再需要重复安装程序运行环境

2、Linux中安装Docker

Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上
官网:https://www.docker.com

可以参考以下博客文章:

Docker——认识Docker & 常用命令 & Linux中安装docker & 常见问题及其解决

#yum 包更新到最新
yum update -y
#安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/dockerce.
repo
# 安装docker
yum install -y docker-ce
#查看docker版本,验证是否验证成功
docker -v

3、docker相关概念

在这里插入图片描述

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

二、Docker相关命令

1、进程命令

systemctl start docker #启动docker服务
systemctl stop docker #停止docker服务
systemctl restart docker #重启docker服务
systemctl status docker #查看docker服务状态
systemctl enable docker #开机启动docker服务

2、镜像容器命令

(1)docker pull

拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本,如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。

#docker pull 镜像名称:版本号
docker pull redis:5.0
docker pull centos:7
docker pull mysql:5.6 | docker pull mysql:8.0.25
docker pull tomcat:8
docker pull nginx

(2)docker run

docker run

  • -i:以交互模式运行容器
  • -t:为容器重新分配一个伪输入终端
  • —name :容器名称
  • —privileged: 设置容器公开权限(默认为true)
  • -p :映射端口 linux端口: 容器内置端口(mysql默认端口为3306)
  • -v : linux挂载文件夹/文件和容器内路径的映射
  • -e: 容器的环境变量(设置mysql默认用户名&密码)
  • -d: 后台运行容器,并返回容器ID

修改时区,,日志正常:-v /etc/localtime:/etc/localtime \

docker run -it \
--name redis_6389 \
--privileged \
-p 6389:6379 \
--network pet_docker_net \
--ip 172.18.12.80 \
-v /etc/localtime:/etc/localtime \
-v /usr/local/software/6389/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/software/6389/data/:/data \
-v /usr/local/software/6389/log/redis.log:/var/log/redis.log \
-d redis \
/usr/local/etc/redis/redis.conf

(3)日志查看

# docker logs --tail 行数 -f 容器名 #查看某个容器末尾300行的日志内容
docker logs --tail 300 -f app-jar

(4)文件拷贝

#将主机/root/123.war文件拷贝到容器96f7f14e99ab的/root目录下
docker cp /root/123.war 96f7f14e99ab:/root/
#将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中
docker cp 96f7f14e99ab:/root /tmp/

三、Docker镜像结构

1、Linux文件系统组成

Linux文件系统组成由bootfs和rootfs两部分

  • bootfs:包含bootloader(引导加载程序)和 kernel(内核)
  • rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等

Linux——认识Linux的目录结构 & 常用命令 & vim命令 & 权限及其控制 & 防火墙命令 & 自定义命令
在这里插入图片描述

思考:
Docker 镜像本质是什么?

  • Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
  • Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?

2、Docker镜像原理

Docker镜像是由一层一层的文件系统叠加而成,最底端是 bootfs,并使用宿主机的bootfs ,第二层是 root文件系统rootfs,称为base image,然后再往上可以叠加其他的镜像文件,这种层级的文件系统被称之为UnionFS,统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统

一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像,当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

在这里插入图片描述

  1. Docker 镜像本质是一个分层文件系统
  2. 我们下载tomcat镜像大小是600+MB,是因为里面还包含了jdk和centos这两个镜像层,所以很大,另外需要注意一点的是,这个tomcat镜像里面包含了jdk镜像和centos基础镜像,为什么基础镜像是centos而不是ubuntu呢?这是由做这个tomcat镜像的发行商决定的。
  3. 我们下载centos镜像很小,是因为而centos镜像层复用了宿主机的bootfs,下载的只有rootfs,所以centos是很小的

说明:docker内核和宿主机共内核,也就是bootfs,至于rootfs发行版本,可以使和宿主机一样是centos、也可以是ubuntu或者其他的,如:docker pull centos,然后做一个容器,那么docker的发行版本是centos,进入docker容器,通过输入命令: cat /etc/redhat-release 可以查看; docker pull ubuntu,然后做一个容器,则发行版本是ubuntu

四、Docker镜像制作

在这里插入图片描述

1、普通方式

将新的镜像转成压缩文件,给测试人员;测试人员把我们的压缩文件还原成一个新的镜像

docker commit 容器id 镜像名称:版本号 #把容器做成镜像
docker save -o 压缩文件名称 镜像名称:版本号 #把镜像做成压缩包,放到宿主机的某个位置
docker load –i 压缩文件名称 #别人(测试人员)加载镜像(压缩包)

注意事项:容器转为镜像,如果容器有挂载的内容,做成新镜像的时候,挂载的内容是不会载入到镜像里面的

案例一:制作centos-java镜像

1、首先创建一个centos容器

docker pull centos:7.9.2009
docker run -it --name=centos centos:7.9.2009 /bin/bash

在这里插入图片描述

2、安装JDK

下载jdk-8u151-linux-x64.tar.gz到容器的home目录里面

wget http://xxx/jdk-8u151-linux-x64.tar.gz
tar -xzvf jdk-8u151-linux-x64.tar.gz
vi /etc/profile

在最下面加上:

export JAVA_HOME=/home/jdk1.8.0_151
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools
.jar
export PATH=$PATH:$JAVA_HOME/bin

使配置生效:

source /etc/profile

检查jdk:

java -version

在这里插入图片描述

3、配置/etc/bashrc

重启后环境变量仍生效在/etc/bashrc最下面加上

export JAVA_HOME=/home/jdk1.8.0_371
export CLASSPATH=.:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin

由于每次启动终端的时候,都会执行 /etc/bashrc ,所以可以把source /etc/profile 命令写入到 /etc/bashrc 文件中,实现环境变量立刻全面生效的效果。

退出容器

exit

4、制作镜像

把centos7容器做成镜像

docker commit 6598a89db5f6 centos7-java8:1.0
docker images #可以查看到centos7-java8:1.0镜像

在这里插入图片描述

把镜像做成压缩包 放到宿主机的某个位置

docker save -o centos7-java8.tar centos7-java8:1.0 
#-o:output 压缩文件保存到/root目录下

在这里插入图片描述

把压缩文件载入镜像(第三方载入该压缩包)

docker load -i centos7-java8.tar #镜像加载 -i (input)
docker images

用centos7-java8:1.0镜像做容器

docker run -id --name=centos7-java8 centos7-java8:1.0
docker exec -it centos7-java8 /bin/bash #进入容器
#或者启动并进入容器
docker run -it --name=centos7-java8 centos7-java8:1.0 /bin/bash

2、dockerfile方式

它是用来制作docker镜像的一个文本文件,文件包含了一条条的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像,

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境,
  • 对于测试人员:可以直接拿开发时所构建的镜像或者用Dockerfile文件构建一个新的镜像开始工作了,
  • 对于运维人员:在部署时,可以实现应用的无缝移植
关键字作用备注
FROM指定父镜像指定dockerfile基于那个image构建
MAINTAINER作者信息用来标明这个dockerfile谁写的
LABEL标签用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN执行命令执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD容器启动命令提供启动容器时候的默认命令 和ENTRYPOINT配合使用 格式CMD command param1 param2 或者 CMD [“command” ,“param1”,“param2”]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用
COPY复制文件build的时候复制文件到image中
ADD添加文件build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务, ADD 源路径 目标路径
ENV环境变量指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG构建参数构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME定义外部可以挂载的数据卷指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE暴露端口定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露 端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR工作目录指定容器内部的工作目录 如果没有创建则自动创建 如果指定 使用的是绝对地址 ,如果不是 / 开头那么是在上一条workdir的路径的相对路径
USER指定执行用户指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK健康检查指定监测当前容器的健康监测的命令 基本上没用 因为很多时候应用本身有健康监测机制
ONBUILD触发器当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行 FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像用处也不怎么大
STOPSIGNAL发送信号量到宿主机该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

案例一:自定义centos7镜像

1、默认登录路径为 /usr
2、可以使用vim
步骤1:创建centos-dockerfile文件

mkdir docker-file
cd docker-file
[root@localhost docker-file]# vim centos-dockerfile

步骤2:文件内容如下

FROM centos:7 #原镜像
MAINTAINER tianju <tianju@tianju.cn>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash

说明:
定义父镜像:FROM centos:7
定义作者信息:MAINTAINER tianju <tianju@tianju.cn
执行安装vim命令: RUN yum install -y vim
定义默认的工作目录:WORKDIR /usr
定义容器启动执行的命令:CMD /bin/bash

步骤3:通过dockerfile文件构建镜像

语法:docker build –f dockerfile的文件路径 –t 镜像名称:版本 .

docker build -f ./centos-dockerfile -t my_centos:1 .
docker images

注意事项:
利用当前centos-dockerfile文件构建镜像 -t my_centos:1 指定新镜像的名称和版本, 后面的 . 不能省略
参数:-f 表示dockerfile -t 表示tag

案例二:定义dockerfile文件构建镜像,发布springboot项目

步骤1:创建dockerfile文件并编写内容

vim springboot-dockerfile

编写如下内容

FROM java:8
MAINTAINER woniu<woniu@woniu.cn>
ADD springboot.jar app.jar
CMD java -jar /app.jar

说明:
ADD springboot.jar app.jar 表示把宿主机的springboot.jar复制到镜像里并更名为app.jar,当用镜像做容器时,app.jar默认在容器的根目录

步骤2:通过dockerfile构建镜像

docker build -f ./springboot-dockerfile -t springboot-app:1.0 .

步骤3:通过springboot-app:1.0镜像创建容器

docker run -it --name=app -p 8080:8080 springbootapp:1.0
docker logs --tail 100 -f app #查看app容器的日志末尾100行

总结

1.介绍docker的基本概念,拆解docker的结构;
2.常用的相关命令,进程命令和容器镜像命令;
3.制作镜像的两种方式,并给出操作案例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA UDP RGMII 千兆以太网(3)ODDR

1 xilinx原语 在 7 系列 FPGA 中实现 RGMII 接口需要借助 5 种原语,分别是:IDDR、ODDR、IDELAYE2、ODELAYE2(A7 中没有)、IDELAYCTRL。其中,IDDR和ODDR分别是输入和输出的双边沿寄存器,位于IOB中。IDELAYE2和ODELAYE2,分别用于控制 IO 口输入和输出延时。同时,IDELAYE2 …

R系组播调优方案

修改/etc/sysctl.conf添加如下内容&#xff1a; Vim /etc/sysctl.con net.ipv4.ip_forward1 net.ipv4.ip_nonlocal_bind1 net.ipv4.conf.all.rp_filter0 net.ipv4.conf.default.rp_filter0 net.bridge.bridge-nf-call-arptables 0 net.bridge.bridge-nf-call-ip6tables 0 …

深度学习之基于Pytorch框架的MNIST手写数字识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 MNIST是一个手写数字识别的数据集&#xff0c;是深度学习中最常用的数据集之一。基于Pytorch框架的MNIST手写数字识…

如何生成安卓证书?

1、Android平台签名证书(.keystore)生成指南&#xff1a; Android平台签名证书(.keystore)生成指南 - DCloud问答 2、安装JRE环境&#xff08;推荐使用JRE8环境&#xff0c;如已有可跳过&#xff09; Download the Latest Java LTS Free配置环境变量 3、powerShell命令&#…

Vue Router active-class 属性

active-class 是 vue-router 模块的 router-link 组件的属性&#xff0c;当 router-link 标签被点击时将会应用这个样式。 单独在 router-link 标签上使用 active-class 属性 <router-link to"/about" active-class"active">about</router-link…

腾讯云3年期轻量应用服务器优惠(薅羊毛教程)

腾讯云轻量应用服务器特价是有新用户限制的&#xff0c;所以阿腾云建议大家选择3年期轻量应用服务器&#xff0c;一劳永逸&#xff0c;免去续费困扰。腾讯云轻量应用服务器3年优惠可以选择2核2G4M和2核4G5M带宽&#xff0c;3年轻量2核2G4M服务器540元&#xff0c;2核4G5M轻量应…

Python实用技巧:将 Excel转为PDF

将Excel文件转换为PDF可以方便储存表格数据&#xff0c;此外在打印或共享文档时也能确保表格样式布局等在不同设备和操作系统上保持一致。今天给大家分享一个使用第三方Python库Spire.XLS for Python 实现Excel转PDF的简单方法。 实现步骤 首先&#xff0c;通过pip命令来安装依…

C#中在.NET 7.0控制台应用使用ADO.NET的方法

目录 一、新建.NET Framwork类、通过ADO.NET访问数据库并生成库 1.操作流程 2.库源码 3.生成库 二、再建 .NET 7.0控制台应用、依赖像引用库 1. 操作流程 2.program.cs源码 3.在program.cs中查看类Class1定义 作者在上一篇文章中曾说过.NET 7.0框架下不支持ADO…

AWS云服务器EC2实例进行操作系统迁移

AWS云服务器EC2实例进行操作系统迁移 文章目录 AWS云服务器EC2实例进行操作系统迁移1. 亚马逊EC2云服务器简介1.2 亚马逊EC2云务器与弹性云服务器区别 2. 亚马逊EC2云服务器配置流程2.1 亚马逊EC2云服务器实例配置2.1.1 EC2实例购买教程2.1.1 EC2实例初始化配置2.1.2 远程登录E…

Python基础入门例程51-NP51 列表的最大与最小(循环语句)

最近的博文&#xff1a; Python基础入门例程50-NP50 程序员节&#xff08;循环语句&#xff09;-CSDN博客 Python基础入门例程49-NP49 字符列表的长度-CSDN博客 Python基础入门例程48-NP48 验证登录名与密码&#xff08;条件语句&#xff09;-CSDN博客 目录 最近的博文&…

Postman —— post请求数据类型

1、Postman中post的数据类型 post中有以下数据类型 1、form-data 2、x-www-form-urlencoded 3、raw 4、binary 2、Postman请求不同的post数据类型 from-data multipart/form-data&#xff0c;它将表单的数据组织成Key-Value形式&#xff0c;也可以上传文件&#xff0c;当…

Python基础入门例程52-NP52 累加数与平均值(循环语句)

最近的博文&#xff1a; Python基础入门例程51-NP51 列表的最大与最小(循环语句)-CSDN博客 Python基础入门例程50-NP50 程序员节&#xff08;循环语句&#xff09;-CSDN博客 Python基础入门例程49-NP49 字符列表的长度-CSDN博客 目录 最近的博文&#xff1a; 描述 输入描…

03函数参数

函数参数 有参 形参实参 无参 形参 就是形式参数&#xff0c;在def关键字定义函数名的括号里面的变量叫做形式参数&#xff0c;形参没有实际意义&#xff0c;被赋值后才有意义 实参 就是实际参数&#xff0c;在调用函数时提供得知或者变量成为实际参数 实参就是实际意义上的…

【计算机网络基础实验】实验二 有线IP互通网络实践

任务一 IP路由协议实现企业路由器通信 目录如下&#xff1a; 任务一 IP路由协议实现企业路由器通信2.1.1 任务描述2.1.2 任务目的2.1.3 任务实施实验需求实验步骤步骤1&#xff1a;更改每台设备的名称步骤2&#xff1a; 给R1接口配置相应IP地址步骤3&#xff1a; 给R2接口配置相…

华为ensp:rip宣告

ip全部配置好 R1 进入r1视图模式 rip network 192.168.1.0 network 1.0.0.0 R2 进入r2视图模式 rip network 192.168.2.0 network 1.0.0.0 这样就完成了宣告 display ip routing-table 查看路由表

异或运算

文章目录 异或运算的概念异或运算的性质交换两个变量的值&#xff08;不使用额外变量&#xff09;只出现一次的数字只出现一次的数字 III只出现一次的数字 II 异或运算的概念 对应二进制位进行异或运算对应二进制位上&#xff0c;相同结果为0&#xff0c;不同结果为1 小技巧&…

小程序分享当前页面

小程序分享页面的时候&#xff0c;大部分的资料都是显示的是onShareAppMessage 这个方法 /*** 用户点击右上角分享*/onShareAppMessage(res) {return {title: 您的好友向您分享了一本通讯录: this.data.setting.name,imageUrl: this.data.setting.share_img,path: pages/shar…

GO学习之 互斥锁、读写锁该如何取舍

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…

Postman使用json提取器和正则表达式实现接口的关联

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一&#xff09;使用json提取器实现接口关联 实际项目场景&#xff0c;在财务信息页面&#xff0c;需要上传一个营业执照&…

C++进阶-STL set/multiset容器和map容器的简单认识

set/multiset容器的简单认识 set基本概念set与multiset 的区别&#xff1a;set容器的构造和赋值set容器的大小和交换set容器的插入与删除set容器的查找和统计set容器-set和multiset的区别set容器内置类型指定排序规则set容器自定义数据类型指定排序规则 pair对组创建map容器的基…