docker学习笔记

docker 简介

Docker是基于Go语言实现的云开源项目。

Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到 “一次封装,到处运行”

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

docker 的出现原因

一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验 。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。

环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时**“在我的机器上可正常工作”**的问题。

开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。Docker镜像的设计,使得Docker得以打破过去"程序即应用" 的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

docker 解决方案

把操作系统,jdk,tomcat,代码,配置等全部放到集装箱里。再打包放到鲸鱼上,由鲸鱼给我们送到服务器上,在我的机器上怎么运行,在别的机器上也怎么运行,不会有任何的问题。一句话就是docker解决了运行环境不一致所带来的问题。

虚拟机技术与容器虚拟化

虚拟机技术

虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。

虚拟机的缺点:
1.资源占用多;2. 冗余步骤多;3. 启动慢

容器虚拟化技术

由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

docker 思想

集装箱

没有集装箱之前,运输货物零散容易丢失,有了集装箱之后货物不容易丢失,我们可以把货物想象成程序,目前我们要把程序部署到一台新的机器上,程序包含的内容很多,就像是散乱的货物一样,可能会启动不起来,比如少一些配置文件什么的或者少了什么数据,有了docker的集装箱可以保证我们的程序不管运行在哪不会缺东西。

标准化

运输方式

docker运输东西有一个超级码头,任何地方需要货物都由鲸鱼先送到超级码头,然后再由鲸鱼从超级码头把货物送到目的地去。对应的技术来说,比如我们要把台式机的应用部署到笔记本上,我们可能选择用QQ发过去或者用U盘拷过去,docker就标准化了这个过程,我们只需在台式机上执行一个docker命令,把鲸鱼派过来,把程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去。

存储方式

当我们把程序存储到笔记本上时,我们需要一个目录,且我们要记住这个目录,因为下次我们可能还要修改,有了docker之后我们就不用记住了程序在哪里了,我们使用的时候只需要一条命令(commit)就行了。

隔离

我们在使用虚拟机时有自己的cpu,硬盘,内存,完全感觉不到外面主机的存在,docker也差不多,不过它更轻量,我们创建虚拟机可能要几分钟,但是docker只需要一秒,最底层的技术是上文提到的容器虚拟化技术LXC。最大效率的隔离了进程和资源,通过cgroup,namespace等限制,隔离进程组所使用的物理资源,比如CPU,MEMORY等等,这个机制在7,8年前已经加入到linux内核了,直到2013年docker出世的时候才火起来,大家可能奇怪为什么这么好的技术埋没这么多年都没人发现呢?英雄造时势,时势造英雄,如果没有云计算,敏捷开发,高频度的弹性伸缩需求,没有IT行业这么多年长足的发展,也就没有docker。

走进docker

Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
镜像就是上面说的集装箱,仓库就是超级码头,容器就是我们运行程序的地方。docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。

下图是docker执行镜像的流程图
在这里插入图片描述

镜像

鲸鱼拖着的所有集装箱就是一个镜像,从本质上来说镜像就是一系列文件,可以包括我们应用程序的文件,也可以包括我们应用的运行环境的文件,既然是文件,那么是以什么样的格式在本地保存的呢?

说到存储格式,就要提到linux的一个存储技术,叫做联合文件系统,是一种分层的文件系统,可以将不同的目录挂到同一个虚拟文件系统下。

UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

容器

为了便于理解,大家可以把容器想象成虚拟机,每个虚拟机都有自己的文件系统,与虚拟机系统的区别是这里面的文件系统是一层一层的,并且最下面的n层都是只读的,只有上面一层是可写的,为什么要有可写的这层呢?大家的程序运行起来,势必会要写一些日志,写一些文件,或者对系统的某一些文件做一些修改,所以容器在最上面一层创建了可读可写的文件系统。

在程序的运行过程中,如果要写镜像文件时,因为镜像的每一层都是只读的,它会把文件的每一层拷到文件的最上层,然后再对它进行修改,修改之后,当我们的应用读一个文件时会从顶层进行查找,如果没有才会找下一层。

由于容器的最上一层是可以修改的,镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰。

仓库

我们的镜像是要在其它机器上运行,如何进行传输呢?

这就用到了docker仓库,我们要先把我们的镜像传到docker仓库中,再由目的地把docker仓库拉过去,这就完成了这样的一次传输过程。

