一.Docker概述
1.1Docker是什么
- Docker是一种开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源,可以轻松的为任何应用创建一个轻量级、可移植的、自给自足的容器。
- Docker可以安全地在开发者的PC上运行应用程序,在云中部署应用程序,在服务器上分发应用程序。
1.2Docker的设计理念
- Docker 的 Logo 设计为蓝色鲸鱼,拖着许多集装箱。鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
- Docker 的设计宗旨:Build,Ship and Run Any APP,Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的一次封装,导出运行的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
1.3Docker的优点
- 灵活:即使是最复杂的应用也可以集装箱化
- 轻量级:容器利用并共享主机内核
- 可互换:可以即时部署更新和升级
- 便携式:可以再本地构建,部署到云,并在任何地方运行
- 可扩展:可以增加并自动分发容器副本
- 可堆叠:可以垂直和即时堆叠服务
①轻便高效:Docker使用轻量级的沙盒(sandbox)技术,可以快速的将应用程序和依赖的资源打包在一起,极大的提高了应用程序的部署和迁移的效率。 ②安全可靠:Docker容器是独立的、封闭的、可控的环境,可以有效的防止恶意攻击,提高系统的安全性。 ③可移植性:Docker提供了统一的接口,可以跨不同的系统环境快速部署应用程序,减少了开发、测试和部署的时间和成本。 ④便捷灵活:Docker容器可以按需分配资源,便于快速的扩展和伸缩,可以满足不同的业务需求。
1.4Docker容器和虚拟机的区别
特性 |
Docker容器 |
虚拟机 |
启动速度 |
秒级 |
分钟级 |
计算能力损耗 |
几乎无 |
50%左右 |
性能 |
接近原生 |
弱于 |
系统支持量(单机) |
上千个 |
几十个 |
隔离性 |
资源隔离/限制 |
完全隔离 |
1.5容器在内核中支持2种重要技术
- docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。
1.6namespace的6项隔离
namespace | 系统调用参数 | 隔离内容 |
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网络设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
UDER | CLONE_NEWUSER | 用户和组(3.8以后的内核才支持) |
1.7控制组(Control Groups)
①控制组是Linux内核中用来限制、控制进程资源使用的一种机制,是docker容器技术的基础。它可以控制容器中进程的CPU、内存、磁盘I/O、网络等资源的使用,从而达到资源的共享和隔离的目的。
②同时,Cgroups还可以控制和监控容器中的进程,实现容器对进程的管理,以及查看容器中进程的资源使用情况。
- 六种名称空间是由cgroups管理的
- 最后一种centos的cgroups管理版本是3.8版本,3.6和3.5用不了
- cgroups 管理linux内核态中资源管理的模块
- cgroups 管理一些系统资源
- 不是docker原生的。
1.8Docker的三个核心概念
① 镜像
- Docker 的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
- 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间、库、环境变量和配置文件。
- Docker 镜像也是一个压缩包,只是这个压缩包不只是可执行文件,环境部署脚本,它还包含了完整的操作系统。因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远程一样的环境,这也是 Docker 镜像的精髓。
② 容器
- Docker 的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
- 可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、镜像空间、用户空间和网络空间等)和运行在其他的应用程序。
③ 仓库
- Docker 仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用 push 命令将它上传到公有仓库或者私有仓库。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
- Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。
二.docker安装
- 目前 Docker 只能支持 64 位系统。
2.1安装docke
#环境配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0 #安装依赖包 yum -y install yum-utils device-mapper-persistemt-data lvm2 #设置阿里云镜像源 cd /etc/yum.repos.d/ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装 docker-ce 社区版(企业版叫 docker-ee,收费) yum -y install docker-ce #启动 systemctl enable docker && systemctl start docker
2.2配置镜像加速(阿里云)
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://mzljujtf.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
2.3网络优化
cat >> /etc/sysctl.conf <<EOF net.ipv4.ip_forward=1 EOF sysctl -p systemctl restart network systemctl restart docker
2.4一键部署docker脚本
docker—install.sh #!/bin/bash #环境配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0 #安装依赖包 yum -y install yum-utils device-mapper-persistemt-data lvm2 #设置阿里云镜像源 cd /etc/yum.repos.d/ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装 docker-ce 社区版(企业版叫 docker-ee,收费) yum -y install docker-ce #配置阿里云镜像加速(尽量使用自己的) #地址 https://help.aliyun.com/document_detail/60750.html sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://mzljujtf.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker #网络优化 cat >> /etc/sysctl.conf <<EOF net.ipv4.ip_forward=1 EOF sysctl -p systemctl restart network systemctl enable docker && systemctl restart docker
三.docker操作
3.1镜像命令
指令 | 描述 |
ls | 列出镜像 |
build | 构建镜像来自Dockerfile |
history | 查看历史镜像 |
inspect | 显示一个或多个镜像的详细信息 |
pull | 从镜像仓库拉取镜像 |
push | 推送一个镜像到仓库 |
rm | 移除一个或多个镜像 |
prune | 一处未使用的的镜像,没有被标记或被任何容器引用的 |
tag | 创建一个引用源镜像标记目标镜像 |
export | 到处容器文件系统到tar归档文件 |
import | 导入容器文件系统tar归档文件创建镜像 |
save | 保存一个或多个镜像到一个tar归档文件 |
load | 加载镜像来自tar归档或标准输入 |
#查询 docker 版本和信息 docker version docker info #搜索镜像(可以自己制作镜像上传本地或官网仓库 dockerfile) docker search <镜像名> #下载镜像 docker pull <镜像名> #查看镜像列表 docker images #查看镜像详细信息 docker inspect <镜像 ID> #给镜像打标签 docker tag <镜像名>:<原标签> <镜像名>:<新标签> #docker tag nginx:latest nginx:lnmp #删除镜像 docker rmi <镜像名> docker rmi <镜像标签> docker rmi <镜像 ID> docker rmi `docker images -aq` #删除所有镜像 docker images | awk 'NR>=2{print "docker rmi -f "$3}' | bash
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
#镜像导出 docker save -o <导出的文件名> <镜像名> #docker save -o nginx_v1 nginx:latest #镜像导入 docker load < [镜像文件] #docker load < nginx_v1
#上传镜像
默认上传到 docker Hub 官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com
可以使用 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用 docker push 命令进行上传。
docker tag nginx:latest suoluo/nginx:web #添加新的标签时必须在前面加上自己的dockerhub的username
docker login #登录公共仓库
Username:suoluo
password:123456
docker push suoluo/nginx:web #上传镜像
3.2容器命令
指令 | 描述 |
ls | 列出容器 |
inspect | 显示一个或多个容器详细信息 |
attach | 附加本地标准输入,输出和错误到一个运行的容器 |
attach | 在运行容器中执行命令 |
commit | 构建一个新镜像来自一个容器 |
cp | 拷贝文件(夹)到一个容器 |
logs | 获取一个容器日志 |
port | 列出或指定容器端口映射 |
stats | 显示一容器资源使用统计 |
top | 显示一个或多个容器运行的进程 |
update | 更新一个或多个容器配置 |
stop/start | 停止/启动一个或多个容器 |
rm | 删除一个或多个容器 |
#查询容器 docker ps -a #查看容器占用系统资源信息 docker stats #创建容器 docker create -it nginx:latest /bin/bash #常用参数说明 > -i 让容器的标准输入保持打开 > -t 分配一个伪终端 > -d 以后台守护进程的方式运行 #开启/停止/重启 容器 docker start <容器 ID> docker stop <容器 ID> docker restart <容器 ID> #后台运行,指定容器名称为 test docker run -itd --name test nginx:latest /bin/bash #进入容器 docker exec -it <容器 ID> /bin/bash #exit 退出 #容器 导出/导入 docker export [容器 ID] > [文件名] docker import [容器文件名] [指定镜像名称] #导入的是镜像 #批量停止容器 docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop #批量删除容器 docker rm -f `docker ps -aq` docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f #批量删除 "exit" 状态(指定状态)的容器 for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done #查看容器进程号 docker inspect -f '{{.State.Pid}}' <容器名> docker inspect -f '{{.State.Pid}}' <容器 ID> ##进入容器没有 systemctl 命令解决 添加 --privileged=true(指定此容器是否为特权容器),使用此参数,则不能用 attach。 > 示例: docker run -itd --name test3 --privileged=true centos /sbin/init `/sbin/init 内核启动时主动呼叫的第一个进程` 可以使用 docker inspect <容器ID> docker ps -a docker exec -it <容器ID> /bin/bash yum install httpd -y systemctl status httpd
docker 在后台的标准运行过程:
- 检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
- 利用镜像创建并启动一个容器;
- 分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
- 分配一个地址池中的IP地址给容器;
- 执行用户指定的应用程序,执行完毕后容器被终止运行。
#启动容器 格式:docker start 容器的ID/名称 docker start 8b0a7be0ff58 docker ps -a #创建并启动容器 可以直接执行 docker run 命令, 等同于先执行 docker create 命令,再执行 docker start 命令。 注意:容器是一个与其中运行的 shell 命令共存亡的终端,命令运行容器运行, 命令结束容器退出。 docker 容器默认会把容器内部第一个进程,也就是 pid=1 的程序作为docker容器是否正在运行的依据,如果docker容器中 pid = 1 的进程挂了
那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。 当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是: (1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载; (2)利用镜像创建并启动一个容器; (3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层; (4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中; (5)分配一个地址池中的 IP 地址给容器; (6)执行用户指定的应用程序,执行完毕后容器被终止运行。 docker run centos:7 /usr/bin/bash -c ls / docker ps -a #会发现创建了一个新容器并启动执行一条 shell 命令,之后就停止了 #在后台持续运行 docker run 创建的容器 需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。
3.3镜像与容器的关系
- 镜像是容器的模板,容器是镜像运行的实例。
- 一个镜像可以创建多个容器,但是一个容器只能使用一个镜像。
- 容器在运行时会创建一个新的独立的文件系统,容器中的更改不会影响镜像,但是容器停止运行后,所有的更改都会丢失。
四.总结
1. Docker 是一个开源的应用容器引擎,它可以轻松地为应用程序和服务创建轻量级、可移植的容器。
2. Docker 可以让开发者打包他们的应用程序以及依赖性的组件到一个可移植的容器中,然后可以发布到任何流行的 Linux 机器上,例如本地的开发机器、数据中心的服务器、或者公有云上的实例。
3. Docker 使用 Linux 内核特性(如 cgroups 和 namespaces)来创建容器,并将容器与宿主机隔离,容器中的应用程序可以安全地运行在宿主机上,而不会影响宿主机的系统稳定性。
4. Docker 提供了一个完整的开发和部署环境,可以大大简化开发、测试和部署应用程序的过程。
5. Docker支持使用容器创建微服务,使开发者可以更容易地构建和管理分布式应用程序。
标签:容器,基础,应用程序,镜像,docker,Docker,运行 From: https://www.cnblogs.com/suoluo212/p/16985061.html