docker容器初探—基本概念和基础命令用法
-------------------------------------------------------------------------------------------------------------------------------------------
一、基本概念
1、LXC:Linux Container,针对于Linux内核容器功能的用户空间接口,docker刚问世时基于LXC之上,后期发展摒弃了LXC,lxc -> libcontainer -> runC
2、docker:也是基于c/s架构
容器基于镜像启动,如果本地没有,docker会去ftp仓库拉取镜像到本地
基于自己开发的libcontainer
3、Cgroups和namespace是docker的核心技术
(1)docker的kernel namespace(内核名称空间)六个重要元素:ipc uts mount pid network user
(2)Cgroups:control groups
blkio:块设备IO
cpu CPU
cpuacct CPU资源使用报告
cpuset 多处理器平台上的CPU集合
devices 设备访问
freezer 挂起或恢复任务
memory 内存用量及报告
perf_event 对cgroup中的任务进行统一性能测试
net_cls cgroup中的任务创建的数据报文的类别标识符
OCI:Open Container Initiative,旨在围绕容器格式和运行时制定一个开放的工业化标准
4、镜像是分层构建的
docker image的使用
联合挂载:上3层都可以看到底层的/var/log,假设当第二层执行rm /tmp/a.txt后,上3层看不到/tmp/a.txt,但底层的/tmp/a.txt依然在。最上一层为可写层(其它层只读),平时修改操作都在可写层进行,所以修改完成后底层镜像没有变动,变动的只是可写层
5、docker怎样运行的
aufs:advanced multi-layered unification filesystem:高级多层统一文件系统,用于为Linux文件系统实现联合挂载
overlayfs:aufs的竞争产品,自从3.18版本被合并到Linux内核,也就是说CentOS7内核版本3.10未打补丁是不支持的,用的还是devicemapper,虽说redhat给内核打了补丁,不过支持度肯定还是远不如Ubuntu默认的aufs
6、特点:
(1)基于一个镜像,可以启动多个容器,供多个容器之间共享使用
(2)正常情况下一个docker容器只允许运行一个进程和其子进程,否则容器还需要一个进程管理器
7、docker的对象
image、contain、networks、volumes、plugins、other object
8、docker的registry仓库可分为:其中的镜像名的引用类似于httpd:v2.4.32,引用2.4.32版本的httpd
Docker Hub
gcr.io
quay.io
dev.aliyun.com
个人建立高可用仓库
registry分类
sponsor registry
mirror registry
vendor registry
private registry
二、docker的安装
1、docker的社区版:moby,也称作docker-ce
阿里云镜像站的docker-ce下,建议使用较新版本,k8s只支持到docker的17.03版
下载docker-ce.repo文件到yum源文件,yum -y install docker-ce
将此文件移动到/etc/yum.repos.d/目录下
yum -y install docker-ce
注意:安装过程中出现以下界面,请填写一个epel源,之后重装container-selinux
复制以下代码到/etc/yum.repos.d/目录下新建的repo文件
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
2、安装成功后,需要修改几个地方
(1)编辑/usr/lib/systemd/system/docker.service
(2)设置加速连接
登录阿里云账号,之后转入cr.console.aliyun.com,开通,界面如下
写入
(3)开启docker需要/proc/sysnet/brige/bridge-nf-call-iptables和/proc/sysnet/brige/bridge-nf-call-ip6tables为1,常保存需要vim /etc/sysctl.d/docker.conf,写入net.bridge.bridge-nf-call-iptables = 1和
net.bridge.bridge-nf-call-ip6tables = 1
完成后systemctl daemon-reload;systemctl restart docker
三、docker官方镜像网站
https://hub.docker.com
四、docker基础命令
1、docker search :搜索镜像
2、docker image pull alpine:从仓库向本地拖镜像,不用标签默认用最新版alpine
alpine有版本:
安装效果
3、docker image ls:查看镜像信息
docker imager ls -a
4、docker image inspect alpine:显示镜像详细信息
5、docker image rm alpine:3.8,删除alpine3.8镜像
6、添加标签
(1)为无标签的镜像添加标签
使用命令:docker tag IMAGEID REPOSITORY:TAG
(2)为有标签的镜像添加标签
docker image tag httpd:2.4.37-alpine httpd:2.4,给标签为2.4.37-alpine的httpd镜像增加标签httpd:2.4
docker image tag httpd:2.4.37-alpine chenux/httpd:2.4
docker image tag httpd:2.4.37-alpine reg.chenux.com:8443/chenux/httpd:2.4,只有这么打上主机标签才会认为是自己的docker库,否则系统会认为是官方的docker库
有原镜像
添加镜像tag,docker image tag httpd:2.4.37-alpine httpd:2.4,docker image tag busybox:1.29 chenux/busybox:2.4
docker image tag httpd:2.4.37-alpine reg.chenux.com:8443/chenux/httpd:2.4
注:一个镜像可以有多个tag标签,但一个tag标签只能有一个镜像
7、docker container run --name alpine1 -it alpine:3.8
新建一个容器,名字叫alpine1,并启动打开其交互界面
docker container run -d --name alpine1 alpine:3.8
启动一个容器,名字叫alpine1,以守护进程方式后台运行
另起一个终端
注:这里httpd可以后台运行是因为镜像里CMD中有个httpd-foreground前台运行,所以此时-d剥离后依然存在,而alpine镜像由于没有前台运行的指令,所以此法创建出后是退出状态
docker container run --name alpine1 -it alpine:3.8 --rm alpine
启动一个容器,名字叫alpine1,打开其交互界面,停止后删除该容器
启动状态时存在httpd2
停止后
8、docker container ls,查看docker容器状态信息
docker container ls -a
9、docker container start httpd1,启动一个关闭的容器
显示前有container状态
启动docker container start httpd1
docker container start -i doc7
启动doc7容器并进入交互界面
10、docker container attach doc7,进入一个已经running的容器
ctrl+p后ctrl+q,针对docker attach的退出容器而不关闭
注:该方式进入容器后如果输入exit会停止该容器进程
11、docker ps:doc列出后台运行的容器
docker ps -a
12、docker logs:用来获取和显示docker控制台的日志
13、docker container exec,非交互式突破容器外壳进入容器内部执行命令
docker exec alpine1 ifconfig
docker exec web1 -it /bin/bash, 交互式突破容器外壳进入容器内部执行命令,这种进入exit后容器进程不会结束
14、docker top web1,对web1的容器查看内部运行状态
15、docker container stats,获取当前所有容器cpu、内存、网络io、磁盘io的消耗
16、docker container pause,暂停容器
docker container unpause ,继续运行暂停的容器
docker rm web1,删除web1容器
四、docker状态转换结构图
docker kill类似于virsh中的destroy,一般情况不建议使用,除非docker在使用中遇到了错误
OOM:out of memory,非计划内终止,容器所在的宿主机内存资源耗尽,此时系统会自动杀死占用内存最大的由docker内的服务进程,此时需要定制策略,看此服务进程是重启还是进入stopped状态
五、制作docker镜像
因为docker的镜像采用是联合挂载,因此对镜像的修改制作,实质上是对镜像最上层可写层进行写操作保存,对底层镜像并没有修改
1、下载原镜像
docker image pull busybox
docker container run --name b1 -it busybox
2、进行修改,比如安装包之类
docker commit,用于该容器可写层写的数据保存为一个镜像层
docker commit doc7,保doc7这个容器可写层
3、新的镜像没有名字和标签,所以需要添加
docker image tag IMAGEID mycentos:7
4、如果有需求,还可以继续使用docker commit -c 命令修改需要镜像的指令的内部
docker commit -a "chenux" -c 'CMD ["/usr/sbin/httpd","-DFOREGROUND"]' -p centos-base1 centos-httpd:v0.2-2.4
-a,添加作者
-c,修改CMD中指令
-p,修改过程中容器暂停
修改centos-base1镜像,添加作者信息chenux,由CMD中的/bin/bash命令改为了/usr/sbin/httpd,-DFOREGROUND,创建过程中暂停容器,新镜像名字叫centos-httpd:v0.2-2.4
镜像信息中containerconfig中的CMD
示例
修改结果
六、使用registry推送镜像
1、阿里云创建镜像仓库
2、建立仓库信息
3、选择本地仓库
4、创建好后点击管理
5、推送时镜像标签需要和服务器保持一致,阿里云提示的操作指南会有
(1)登录仓库
(2)添加标签
(3)推送
完成后
仓库也有了
推送完成后,docker logout
七、分发镜像
docker image save IMAGE-ID -o /DIR/*.tar
scp
docker image load -i /DIR/*.tar
测试结果