资讯专栏INFORMATION COLUMN

【Docker】第2篇:Docker 介绍

nevermind / 526人阅读

摘要:根据镜像文件生成容器实例。容器是一个运行时环境,就是鲸鱼背上的一个个集装箱。这一层于我们典型的系统一样,包含加载器和内核。数据卷使得数据可以持久化和共享。

docker简介

1.docker是基于go语言实现
主要目标是对对应组件的封装、分发、部署、运行等生命周期的管理,使应用程序及其运行环境能够做到“一次封装,到处运行”

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

3.docker能干些什么?

虚拟机技术
简单理解可以在一种操作系统里面运行另外一种操作系统,比如windows中运行linux系统,常见的是vmware;缺点:占用资源,启动慢,安装步骤繁琐。

容器虚拟化技术
docker既是一种容器虚拟化技术,docker本身是一个容器运行载体或称之为管理引擎,我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是镜像文件,只有通过这个镜像文件才能生成docker容器。docker 根据 image 镜像文件生成容器实例。同一个image文件可以生成多个同时运行的容器实例。

docker 架构

docker使用 docker 初体验

新建并启动一个docker容器,使用 docker run命令即可

docker run -d -p 91:80 nginx


需要注意的是使用 docker run 命令创建容器时,会先检查本地是否存在指定镜像,如果本地不存在,docker 会自动从 dockerHub 上下载一个该镜像并启动。

检验docker容器是否启动成功

访问地址http://localhost:91/

docker的三大要素

仓库:存储镜像的地方,分为公开仓库和私有仓库

镜像:包含了你打包的应用程序及其所依赖的环境

容器:用镜像创建的运行实例,可以把容器看成简易版的Linux的容器,一个运行中的容器是一个运行在Docker主机上的进程,但它和主机,以及所有运行在主机上其他进程都是隔离的。

容器是利用什么机制实现隔离的?

Linux 命名空间

Linux 控制组(cgroups)

docker底层原理

docker是一个client-server结构的进程,docker守护进程运行在主机上,然后通过socket连接从客户端的访问,守护进程从客户端接受命令并管理运行在主机上的docker容器。容器是一个运行时环境,就是鲸鱼背上的一个个集装箱。

docker常用命令

1.帮助命令

docker version
docker info
docker --help

2.镜像命令

docker images : 列出本地镜像
docker image -qa  : 显示全部镜像id
docker images --digests : 显示镜像简介信息
docker images --digests --no-trunc

docker search tomcat : 搜索某个镜像
docker pull tomcat : 下载镜像到本地  等价于  docker pull tomcat:latest(默认下最新版本)
docker rmi tomact : 删除某个镜像 
docker rmi tomcat:6.5 删除制定版本镜像
docker rmi -f tomcat 强制删除镜像
docker rmi -f nginx tomcat 强制删除多个镜像
docker rmi -f ${docker images -qa} 强制删除全部

3.容器命令

(1) docker pull centos : 下载centos镜像
(2) docker run [options] image
—name=“容器新名字” :为容器制定一个名字
-i : 容器的image id
-t : 交互式启动 ,比如 :docker run -it 0a8b6f21d511
-d : 后台运行容器
-p : 制定映射端口
docker run -it -p 8080:8080 tomcat (-p 指定主机端口:docker容器暴露给宿主机的端口;-P 随机分配端口)

(3) docker ps : docker中运行的进程,docker ps -n 5
(4) exit: 容器停止退出
(5) docker restart  docker stop  docker kill  docker rm 
(6)一次性删除多个容器: 
docker rm -f $(docker ps -qa)
docker ps -aq | args docker rm

(7)docker run -d 容器名 : 运行容器
(8)docker logs -f -t --tail n 容器id(-f : 跟随最新的日志;-t :加入时间戳;--tail n : 倒数几行): 查看容器日志
演示命令:
docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done" : 每隔两秒输出内容
(9) docker top 容器ID : 查看容器内部运行的进程
(10) docker inspect 容器ID : 查看容器内部细节,如:docker inspect f791d79a4467
(11) docker attach 容器ID : 重新进入未停止的容器
(12) docker exec -t f791d79a4467 ls -l /tmp : 重新进入某个容器并执行容器中的命令,拿到结果反给宿主机
(13) docker cp 容器ID:路径文件  /宿主机路径 :copy容器内容到宿主机上
docker的镜像

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

unionFS:联合文件系统,一层层文件系统组成

docker如何加载?
docker的镜像实际上由一层一层的文件系统组成,这种层级文件系统是unionFS

bootfs(boot file system):主要包含bootloader和kernel,bootloader主要引导加载kernel,linux刚启动是会加载bootfs文件系统,在docker镜像最底层是bootfs文件。这一层于我们典型的Linux/unix系统一样,包含boot加载器和内核。当boot加载完成之后整个内核就在内存中了,此时系统会卸载bootfs

rootfs(root file system):在bootfs之上,包含的就是典型linux系统中的/dev,/bin,/etc等目录和文件。

docker commit -m=“提交信息” -a=“作者”  容器ID  要创建的目标镜像名称:[标签名]
docker commit -m=“helloword” -a=“feifei” 0a8b6f21d511 feifei/tomcat02:1.2
docker容器数据卷

docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然就没有了,为了保存数据我们使用docker的数据卷。数据卷使得数据可以持久化和共享。

命令添加数据卷

docker run -it -v /宿主机绝对路径目录:/容器内目录  镜像名
例如:docker run -it -v /tmp/my-volume:/tmp/my-volume centos ;宿主机目录:/tmp/my-volume和docker容器目录/tmp/my-volume这两个目录中的数据可以随时同步,容器重启后,也会同步;

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro  镜像名 (带权限的命令,同步到容器内的文件read only)

