docker从入门到实战

author author     2022-10-12     591

关键词:

一步一步走,写小白都能看懂的文章,将持续更新中,敬请期待!

Docker从入门到实战(一)

一:容器技术与Docker概念

1 什么是容器

容器技术并不是一个全新的概念,它又称为容器虚拟化。虚拟化技术目前主要有硬件虚拟化、半虚拟化、操作系统虚拟化等。
1.1关于虚拟化
虚拟化技术的分类与定义在不同领域有不同的理解。对于计算机领域,虚拟化技术主要分为两大类:一类基于硬件虚拟化,另一类基于软件虚拟化。硬件虚拟化并不多见,大都是半虚拟化与软件结合,应用较为广泛的则是基于软件的虚拟化技术。
基于软件虚拟化又可分为应用虚拟化(如Wine)和平台虚拟化(如虚拟机),容器技术属于操作系统虚拟化,属于平台虚拟化的一种。
技术分享图片
1.2容器的定义
所谓容器,顾名思义就是来放东西的道具。在刚进入国内时,还有一段时间在讨论Container这个单词翻译为“容器合适”,还是翻译为“集装箱”合适。大可把容器理解为一个沙盒,每个容器是独立的,容器间可以相互通信。

2 容器的前世今生

如果说工业上的集装箱是从一个箱子开始的,那么软件行业的容器则是从文件系统隔离开始的。
2015年微软公司也在Windows Server上为其基于Windows的应用添加了容器支持,称之为Windows Containers,与Windows Server 2016一同发布,通过该实现,Docker可以原生的在Windows上运行Docker容器,而不需要再启动一个虚拟机来运行Docker(Windows上早期运行Docker需要使用Linux虚拟机)。同年,MacOS也原生支持运行Docker容器。

3 容器的原理

容器本质上是宿主机上的进程。容器技术通过namespace实现资源隔离,通过Cgroups(Google公司的Control Groups技术,2007年被合并到Linux2.6.24内核中)实现资源控制,通过rootfs实现文件系统隔离,再加上容器搜索引擎自身的特性来管理容器的生命周期。
3.1认识namespace
在分布式的环境下,容器必须要有独立的IP、端口和路由等,自然就有了网络隔离。同时,进程通信隔离、权限隔离等也要考虑到,因此基本上一个容器需要做到6項基本隔离。
技术分享图片
对namespace的操作主要通过clone(),setns(),unshare()这三个系统调用来完成的。
3.1.1查看当前的namespance
root用户:ls -l /proc/$$/ns
技术分享图片
这里$$指的是当前进程ID号,可以看到4026531839这样的数字,表示当前进程指向的namespace.当两个进程指向同一串数字时,表示他们处于同一个namespace下。
3.1.2使用clone()创建新的namespace
创建一个namespace的方法是使用clone()系统调用,它会创建一个新的进程。为了说明创建的过程,给出clone()的原型如下:
int clone (int(child_func) (void ) , void child_stack, int flags , voidarg) ;
如果调用clone()时设置了一个CLONE_NEW的标志,一个与之对应的新的命名空间将被创建,新的进程属于该命名空间,可以使用多个CLONE_NEW标志的组合。
3.1.3使用一个sents()关联一个已经存在namespace
当一个namespace没有进程时还保持打开,这么做是为了后续添加进程到该namesapce.而添加这个功能就是使用sents()系统调用来完成,这使得调用的进程能够和namespace关联,docker exec 就需要用到这个方法:
int setns (int fd, int nstyps);
fd参数指明了关联的namespace,其指向了procPID s目录系一个符号连接的文件描述符。可以通过发开这些符号链接指向的文件或者打开一个绑定到符号链接的文件来获得文件描述符。
nstype参数运行调用者检查fd指向的命名空间的类型,如果这个参数等于数,将不会检查,当调用者已经知道namespace的类型时这会很有用。当nstype被赋值为CLONE_NEW*的常量时,内核会检查fd指向的namespace的类型。
要把namespace利用起来,还要使用execve()函数(或者其他的exec()函数),使得我们能够构建一个简单但是有用的工具,该函数可以执行用户命令。
3.1.4使用unshare()在已有进程上进行namespace隔离
unshare()和clone()有些像,不同的地方是前者运行在原有进程上,相当于跳出原来namespace操作,Linux自带的unshare()就是通过调用unshare()这个API来实现。
[[email protected]_110_98_centos ~]# unshare --help
Usage:
unshare [options] <program> [<argument>...]

