目录
一、认识容器
1.1、docker用到的内核技术
1.2、namespace
1.3、Control Group
1.4、LXC与docker区别
二、docker环境准备
2.1、安装docker
2.2、docker daemon环境管理
三、镜像、容器和仓库
3.1、镜像常见操作
3.2、配置镜像加速器 命名空间
3.3、非官方镜像仓库
四、用harbor搭建企业级镜像仓库
4.1、harbor
4.2、安装harbor
五、容器常见操作
运行容器并交互式操作
提交镜像docker commit
批量删除所有容器
一、认识容器
k8s是船舵 引领 docker
大型机-小型机-PC服务器-虚拟化-云计算-容器
linux容器技术是一种轻量级的虚拟化技术。
主要特点有:
1、轻量:只打包了需要的bins/libs(也就是命令和库文件),与宿主机共享操作系统,直接使用宿主机的内核。
2、部署快:容器的镜像相对于虚拟机的镜像更小,部署更快,秒级部署。
3、移植性好:一次构建,随处部署运行。
4、资源利用率更高:相对于虚拟机,不需要安装操作系统,所以几乎没有额外的cpu和内存消耗
1.1、docker用到的内核技术
docker就是目前最火热的能实现容器技术的软件,使用go(golang)语言开发。
一共是三个版本:docker(2017年之前的老版本不建议使用)、docker-ce和docker-ee
参考:https://www.docker.com/
docker容器本质上是宿主机的进程,可以把docker容器内部跑的进程看作是宿主机的线程
Docker通过namespace(命名空间)资源隔离
通过cgroups实现了资源限制
1.2、namespace
Linux内核实现namespace的一个主要目的就是实现轻量级虚拟化(容器)服务。在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知。
Linux在很早的版本中就实现了部分的namespace,比如内核2.4就实现了mount namespace。大多数的namespace支持是在内核2.6中完成的,比如IPC、Network、PID、和UTS。还有个别的namespace比较特殊,比如User,从内核2.6就开始实现了,但在内核3.8中才宣布完成。
同时,随着Linux自身的发展以及容器技术持续发展带来的需求,也会有新的 namespace被支持,比如在内核4.6中就添加了Cgroup namespace。
Linux内核提拱了6种namespace隔离的系统调用,相当于目录
IPC:每个容器依旧使用linux内核中进程交互的方法,实现进程间通信
PID:每个容器都拥有独立的进程树,而容器是物理机中的一个进程,所以容器中的进程是物理机的线程
Net:每个容器的网络是隔离Mount:每个容器的文件系统是独立的
User:每个容器的用户和组ID是隔离,每个容器都拥有root用户
小结:应用程序运行在一个隔离的空间(namespace)内,每个隔离的空间都拥有独立的UTS,IPC,PID,Net,Mount,User.
1.3、Control Group
控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免多个容器同时运行时对宿主机系统的资源竞争。控制组可以提供对容器的内存、CPU、磁盘IO等资源进行限制和计费管理。
1.4、LXC与docker区别
LXC为Linux Container的简写。可以提供轻量级的虚拟化.
Docker的底层就是使用了LXC来实现的. dockerl以LXC为基础,实现了更多更强的功能。
二、docker环境准备
建议直接在宿主机上跑docker(当然也可以在虚拟机里跑docker)
不能直接接在windows上跑docker(因为namespace,cgroup是linux内核的特性,windows没有,所以需要在windows跑linux虚拟机,再跑docker)
1.要求能访问公网
2.关闭防火墙,selinux
2.1、安装docker
下载docker官网的镜像源或者阿里云的源 wget
yum clean all
yum install docker-ce -y
docker version 可以查看客户端和服务端
2.2、docker daemon环境管理
可以将客户端和服务端进行分离实现远程docker连接,必须对docker daemon进行相应配置才能实现。配置完成需要重载 docker daemon -reload
远程客户端# docker -H 容器宿主机IP version(远程连接客户端)
三、镜像、容器和仓库
镜像(image):镜像就是打包好的环境与应用
容器 (container):容器就是运行镜像的实例,镜像是静态的,容器是动态的
仓库(repository):存放多个镜像的一个仓库
docker host 就是运行docker的宿主机
3.1、镜像常见操作
镜像分为两类:
1、操作系统类 (centos/ubuntu) 2、应用程序类
docker search 镜像名称
可以查看所有镜像,official(官方的仓库)
docker pull 镜像名称 拉取镜像
使用docker load < 重定向导入之前保存好的镜像
docker save 镜像名称 -o 镜像存放目录 (意思就是测试一下先save保存到其他文件夹之后rmi删除,然后从其他文件夹导入镜像,也能理解成恢复备份)
3.2、配置镜像加速器 命名空间
vim /etc/docker/daemon.json
在docker守护进程的json文件中配置阿里镜像源或者其他的国内源加速
注意:配置文档可能重复创建/etc/docker目录
3.3、非官方镜像仓库
首先第一步就是和docke hub官方仓库一样 登录 docker login (非官方仓库必须加地址)
退出仓库 docker logout 需要退出的仓库地址,默认是docker hub
例如阿里云:
在阿里云镜像仓库先创建命名空间之后创建镜像名称
注意:上传镜像必须打标签才能上传
四、用harbor搭建企业级镜像仓库
4.1、harbor
Harbor是VMware公司开源了企业级Registry项目,可以帮助用户快速搭建一个企业级的Docker registry服务.
harbor由python语言开发,需要使用docker-compose工具进行启动
需要的工具:
使用epel源安装pip,使用pip安装docker-compose
安装完成docker-compose之后检查一下是否拥有可执行权限
查看服务器架构:加上 可执行符合 单引号即可执行查看(常用于写shell)
4.2、安装harbor
建议使用离线包安装
下载地址: https://github.com/goharbor/harbor/releases
千篇一律地把安装包上传到服务器之后tar xf 解压,然后进入/usr/local/harbor/
修改配置文件 vim harbor.cfg 主要就是hostname是主机名,admin用户的登录密码默认了,直接./install.sh 安装即可
在docker宿主机配置daemon.json文件
因为docker用https通讯,所以还需要做证书,太麻烦。
配置"insecure-registries": ["harbor服务器IP"]来使用http通讯
tag给镜像打标签之后才能push上传,上传又发现docker是用https协议通讯所以必须修改daemon.json文件
如果不先docker login 登录harbor服务器就无法push推送
五、容器常见操作
把容器比喻为轻量级虚拟机,但是容器实际上只是进程。进程运行完了当然就退出了,除非是类似服务那样的守护进程。
docker运行一个不间断的脚本,-d表示后台运行(后台运行表示不输出结果到屏幕)
例如容器ip等信息
运行容器并交互式操作
如果是简单的run运行容器不进行交互,容器不是持续运行的进程所以不会在后台运行,加上-d也不会,在容器中写一个循环持续运行才能
交互式运行容器命令:-it 直接运行并进入容器,exit能退出容器但是后台运行的进程也退出了
交互式容器退出之后如何查看或修改之前在容器里创建的文件?
容器进程退出之后可以使用docker start 容器id 启动,先使用docker ps -l 查看退出的容器信息
主要区别在于它们如何与容器交互以及它们所启动的进程类型。
-
Docker attach(只能连接up状态的容器):
- 使用 `docker attach` 可以将当前控制台连接到一个正在运行的容器中。
- 它允许用户执行命令并在容器内部查看输出。
- 如果从连接的终端退出,容器也将被终止。
- Docker exec:
- 用户可以使用 `-D` 参数让命令在后台运行,而不占用终端。
- 它会在容器中启动一个新的进程(终端),并执行指定的命令,这样就不会中断容器的其他活动。
- `docker exec` 用于在运行的容器中执行命令,而不是直接在容器的当前进程上启动新的终端。
提交镜像docker commit
批量删除所有容器
一次性删除大量测试容器必须先停止docker stop $(docker ps -qa)才能删除docker rm $(docker ps -qa) rmi是删除镜像
需要注意的是交互式启动容器之后如果该容器中没有运行可持续的进程则容器不会是up状态