docker入门

docker入门

1. docker是什么?

背景:一个产品上线,会涉及到操作系统、运行环境以及配置等因素的影响,导致开发人员和运维人员之间协作会出现很多问题,对运维人员是一种考验。docker的出现,给出了一个标准化的解决方案,就是软件带环境去安装,将原始的环境一模一样的复制一份,打成一个镜像。

docker内部其实相当于是一个精简版的linux系统,所以容器运行的时候,可以进入到容器内部,你会发现目录的结果和linux很像。

理念:一个封装,处处运行。

一句话介绍docker是什么:

解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

虚拟机和容器化的区别:

docker使用的是容器虚拟化的技术

相对于虚拟机来说,虚拟机是会模拟整个操作系统包括硬件,所以启动加载也会比较慢,占用空间比较大。

而容器化虚拟是会复用宿主机的操作系统,不会模拟整个操作系统,将镜像在容器中进行运行,占用的资源小。

docker查询镜像的官网:hub.docker.com

docker架构图:

docerk架构图

2. docker 的三要素

镜像

​ 镜像就是模板

容器

​ 容器是镜像的一个实例

仓库

​ 存放镜像

​ 最大的镜像库是hub.docker.com

​ 国内有阿里云和网易云

3. 阿里云镜像加速

容器镜像服务 (aliyun.com)

登录阿里云

阿里云镜像加速

4. docker命令

4.1 帮助命令

docker version

​ 查看版本信息

docker info

​ 查看完整的docker信息

docker --help

​ 查看docker的命令

4.2 镜像命令

docker images

​ 列出本地的镜像
docker images

REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像的id
CREATED:镜像创建的时间
SIZE:镜像大小

同一个仓库源可以有多个TAG,代表仓库源不同的版本,REPOSITORY:TAG定义不同的镜像。不指定默认是lastest版本,指最后的版本。

可选参数:

-a  表示显示全部的镜像,包括隐藏的镜像(中间映像层,具体说明见数据卷)

-q  只显示镜像的id

--digests  显示镜像的摘要信息

--no-trunc  显示完整的镜像信息,镜像的id会显示完整的
docker search

​ docker search 镜像名

​ 会去hub.docker.com上查找镜像

可选参数:

--no-trunc  显示完整的镜像描述

-s  列出stars数不小于指定值的镜像。
	docker search -s 30 tomcat 表示查询stars大于30的镜像名为tomcat的镜像

--automated  只列出automated build类型的镜像
docker pull

​ docker pull 镜像名[:TAG]

​ TAG是可以省略的,省略默认是 docker pull 镜像名:lastest

docker rmi

​ docker rmi 镜像名[:TAG]

​ 删除本地镜像

​ 与上同理,不写TAG标签默认是lastest

​ 删除多个: docker rmi 镜像名1[:TAG] 镜像名2[:TAG]

​ 删除全部: docker rmi -f ${docker images -qa}

可选参数:

-f  强制删除,如果有容器在运行删除会报错,可以通过-f进行强制删除

4.3 容器命令

docker run

​ docker run [options] image[command] [args…]

​ 运行一个容器实例

可选参数:

--name 容器的新名字  为容器指定一个名称

-d  后台运行容器,并返回容器的id,即启动守护式容器
	守护式容器运行必须要有一个前台的进程,或者容器会自动退出,所以如果要保持一个守护式的容器运行就需要以前台进程的形式运行。

-i  以交互模式运行容器,通常会和-t一起使用

-t  为容器重新分配一个伪输入终端

-P  随机端口映射

-p  指定端口映射,格式有以下四种:
	ip:hostPort:containerPort
	ip::containerPort
	hostPort:containerPort
	containerPort

启动交互式容器:

docker run -it centos /bin/bash

docker ps

​ 列出当前正在运行的容器

可选参数:

-a  列出所有容器,包含正在运行以及历史运行过的容器

-l  显示最近创建过的容器