这种方式不支持多台宿主机都能够建立数据卷

DockerFile添加

可以在Dockerfile中使用 VOLUME 指令来给镜像添加一个或多个数据卷
1.创建Dockerfile文件目录
/Users/ShiFeifei/Software/docker-config,在这个目录下

touch Dockerfile 
vim Dockerfile 

添加如下内容

FROM centos
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

2.新建一个 docker 容器

docker build -f /Users/ShiFeifei/Software/docker-config/Dockerfile -t sff/centos .
Dockerfile

Dockerfile 是用来构建 Docker镜像的构建文件,是由一系列命令和参数构成

Dockerfile 构建步骤

编写Dockerfile文件

docker build

docker run

Dockerfile 文件执行规则

关键字指令都必须是大写字母,并且后面要跟随至少一个参数

指令按照从上到下顺序执行

#表示注释

每条指令都会创建一个新的镜像层,并对镜像进行提交

Dockerfile、Docker镜像和Docker容器分别代表了软件的三个不同阶段

Dockerfile是软件的原材料

Docker镜像是软件的交付品

Docker容器则可以认为是软件的运行态

Dockerfile面向开发,Docker镜像成为软件交付标准,Docker容器则涉及部署与运维,三者缺一不可,是Docker体系的基石。

Dockerfile 保留字指令

FORM : 基础镜像,当前要创建的来自于这个基础镜像

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

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

EXPOSE : 当前容器启动后对外暴露的端口声明

WORKDIR : 指定在容器创建后,终端默认登录进来的工作目录,可以理解为家目录

ENV : 设置环境变量

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

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

VOLUME : 指定容器数据卷

CMD : 指定一个容器启动时要运行的命令,Dockerfile 中可以有多个CMD命令,但只有最后一个生效;CMD 会被 docker run 之后的参数覆盖

ENTRYPOINT : 指定一个容器启动时要运行的命令,目的和CMD一样,都是指定容器启动程序及参数,参数不会被覆盖,只会追加

ONBUILD :

案例

1.实现一个功能,定制一个 mycentos 支持vim、ifconfig命令,并且修改登录后的默认路径

FROM centos
ENV homePath /tmp
WORKDIR $homePath  #登录时的目录是 /tmp
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80
CMD /bin/bash

2.自定义一个centos,自带 tomcat 、jdk

FROM lentos
MAINTAINER shifeifei

#把宿主机当前路径下的文件c.txt拷贝到容器的/usr/local/路径下
COPY c.txt /usr/local/test.txt

#把Java和tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/

#安装vim编辑器
RUN yum -y install vim

#设置工作访问时的WORKDIR路径
ENV MYPATH /usr/local
WORKDIR $MYPATH

#配置Java、tomcat环境变量
ENV JVAV_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#容器运行时监听端口
EXPOSE 8080
#启动运行tomcat
#CMD [“/usr/local/apache-tomcat-9.0.8/bin/startup.sh”,"run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27885.html

相关文章

  • Docker 深入之 Build 原理

    摘要:先简单介绍下,通常情况下我们将其称之为镜像,镜像是由多个层组成的文件,这些层用于在容器内执行代码命令等。而的时候则会将此信息再次进行编码。 使用 Docker 时,最常用的命令无非是 docker container 和 docker image 相关的子命令,当然最初没有管理类命令(或者说分组)的时候,最常使用的命令也无非是 docker run docker commit dock...

    BearyChat 评论0 收藏0
  • Docker 深入之 Build 原理

    摘要:先简单介绍下,通常情况下我们将其称之为镜像,镜像是由多个层组成的文件,这些层用于在容器内执行代码命令等。而的时候则会将此信息再次进行编码。 使用 Docker 时,最常用的命令无非是 docker container 和 docker image 相关的子命令,当然最初没有管理类命令(或者说分组)的时候,最常使用的命令也无非是 docker run docker commit dock...

    scq000 评论0 收藏0
  • SpringCloud( 055 )CentOS7 搭建 docker-registry 私有库

    摘要:第篇搭建私有库及管理界面一大致介绍基于前面的部署,容器一多非常不便于管理,于是急需一个自己的私有库而目前市面上大多数的私有库基本上都是后台服务加前台构成,于是选来选去,最后选择了管理界面之所以选择这款管理界面,我就简述阐述一下,基于以下 SpringCloud(第 055 篇)CentOS7 搭建 docker-registry 私有库及管理界面 - 一、大致介绍 1、基于前面dock...

    tracymac7 评论0 收藏0
  • SpringCloud( 055 )CentOS7 搭建 docker-registry 私有库

    摘要:第篇搭建私有库及管理界面一大致介绍基于前面的部署,容器一多非常不便于管理,于是急需一个自己的私有库而目前市面上大多数的私有库基本上都是后台服务加前台构成,于是选来选去,最后选择了管理界面之所以选择这款管理界面,我就简述阐述一下,基于以下 SpringCloud(第 055 篇)CentOS7 搭建 docker-registry 私有库及管理界面 - 一、大致介绍 1、基于前面dock...

    gekylin 评论0 收藏0
  • Docker镜像细节

    摘要:简单来说是镜像的源码。例如,的镜像镜像,在中是一个基础镜像的镜像也是镜像那么镜像和共享同一个基础镜像层,提高了存储效率。 前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y showImg(https://segmentfault.com/img/remote/14600000180560...

    xiaokai 评论0 收藏0

发表评论

0条评论

nevermind

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<