谁提供了这样的仓库呢?docker自己提供了,hub.docker.com,但是非常慢,为了解决这个问题,国内很多公司也在做自己的仓库。比如阿里云仓库。

docker安装

1.如果安装过请先卸载

yum remove docker \
           docker-client \
           docker-client-latest \
           docker-common \
           docker-latest \
           docker-latest-logrotate \
           docker-logrotate \
           docker-engine

2.安装依赖设置yum仓库

安装依赖:

yum install -y yum-utils device-mapper-persistent-data lvm2

设置仓库:(这里推荐使用国内镜像仓库地址)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.安装docker

yum install docker-ce

4.启动docker

systemctl start docker

docker命令

镜像操作

列出本地主机上的镜像

docker images

搜索镜像

docker search [OPTIONS] 镜像名字

拉取镜像

docker pull 镜像名字[:TAG]

删除镜像

docker rmi  -f 镜像ID

删除多个

docker rmi -f 镜像名1:TAG 镜像名2:TAG 

删除全部

docker rmi -f $(docker images -qa)

容器操作

1.新建并启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=“容器新名字”: 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射。

2.列出当前正在运行的容器

docker ps [OPTIONS]

OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
–no-trunc :不截断输出。

3.退出容器
方式一:容器停止退出

exit

方式二:容器不停止退出
ctrl+P+Q
4.启动容器

docker start 容器ID或者容器名

5.重启容器

docker restart 容器ID或者容器名

6.停止容器

docker stop 容器ID或者容器名

7.强制停止容器

docker kill 容器ID或者容器名

8.删除已停止容器

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

9.启动守护式容器

docker run -d 容器名

10.查看容器日志

docker logs -f -t --tail 容器ID

11.查看容器内运行的进程

docker top 容器ID

12.查看容器内部细节

docker inspect 容器ID

13.进入正在运行的容器并以命令行交互

docker exec -it 容器ID bashShell
#or
docker attach 容器ID

14.从容器内拷贝文件到主机上

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

15.提交容器

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

docker容器数据卷

类似Redis里面的rdb和aof文件,实现docker容器的持久化。

添加数据卷

命令添加

添加命令

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

这样就可以在宿主机和容器内生成文件夹,实现数据的持久化操作。

DockerFile添加

在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。

说明:
出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。(删除前一个挂载数据卷容器不会影响后续)

DockerFile解析

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

构建分为三步骤:
1.编写Dockerfile文件;2.docker build;3.docker run

DockerFile内容基础知识

1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数;
2.指令按照从上到下,顺序执行;
3.#表示注释;
4.每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行Dockerfile的大致流程

1.docker从基础镜像运行一个容器
2.执行一条指令并对容器作出修改
3.执行类似docker commit的操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新容器
5.执行dockerfile中的下一条指令直到所有指令都执行完成

DockerFile体系结构(保留字指令)

1.FROM:基础镜像,当前新镜像是基于哪个镜像的

2.MAINTAINER:镜像维护者的姓名和邮箱地址
3.RUN:容器构建时需要运行的命令
4.EXPOSE:当前容器对外暴露出的端口
5.WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
6.ENV:用来在构建镜像过程中设置环境变量
7.ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
8.COPY:类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
9.VOLUME:容器数据卷,用于数据保存和持久化工作
10.CMD:指定一个容器启动时要运行的命令,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
11.ENTRYPOINT :指定一个容器启动时要运行的命令
12.ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

DockerFile实例

一般安装centos精简版是没有vim和ifconfig命令的支持的,我们可以通过编写Dockerfile令其支持这些功能。

实现步骤:

1.搜索centos镜像并下载

docker search centos
docker pull centos

2.在主机上编写创建一个文件( /mydoker/dockerfile_centos ),编写Dockerfile ,内容如下

--------------------------------------------------------------------
#当前新镜像是基于centos
FROM centos
#作者信息
MAINTAINER 张大炮

#配置环境目录
ENV MYPATH /usr/local
#创建容器后,终端默认登陆的进来工作目录
WORKDIR $MYPATH

#容器构建时运行下载命令
RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "install vim and ifconfig commond plug-in components success"
CMD /bin/bash
-----------------------------------------------------------------------

3.编译运行centos

docker build -f /mydoker/dockerfile_centos -t mycentos:2.6.

4.测试功能

# 查看是否新增镜像
docker ps
# 运行新镜像 
docker run -it mycentos:2.6
# 在容器中使用vim 与if config命令
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值