-n  显示最近n个创建的容器

-q  静默模式,只显示容器的id

--no-trunc  不截断输出
退出容器的方式
  1. exit

    容器停止退出

  2. ctrl+p+q

    容器不停止退出

docker start

​ docker start 容器id或者容器名

​ 启动已经停止的容器

docker restart

​ docker restart 容器id或者容器名

​ 重启正在运行的容器

docker stop

​ docker stop 容器id或者容器名

​ 柔和的停止容器,让容器慢慢停止,相当于电脑点击关机按钮

docker kill

​ docker kill 容器id或者容器名

​ 强制停止容器,相当于直接拔电源

docker rm

​ docker rm 容器id

​ 删除已停止的容器

​ 一次性删除多个容器:

docker rm -f $(docker ps -a -q)

docker ps -a -q | xargs docker rm
docker logs

​ docker logs -f -t -tail 容器id

-f  跟随最新的日志打印

-t  加入时间戳

-tail 数字  显示最后多少条

​ 查看容器日志

docker top

​ docker top 容器id

​ 查看容器内运行的进程

docker inspect

​ docker inspect 容器id

​ 查看容器内部细节,会返回一个json串来描述容器内部的信息

进入正在运行的容器并以命令行交互
  1. docker exec -it 容器id bashshell

  2. docker attach 容器id

    重新进入

上面两种方式的区别:

attach直接进入容器启动命令终端,不会启动新的进程。attach是进入到容器的内部之后你可以在容器内部通过命令操作。

exec是在容器中打开新的终端,并且可以启动新的进程。exec是可以不进入到容器内部,直接在宿主机返回结果,docker exec -it 容器id /bin/bash 运行的结果是和attach是一样的,会进入到容器,所以exec命令更加的强大。

docker cp

​ docker cp 容器id:容器内路径 目的主机路径

​ 将容器内的文件拷贝到主机

docker commit

​ docker commit -m=“提交描述信息” -a=“作者” 容器id 要创建的镜像名:[标签名]

​ 提交容器副本使之成为一个新的镜像

5. 镜像的原理

5.1 镜像是什么?

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。

5.2 联合文件系统

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层一层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是docker进行的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

5.3 docker镜像加载原理

docker的镜像实际上是由一层一层的文件系统组成,这种曾记关系的文件系统叫做UnionFS。

bootfs ( boot file system )主要包含 bootloader 和 kernel , bootloader 主要是引导加载 kernel , Linux 刚启动时会加载 bootfs 文件系统,在 Docker 镜像的最底层是 bootfs 。这一层与我们典型的 Linux / Unix 系统是一样的,包含 boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs 。

rootfs ( root file system ),在 bootfs 之上。包含的就是典型 Linux 系统中的/ dev ,/ proc ,/ bin ,/ etc 等标准目录和文件。 rootfs 就是各种不同的操作系统发行版,比如 Ubuntu , Centos 等等。
联合文件系统
平时我们安装进虚拟机的 CentOS 都是好几个 G ,为什么 docker 这里才200M??

centos镜像

对于一个精简的 os , rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用 Host 的 kernel ,自己只需要提供 rootfs 就行了。由此可见对于不同的 linux 发行版, bootfs 基本是一致的, rootfs 会有差别,因此不同的发行版可以公用 bootfs。

5.4 为什么docker镜像采用这种分层的结构?

最大的一个好处就是﹣共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份 base 镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

5.5 docker镜像的特点

Docker 镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

6. 容器数据卷

6.1 容器数据卷是什么?

先来看看 Docker 的理念:

  • 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的

  • 容器之间希望有可能共享数据

Docker 容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。

为了能保存数据在 docker 中我们使用卷。

6.2 数据卷可以做什么?

卷就是目录或文件,存在于一个或多个容器中,由 docker 挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System 提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。

特点:

  • 数据在可在容器之间共享和重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

