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、networksvolumes、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)为无标签的镜像添加标签

image.png

        使用命令:docker tag IMAGEID  REPOSITORY:TAG

image.png

(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

测试结果