目录
引言
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux操作系统的机器上,也可以实现虚拟化。
一、Docker概述
1、Docker的介绍
(1)Docker是一种轻量级的“虚拟机”,是一个开源的应用容器引擎。容器是完全使用沙箱机制,相互之间不会有任何接口。
(2)轻量级表示它体积小、灵活;而说它是虚拟机,又不是真正的虚拟机,因为它里面没有系统;开源表示它是免费的。
(3)Docker是基于容器技术的轻量级虚拟化解决方案。
(4)Docker是容器技术,把Linux的cgroup(资源限制)、namespaces(资源隔离)等容器底层技术进行完美的封装,并抽象为用户提供创建和管理容器的便捷界面(命令型cli、api等)。
2、Docker与虚拟机的区别
区别方面 | Docker | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
运行速度 | 接近原生(直接在内核中运行) | 50%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
3、6个名称空间
序号 | 空间名称 | 含义 |
1 | mount | 文件系统,挂载点(一个文件系统内,不能重复挂载一个指定目录) |
2 | user | 操作进程的用户和用户组 |
3 | pid | 进程编号 |
4 | uts | 主机名和主机域 |
5 | ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
6 | net | 网路设备、网络协议栈、端口等 |
(1)Docker把容器化技术做成了标准化平台CAAS(docker统一/指定了容器化技术的标准化平台);
(2)Docker引擎统一了基础设施环境:docker环境→image→封装一个简易的操作系统;
(3)Docker引擎统一了程序打包(装箱/封装:类比于集装箱)方式:docker镜像→images;
(4)Docker引擎统一了程序部署(运行)方式:docker容器→基于镜像→运行为容器(可运行的环境);
(5)Docker实现了一次构建、多次、多次使用。
4、使用场景
(1)对应用的打包与部署自动化;
(2)创建轻量、私密的PAAS环境;
(3)实现自动化测试和持续的集成/部署;
(4)部署与扩展webapp、数据库和后台服务。
5、Docker的核心概念
(1)镜像(模板)
(2)容器(基于镜像,运行状态/运行时状态)
(3)仓库(存放镜像模板的地方)
①公有仓库:Docker官方仓库
②私有仓库:个人化、私有化的仓库
小结:Docker是容器管理工具,容器由镜像创建而来,镜像从仓库中获取而来,仓库分为公有、私有。
6、Docker引擎(Docker Engine)
Docker Engine是具有以下主要组件的C/S(客户端/服务端)应用程序:
(1)Client端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口;
(2)Server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)。
二、安装Docker
1、安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
#注释:
①yum-utils提供了yum-config-manager。
②device mapper存储驱动程序需要device-mapper-persistent-data和lvm2。
③device mapper 是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
2、设置阿里云镜像源
cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装Docker-CE社区版
yum install -y docker-ce
4、环境配置
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
5、重启docker和开机自启动docker
systemctl start docker.service
systemctl enable docker.service
6、设置镜像加速
(1)配置阿里云镜像加速,不然下载速度很慢,加速地址从自己的阿里云上获取,阿里云官网:https://account.aliyun.com/,获取方式:登录阿里云→控制台→在上面搜索容器镜像服务→左下角的镜像加速器,在此页面中显示阿里云的镜像加速地址和配置方法。
(2)重新加载服务配置文件和重启docker服务
systemctl daemon-reload
systemctl restart docker
vim /etc/docker/daemon.json #容器网络生产经验
{
"graph": "/data/docker", #数据目录
"storage-driver": "overlay2", #存储引擎:LXC→overlay→overlay2(存储驱动/引擎)
"insecure-registries": ["registry.access.redhat.com","quary.io"] #私有仓库
"registry-mirrors": ["https://cvzmdwsp.mirror.aliyuncs.com"] #镜像加速
"bip": "172.32.11.1/24", #docker网络
"exec-opts": ["native.cgroupdriver=systemd"], #启动时候的额外参数(驱动,k8s使用)
"live-restore":true #当docker容器引擎挂掉的时候,使用docker抱起来的容器还能运行(分类)
}
7、网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
service network restart
systemctl restart docker
8、查看docker版本信息
docker -v
docker version
docker info
9、docker镜像操作
docker run hello-world
run:
(1)pull dockerhub 仓库中 项目/库/镜像
(2)start hello-world-image
命令详解:
The Docker client contacted the Docker daemon. dockerclient
客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restfulapi典型的C/s架构
The Docker daemon pulled the “hello-world” image from the Docker Hub.(amd64)
由docker服务端的守护进程从docker hub上下载了镜像(服务端会先检查本地系统是否有此镜像)
The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
服务端创建了一个新的容器,然后从拉取的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
docker服务端把这些信息流(传递)返回到客户端并展示出来,( 展示在终端上),docker client 可以是多种形式,比如"docker"命令工具所在的终端
三、镜像的操作
1、查找指定的镜像
docker search 服务名
例如:
docker search nginx
2、下载镜像(默认是从docker hub)
docker pull 服务名
例如:
docker pull nginx
3、查看镜像列表及镜像信息
docker images
docker inspect 镜像的ID
例如
docker images
docker inspect ea335eea17ab
4、添加新标签(打标签)
docker tag 仓库名:原镜像名 仓库名:新镜像名
例如:
docker tag nginx:latest nginx:test
docker images
docker images | grep nginx
5、删除镜像
指定镜像ID删除的时候,要求不能有该镜像不能有标签
docker rmi 镜像的ID
docker rmi 仓库名:镜像名
例如:
docker rmi f6d0b4767a6c
docker images
docker rmi nginx:test
docker images
6、将镜像存储到本机上
docker save -o 存放镜像的位置 仓库名:镜像名
例如:
docker save -o /opt/nginx_latest nginx:latest
7、载入镜像
方法①:
docker load < 本地导出的镜像名
例如:
docker load < nginx_latest
方法②:
docker --input 本地导出的镜像名
例如:
docker load --input nginx_latest
四、容器的操作
1、查看容器运行状态
Up是正在运行的;Exited (0)是正常停止的容器;Exited (非0)异常停止的容器
docker ps #查看运行中的容器
docker ps -a #加-a 列出所有的容器,包括未运行的容器
2、创建容器
docker create [选项] 镜像运行的程序
-i:让容器的标准输入保持打开
-t:让Docker分配一个伪终端
例如:
docker create -it nginx:latest /bin/bash
3、启动、停止、重启容器
docker start 容器ID:启动一个或多个已经被停止的容器
docker stop 容器ID:停止一个运行中的容器
docker restart 容器ID:重启容器
例:
docker start a70bb6d2e1f4
docker ps -a
docker stop a70bb6d2e1f4
docker ps -a
docker restart a70bb6d2e1f4
4、运行容器
run和start的作用有些类似,准确来说run相当于create+start;一般第一次可以使用run,后面维护还是使用start/stop/restart。
docker run [选项] 镜像 [命令] [变量]
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-c 命令表示后面的参数将会作为字符串读入作为执行的命令
-v: 绑定一个卷
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name="名称": 为容器指定一个名称
--link name:alias 添加链接到另一个容器,格式“--link容器名:别名”
例如:
docker run nginx
docker run -d nginx
docker run -d nginx /bin/bash -c "ls"
5、进入、退出容器
进入的容器状态一定要是运行状态
docker exec [选项] 容器 命令
例:
docker exec -it a423c94bbd28 /bin/bash
docker exec -it ce8f6b5f68928 /bin/bash
exit #退出容器
6、容器导出、导入
#容器导出
docker export 容器ID > 备份文件名
#容器导入(会生成镜像,而不会创建容器)
cat 备份文件名 | docker import - 仓库名:镜像名
例如:
docker export ce8f6b5f68928 > nginx_up
docker export a423c94bbd28 > nginx_exited
cat nginx_up | docker import - nginx:web
7、删除容器
docker rm 容器ID
例如:
docker rm 37c3ab65fbcd
docker rm -f 37c3ab65fbcd(在运行的情况下可以加-f强制删除)
#批量删除容器
docker ps -a | awk '{print "docker rm "$1}' | bash
总结
1、Docker的空间名称:mount、user、pif、uts、ipc、net
2、Docker的核心概念:镜像、容器、仓库
3、镜像的操作①查找指定的镜像:docker search 服务名;②下载镜像:docker pull 服务名;③查看镜像列表及镜像信息:docker inspect 镜像的ID;④添加新标签:docker tag 仓库名:原镜像名 仓库名:新镜像名;⑤删除镜像:docker rmi 镜像的ID/docker rmi 仓库名:镜像名;⑥将镜像存储到本机上:docker save -o 存放镜像的位置 仓库名:镜像名;⑦载入镜像:docker load < 本地导出的镜像名/docker --input 本地导出的镜像名
4、容器的操作①查看容器运行状态:docker ps -a;②创建容器:docker create [选项] 镜像运行的程序;③启动、停止、重启容器:docker start 容器ID:启动一个或多个已经被停止的容器/docker stop 容器ID:停止一个运行中的容器/docker restart 容器ID:重启容器;④运行容器:docker run [选项] 镜像 [命令] [变量];⑤进入、退出容器:docker exec [选项] 容器 命令;⑥容器导出、导入:docker export 容器ID > 备份文件名/docker import - 仓库名:镜像名;⑦删除容器:docker rm 容器ID