简单来说:数据源可以 容器持久化、容器间继承+共享数据

6.3 添加数据卷
6.3.1 直接命令添加

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

如何查看数据卷是否挂载成功?

通过命令 docker inspect 容器id 命令,会显示下面的json串。

docker inspect

  • 主机修改了挂载的数据卷,容器内会同步到。

  • 容器内修改了数据卷的内容,主机也会同步。

  • 容器停止之后,主机修改了数据卷,容器重新运行依然会同步到修改的内容。

带权限的绑定数据卷:

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

ro代表 read-only 容器内只有读权限没有写权限

数据卷权限

6.3.2 dockerfile添加

dockerfile是什么?

是镜像的描述文件

添加数据卷

VOLUME[“dataVolumeContainer”,“dataVolumeContainer1”,“dataVolumeContainer2”]

出于可移植分享的考虑,用-v主机目录:容器目录这种方法不能直接在dockerfile中实现。

由于宿主机目录是依赖于特定的主机的,并不能保证所有的宿主机上都存在这样特定的目录。

  • 新建Dockerfile文件

  • 编写Dockerfile文件

    示例:

    # volume test
    FROM centos
    VOLUME["dataVolumeContainer1","dataVolumeContainer2"]
    CMD echo "finished,----------------success"
    CMD /bin/bash
    
  • Docker build -f /mydocker/Dockerfile -t zzyy/centos .

    -f 代表文件

    -t 命名空间,标签

    . 代表当前目录

docker build

  • docker run -it zzyy/centos

docker run

  • docker inspect 镜像id docker inspect

    宿主机会自动生成主机绑定的宿主机

6.4 数据卷容器
  1. 是什么?

    以某个容器作为数据卷模板运行新的容器,实现容器间数据卷的共享和传递数据的作用

    数据卷的生命周期一直到没有容器为止

  2. 如何添加?

    • 运行一个主容器,docker run -it --name dc01 zzyy/centos
    • 运行子容器继承父容器的数据卷,docker run -it --name dc02 –volume-from dc01 zzyy/centos
    • 在父容器的数据卷中做的修改,子容器中也会更新,子容器中做的修改,父容器也会影响

7. dockerfile

7.1 dockerfile是什么?

dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。

7.2 构建三步骤
  1. 编写dockerfile
  2. docker build
  3. docker run
7.3 dockerfile 构建过程解析
7.3.1 基础知识
  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照从上到下顺序执行
  3. # 表示注解
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
7.3.2 docker执行dockerfile的流程
  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit 的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile的下一条指令直至所有指令都执行完成
    docker执行dockerfile的流程
7.4 dockerfile保留字指令
FROM

基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER

镜像维护者的姓名和邮箱地址

RUN

容器构建时需要运行的命令

EXPOSE

当前容器对外暴露出的端口

WORKDIR

指定在容器创建后,终端默认登录进来工作目录,一个落脚短

ENV

用来在构建镜像过程中设置环境变量

ADD

将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中。

将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置

写法:

COPY src dest

COPY [“scr”,“dest”]

VOLUME

容器数据卷,用于数据保存和持久化工作

CMD

指定一个容器启动时要运行的命令

dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换

CMD

ENTRYPOINT

指定一个容器启动时要运行的命令

ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数,与CMD相比docker run 之后的命令不会覆盖,会追加到命令中

docker run 之后的参数会被当作参数传递给ENTRYPOINT,之后形成新的命令组合

ONBUILD

当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的ONBUILD被触发

7.5 案例
7.5.1 base镜像(scratch)

docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

7.5.2 自定义镜像mycentos

自定义一个安装了vim和net-tools的centos镜像

  1. 编写dockerfile
FROM centos
MAINTAINER zj<zj0710xl@vip.qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN yum update -y
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------------------ok"
CMD /bin/bash
  1. build一个自定义的镜像
docker build -f /mnt/d/test/dockerfile -t mycentos:1.0 .