Run a program with some namespaces unshared from the parent.

Options:
-m, --mount unshare mounts namespace
-u, --uts unshare UTS namespace (hostname etc)
-i, --ipc unshare System V IPC namespace
-n, --net unshare network namespace
-p, --pid unshare pid namespace
-U, --user unshare user namespace
-f, --fork fork before launching <program>
--mount-proc[=<dir>] mount proc filesystem first (implies --mount)
-r, --map-root-user map current user to root (implies --user)
--propagation <slave|shared|private|unchanged>
modify mount propagation in mount namespace
-s, --setgroups allow|deny control the setgroups syscall in user namespaces

-h, --help display this help and exit
-V, --version output version information and exit

For more details see unshare(1).
由于docker没有使用这个系统调用,所以不展开。
3.2 认识Cgroups
Cgroups是linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如CPU,内存,I/O等)的机制。最初由Google公司的工程师提出看,后来被整合经linux内核。
这么说理解起来有点吃力,我们通过命令来挂载cgroupfs
提示已经挂载,这个动作一般情况下已经在linux启动的时候做了。
技术分享图片
在主流linux发行版下,都可以通过/etc/cgconfig.conf或者cgroup-bin的相关指令来配置Cgroups。
mount {
cpuset = /sys/fs/cgroup/cpuset;
momory = /sys/fs/cgroup/momory;
}
group cnsworder/test {
perm {
task {
uid = root;
gid = root;
}
admin {
uid = root;
gid = root;
}
}
cpu {
cpu.shares = 1000;
}
}
然后通过命令行把一个进程移动到这个Cgroups之中。
#mount -t group -o cpu cpu /sys/fs/cgroup/cpuset
#cgcreate -g cpu,momory:/cnsworder
#chown root:root /sys/fs/cgroup/cpuset/cnsworder/test/*
#chown root:root /sys/fs/cgroup/cpuset/cnsworder/test/task
#cgrun -g cpu,momory:/cnsworder/test bash
3.3容器的创建
3.3.1系统调用clone()创建新进程,拥有自己的namespace
该进程拥有自己的pid,mount,user,net,ipc和uts namespace。
#pid =clone(fun,stack,flags,clone_arg);
3.3.2将pid写入Cgroup子系统这样就受到Cgroups子系统控制
#echo$pid >/sys/fs/cgroup/cpu/tasks
#echo$pid >/sys/fs/cgroup/cpuset/tasks
#echo$pid >/sys/fs/cgroup/bikio/tasks
#echo$pid >/sys/fs/cgroup/memory/tasks
#echo$pid >/sys/fs/cgroup/devices/tasks
#echo$pid >/sys/fs/cgroup/feezer/tasks
3.3.3通过pivot_root系统调用,使进程进入一个新的rootfs,之后通过exec()系统调用,在新的namespace,Cgroups,rootfs中执行/bin/bash.
fun () {
pivot_root ("path_of_rootfs/", path);
exec ("/bin/bash");
}
通过上面的操作,成功的在一个容器中运行了/bin/bash。

docker容器从入门到实战0826

##docker容器安装和配置####docker的git-hub网站(账号rshare,密rshare520):https://github.com/login#docker官网hub仓库(账号flyer520,密码rhsare520):https://hub.docker.com#docker官网文档和镜像:https://docs.docker.com/samples/centos/#doc 查看详情

docker-9supervisord参考docker从入门到实战

参考docker从入门到实战使用Supervisor来管理进程Docker容器在启动的时候开启单个进程,比如,一个ssh或者apache的daemon服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个... 查看详情

docker从入门到实战

...走,写小白都能看懂的文章,将持续更新中,敬请期待!Docker从入门到实战(一)一:容器技术与Docker概念1什么是容器容器技术并不是一个全新的概念,它又称为容器虚拟化。虚拟化技术目前主要有硬件虚拟化、半虚拟化、操... 查看详情

《oddocker实战》docker从入门到精通

