1.docker与常用命令

目录

  1. 什么是容器
  2. 为什么需要容器
  3. Docker组成
  4. Docker镜像仓库、镜像命令、Dockerfile编写
  5. Docker容器命令

一、什么是容器

容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
在这里插入图片描述
Docker其实是容器化技术的具体技术实现之一,采用go语言开发。很多朋友刚接触Docker时,认为它就是一种更轻量级的虚拟机,这种认识其实是错误的,Docker和虚拟机有本质的区别。容器本质上讲就是运行在操作系统上的一个进程,只不过加入了对资源的隔离和限制。而Docker是基于容器的这个设计思想,基于Linux Container技术实现的核心管理引擎。

为什么资源的隔离和限制在云时代更加重要?在默认情况下,一个操作系统里所有运行的进程共享CPU和内存资源,如果程序设计不当,最极端的情况,某进程出现死循环可能会耗尽CPU资源,或者由于内存泄漏消耗掉大部分系统资源,这在企业级产品场景下是不可接受的,所以进程的资源隔离技术是非常必要的。

我当初刚接触Docker时,以为这是一项新的技术发明,后来才知道,Linux操作系统本身从操作系统层面就支持虚拟化技术,叫做Linux container,也就是大家到处能看到的LXC的全称。

Docker技术三大要点:

cgroup:

CGroups 全称control group,用来限定一个进程的资源使用,由Linux 内核支持,可以限制和隔离Linux进程组 (process groups) 所使用的物理资源 ,比如cpu,内存,磁盘和网络IO,是Linux container技术的物理基础。

namespace:

另一个维度的资源隔离技术,大家可以把这个概念和我们熟悉的C++和Java里的namespace相对照。

如果CGroup设计出来的目的是为了隔离上面描述的物理资源,那么namespace则用来隔离PID(进程ID),IPC,Network等系统资源。

在这里插入图片描述
我们现在可以将它们分配给特定的Namespace,每个Namespace里面的资源对其他Namespace都是透明的。

不同container内的进程属于不同的Namespace,彼此透明,互不干扰。

我们用一个例子来理解namespace的必要。

假设多个用户购买了一台Linux服务器的Nginx服务,每个用户在该服务器上被分配了一个Linux系统的账号。我们希望每个用户只能访问分配给其的文件夹,这当然可以通过Linux文件系统本身的权限控制来实现,即一个用户只能访问属于他本身的那些文件夹。

但是有些操作仍然需要系统级别的权限,比如root,但我们肯定不可能给每个用户都分配root权限。因此我们就可以使用namespace技术:

我们能够为UID = n的用户,虚拟化一个namespace出来,在这个namespace里面,该用户具备root权限,但是在宿主机上,该UID =n的用户还是一个普通用户,也感知不到自己其实不是一个真的root用户这件事。

同样的方式可以通过namespace虚拟化进程树。

在每一个namespace内部,每一个用户都拥有一个属于自己的init进程,pid = 1,对于该用户来说,仿佛他独占一台物理的Linux服务器。

对于每一个命名空间,从用户看起来,应该像一台单独的Linux计算机一样,有自己的init进程(PID为1),其他进程的PID依次递增,A和B空间都有PID为1的init进程,子容器的进程映射到父容器的进程上,父容器可以知道每一个子容器的运行状态,而子容器与子容器之间是隔离的。从图中我们可以看到,进程3在父命名空间里面PID 为3,但是在子命名空间内,他就是1.也就是说用户从子命名空间 A 内看进程3就像 init 进程一样,以为这个进程是自己的初始化进程,但是从整个 host 来看,他其实只是3号进程虚拟化出来的一个空间而已。

看下面的图加深理解。

父容器有两个子容器,父容器的命名空间里有两个进程,id分别为3和4, 映射到两个子命名空间后,分别成为其init进程,这样命名空间A和B的用户都认为自己独占整台服务器。

unionFS:

分层
在这里插入图片描述

UnionFS是一种文件系统,它允许将多个目录组合成一个逻辑目录,该逻辑目录包含这些目录中的所有内容,并对外提供一个统一的视图。

举个例子,假设我们需要更新一块CD-ROM中的内容,但是CD-ROM是不可写的,这个时候可以将CD-ROM与另一个可写目录挂载成UnionFS。当我们更新文件的时候,内容会被写入可写的目录,就好像CD-ROM中的内容被更新了一样。

容器镜像(image)提供了一个描述容器的“静态视图”,镜像中包含了容器运行所依赖的各种文件。我们可以在运行的容器中修改这些文件而不会影响到镜像本身。这是因为容器内目录与镜像目录联合成了一个UnionFS,从容器的视角来看,镜像就好比CD-ROM(不可写),容器对目录的修改仅会写入容器自身的目录,并不会影响到镜像中的内容。

镜像是由许多仅可读的层组成的,当你使用该镜像创建一个容器时,一个可写层会被加到镜像的可读层之上,容器内所有文件的变化都会保存在这个可写层。

二、为什么要用容器

优点:

  • 安装应用、搭建环境,都十分的方便灵活
  • 节省资源开销,没有系统层面依赖,只包含应用
  • 灵活的迁移你开发的应用程序

容器 VS 虚拟机

在这里插入图片描述

三、Docker组成

  • client:客户端
  • daemon:守护进程
  • container:容器
  • images:镜像
  • registry :镜像仓库

[外链图片转存失败(img-YdoWyMrl-1565776567236)(/tfl/captures/2019-08/tapd_22299211_base64_1565072934_17.png)]

四、镜像

镜像仓库:

  • 公有镜像仓库:docker官方镜像仓库
  • 私有镜像仓库:harbor

镜像命令

  • 拉镜像:docker pull centos:7
  • 推镜像:docker push harbor.xxx.com/library/centos:7
  • 查找镜像:docker search tomcat
  • 打标签:docker tag nginx harbor.xxx.com/library/nginx:1.14
  • 构建镜像:docker buil -t -f Dockerfile文件名 构建的镜像名 .
  • 查看本地所有镜像:docker images
  • 删除本地镜像:docker rmi 镜像名
  • 登录镜像仓库:docker login harbor.xxx.com –u Lily –p Lily1234
  • 退出登录:docker logout harbor.xxx.com

Dockerfile编写

dockerfile用于构建自定义镜像,更多关于dockerfile编写规范以及对应意义,可直接百度

FROM harbor.xxx.com/library/centos:7

ENV JAVA_HOME=/usr/local/jdk
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$PATH:$JAVA_HOME/bin

RUN mkdir /apps &&
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ADD springboot /apps/springboot

ENV PATH $PATH:/apps/springboot/bin
WORKDIR /apps/springboot
EXPOSE 8080
CMD [“startup.sh”]

五、容器命令

  • 创建容器:docker run --name box -d busybox /bin/sh -c “while true;do echo hello world;sleep 1;done”
  • 进入容器:docker exec –it busybox /bin/sh
  • 查看所有容器:docker ps
  • 查看最新创建的容器:docker ps –l
  • 查看所有容器,包括未能成功运行的:docker ps –a
  • 启动/停止/重启:docker start/stop/restart 容器名
  • 删除一个停止的容器:docker rm 容器名
  • 删除一个运行的容器:docker rm -f 容器名
  • 查看日志:docker logs –f 容器名
  • 查看容器信息(用于排错等):docker inspect 容器名
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值