build一个自定义的镜像

  1. 运行镜像
docker run -it mycentos:1.0
  1. 列出镜像的变更历史
docker history 镜像名

列出镜像的变更历史

7.5.3 自定义镜像tomcat
  1. 主机新建文件夹: mkdir -p /mnt/d/old_computor_data/test/mytomcat

  2. 在上述目录下 touch c.txt (用于之后演示COPY 将文件复制到镜像中)

  3. 将jdk和tomcat安装的压缩包拷贝到进上一步的目录
    在这里插入图片描述

  4. 新建dockerfile文件编写dockerfile,这里我的dockerfile文件名是 dockerfile_mytomcat

FROM centos
MAINTAINER zj<zj@126.com>
#把宿主机的c.txt文件夹复制到容器的/usr/local路径下,后面加了cincontainer.txt会重命名为cincontainer.txt
COPY c.txt /usr/local/cincontainer.txt
#复制并且解压缩jdk和tomcat包到/usr/local路径
ADD jdk-8u333-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.63.tar.gz /usr/local
#安装vim
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN yum update -y
RUN yum -y install vim
#设置WORKDIR,登录的落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置jdk和tomcat的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.63
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.63
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#端口
EXPOSE 8080
#启动tomcat 有以下三种方式
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.63/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.63/bin/startup.sh","run"]
CMD /usr/local/apache-tomcat-9.0.63/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.63/logs/catalina.out
  1. 构建镜像
docker build -f /mnt/d/old_computor_data/test/mytomcat/dockerfile_mytomcat -t mytomcat9:1.0 .
  1. 运行镜像
docker run -it -p 9080:8080 --name myt9 -v /mnt/d/old_computor_data/test/mytomcat/test:/usr/local/apache-tomcat-9.0.63/webapps/test -v /mnt/d/old_computor_data/test/mytomcat/logs:/usr/local/apache-tomcat-9.0.63/logs mytomcat9:1.0
  1. 验证: 主机浏览器访问 http://localhost:9080

验证

    1. 结合前述的容器卷将测试的web服务test发布
  • 在/mnt/d/old_computor_data/test/mytomcat/test文件夹下创建目录WEB-INF

  • 新建文件web.xml,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>test</display-name>

</web-app>
  • 在/mnt/d/old_computor_data/test/mytomcat/test目录下新建测试的a.jsp,内容如下
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
		<title>index</title>
	</head>
	<body>
		this is index jsp
		<br/><br/>
		<%="i am in docker tomcat"%>
		<br/>
		<br/>
		<% System.out.println("================docker tomcat");%>
	</body>
</html>

访问http://localhost:9080/test/a.jsp

  • 在a.jsp上再做任何的修改,不用再重启容器,刷新一下页面就可以生效,可以通过这样的方式实现快速部署

  • 在/mnt/d/old_computor_data/test/mytomcat/logs/catalina.out下可以看到容器运行的日志

7.6 dockerfile小结

dockerfile小结

8. 本地镜像推送到阿里云

  1. 登录阿里云容器镜像服务 (aliyun.com),创建阿里云镜像实例

创建阿里云镜像实例

  1. 创建镜像仓库

    创建镜像仓库

    创阿金镜像仓库

创建镜像仓库

  1. 推送本地镜像到阿里云

    推送本地

    $ docker login --username=用户名 registry.cn-shanghai.aliyuncs.com
    $ docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/grim/mycentos:[镜像版本号]
    $ docker push registry.cn-shanghai.aliyuncs.com/grim/mycentos:[镜像版本号]
    

    推送本地镜像到阿里云



    ps:本文中的一些示例是我通过win11的ubantu的子系统镜像操作的,实际上docker是装在了win11的系统上,具体的docker的安装步骤可以参考菜鸟教程

    引用说明:本文是参考b站视频https://www.bilibili.com/video/BV1Ls411n7mx做的笔记

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值