一、安装Dockerhttp://wiki.jikexueyuan.com/project/docker-technology-and-combat/https://mos.meituan.com/library/26/how-to-install-docker-on-centos/二、Docker容器安装CentOShttps://mos.meituan.com/library/26/how-t 查看详情

docker容器从入门到实战0826(笔记整理)

##docker容器安装和配置####docker的git-hub网站(账号rshare,密rshare520):https://github.com/login#docker官网hub仓库(账号flyer520,密码rhsare520):https://hub.docker.com#docker官网文档和镜像:https://docs.docker.com/samples/centos/#doc 查看详情

docker小白从零入门到实战系列

1.安装好Centos72.关闭SELINUXsed-i‘s#SELINUX=enforcing#SELINUX=disabled#g‘/etc/selinux/configsetenforce0getenforce 3.配置阿里云镜像sudomkdir-p/etc/dockersudotee/etc/docker/daemon.json<<-‘EOF‘"registry- 查看详情

docker从入门到实战应用(代码片段)

...作-容器第4章容器的修改及保存第5章容器进阶操作第6章Dockerfile第1章概念什么是沙箱机制#1、沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响。#2、沙箱具有非常... 查看详情

超值一篇分享,docker:从入门到实战过程全记录(代码片段)

...部”设为“星标”,和你一起掌握更多数据库知识和Docker相关的概念想要真正理解Docker,就不得不从虚拟化技术的发展历程说起。普遍认为虚拟化技术经历了物理机时代、虚拟机时代,目前已经进入到了容器化时代。... 查看详情

实战docker入门实战一

Docker是什么Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完... 查看详情

docker小白从零入门实战(代码片段)

...:Centos6.90.查看是否满足安装需求。先检查服务器环境,docker要求操作系统CentOS6以上,kernel版本必须2.6.32-431或更高,即>=CentOS6.5,[[email protected]~]#uname-r2.6.32-696.23.1.el6.x86_64docker的存储驱动是DeviceMapper,看下你的驱动是否符... 查看详情

docker入门实战

基本概念Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上。Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可... 查看详情

超值一篇分享,docker:从入门到实战过程全记录

参考技术A作者|天元浪子来源|CSDN博客想要真正理解Docker,就不得不从虚拟化技术的发展历程说起。普遍认为虚拟化技术经历了物理机时代、虚拟机时代,目前已经进入到了容器化时代。可以说,Docker是虚拟化技术不断发展的必... 查看详情

都9102年了,还不会docker?10分钟带你从入门操作到实战上手(代码片段)

Docker简述Docker是一种OS虚拟化技术,是一个开源的应用容器引擎。它可以让开发者将应用打包到一个可移植的容器中,并且该容器可以运行在几乎所有linux系统中(Windows10目前也原生支持,Win10前需要内置虚拟机),正所谓“一次... 查看详情

对docker了解多少?10分钟带你从入门操作到实战上手

Docker简述Docker是一种OS虚拟化技术,是一个开源的应用容器引擎。它可以让开发者将应用打包到一个可移植的容器中,并且该容器可以运行在几乎所有linux系统中(Windows10目前也原生支持,Win10前需要内置虚拟机),正所谓“一次... 查看详情

docker入门到实战(代码片段)

1、系统要求DockerCE支持64位版本CentOS7,并且要求内核版本不低于3.10。CentOS7满足最低内核的要求,但由于内核版本比较低,部分功能(如overlay2存储层驱动)无法使用,并且部分功能可能不太稳定。2、配置阿里云DockerYum源sudoyumins... 查看详情

从实战开始,零基础docker入门教程

前提本文是基于windows环境下使用docker的学习文章其实我也有很长的一段时期在ubuntu系统下开发,很喜欢linux系统的纯净方便,但是当你身边同事都是使用windows与你交流沟通传输资料的时候,使用linux系统开发倒是一件不方便的事情,... 查看详情

如何从零开始学习openstack

...术A先安装OpenStack的环境,几种方法第一种方法:先安装docker,下载openstack的镜像,关于docker的使用资料Docker资料网上搜索一下,很多,比较容易学习和使用 参考技术B基础 参考技术COpenStack入门到实战视频教程全集下载OpenStack入... 查看详情

docker入门与实战讲解

简述Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的a... 查看详情