一. IT架构的演进:
裸金属 → 虚拟机 → 容器→ 函数化、代码化
虚拟机常用软件:
VMware workstation(windows)
vm Sphere+ESXI (Windows server)
KVM(linux内核)
虚拟机是一个重量级的技术,独立内核;
虚拟机运行需要宿主去分配内存,cpu 资源消耗量比较大,比较吃内存,跑的应用会有上限
比如说你要跑2000个LNMP架构那肯定虚拟化是不行的。
2.docker是什么?
Docker是基于Go语言实现的云开源项目;
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”;
也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理;
使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”;
3.为什么学docker
容器技术本来就是linux内核支持的,docker干掉了其他所有的产品,成为市面标准;
虚拟机的所有应用会共应同一个文件系统,挂载点,路径不能重复;
docker技术实现了资源隔离(namespace)命名空间,共享宿主机内核;
可以运行大量应用,基于golong语言开发的,每个应用就是一个进程,对资源消比较少;
linux六大namespace(命名空间):
namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名和域名 |
IPC | CLONE_NEWWIPS | 信号量,消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网络设备,网络栈,端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
4. 容器在内核中支持2种重要技术
docker本质就是宿主机的一个进程,docker是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制(限制硬件资源,限制2个容器相互之间抢资源),通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)。
cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。
二. Docker核心概念
1)镜像
- Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。
- 通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。
2)容器
- Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
- 可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行在其中的应用程序。
)仓库
- Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
- Docker 的镜像、容器、日志等内容全部都默认存储在 /var/lib/docker 目录下。
三、安装Docker
1. Yum安装Docker
目前 Docker 只能支持 64 位系统。
Yum安装默认安装最新版本,目前最新版本是2020版本。但工作中不会用这么新的版本,前一个版本是2019版本。
#关闭防火墙和selinux
systemctl stop firewalld.service
setenforce 0
#安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
--------------------------------------------------------------------------------------------
#yum-utils:提供了 yum-config-manager 工具。
#device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,
它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
#device mapper存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
--------------------------------------------------------------------------------------------
#设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装 Docker-CE并设置为开机自动启动
yum install -y docker-ce #docker-ce-cli、containerd.io 会作为依赖包被安装
systemctl start docker.service
systemctl enable docker.service
2 .查看Docker信息
#查看 docker 版本信息
docker version
#注意:Yum安装默认安装最新版本,目前最新版本是2020版本。但工作中不会用这么新的版本,前一个版本是2019版本。
#docker信息查看
docker info
//查看的部分信息如下:
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
scan: Docker Scan (Docker Inc., v0.17.0)
Server:
Containers: 0 #容器数量
Running: 0
Paused: 0
Stopped: 0
Images: 0 #镜像数量
Server Version: 20.10.17 #server版本
Storage Driver: overlay2 #docker使用的是overlay2 文件驱动
Backing Filesystem: xfs #宿主机上的底层文件系统
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs #cgroups 驱动,默认为cgroupfs,也可以修改为systemd
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Docker基础命令
1、查看Docker版本信息
docker version
docker info
2、镜像操作
搜索镜像
下载镜像
docker pull 服务名
例如:
docker pull nginx
查看镜像信息/获取镜像信息
查看镜像信息
docker images
获取镜像信息
docker inspect 镜像的ID
例如
docker images
docker inspect
添加新标签(打标签)
docker tag 仓库名:原镜像名 仓库名:新镜像名
例如:
docker tag nginx:latest nginx:test
docker images
删除镜像
指定镜像ID删除的时候,要求不能有该镜像不能有标签
docker rmi 镜像的ID
docker rmi 仓库名:镜像名
例如:
docker rmi d1a364dc548d
docker images
docker rmi nginx:test
docker images
将镜像存储到本机上,命名为nginx_latest
docker save -o 存放镜像的位置 仓库名:镜像名
例如:
docker save -o /opt/nginx_latest nginx:latest
载入镜像
方法一:
docker load < 本地导出的镜像名
方法二:
docker --input 本地导出的镜像名
例如:
docker load < nginx_latest
docker load --input nginx_latest
上传镜像
3、容器操作
查询容器
docker ps #查看运行中的容器
docker ps -a #加-a 列出所有的容器,包括未运行的容器
创建容器
docker create [选项] 镜像运行的程序
docker create -it nginx: latest /bin/bash
-i 让容器的标准输入保持打开
-t 分配一个伪终端
-d 后台守护进程的方式运行
启动、停止、重启容器
docker start 容器ID:启动一个或多个已经被停止的容器
docker stop 容器ID:停止一个运行中的容器
docker restart 容器ID:重启容器
例:
docker start 092fa28929a0
docker ps -a
docker stop 092fa28929a0
docker ps -a
docker restart 092fa28929a0
持续后台运行
docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"
进入容器
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"
使用exec(容器必须为开启状态)
docker exec [选项] 容器 命令
例:
docker exec -it 53a193814422 /bin/bash
docker exec -it 092fa28929a0 /bin/bash
exit//退出容器
容器导出、导入
#容器导出
docker export容器ID >文件名示例:
docker export容器ID > nginx_a
#容器导入(生成镜像)
docker import导出的文件名(容器)指定镜像名称示例:
docker import nginx_a nginx : latest
cat文件名(容器)l docker import - nginx:latest
删除容器
docker rm 容器ID
例如:
docker rm 53a193814422
docker rm -f 092fa28929a0 删除在运行中的容器
//批量删除容器
docker ps -a | awk '{print "docker rm "$1}' | bash
#批量删除“exit"状态的容器
for i in `docker ps -a | grep -i exit | awk '(print $1}'` ; do docker rm -f $i;done
创建并启动容器
可以直接执行docker run命令, 等同于先执行docker create 命令,再执行docker start 命令。
注意:容器是一个与其中运行的shell 命令共存亡的终端,命令运行容器运行,命令结束容器退出。
docker容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker容器中pid=1的进程挂了,那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。
docker run 的执行过程:
(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
(2)利用镜像创建并启动一个容器;
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;(镜像只读,不能删 除。)
(4)从宿主主机配置的网桥接口中桥接一一个 虚拟机接口到容器中;
(5)分配一个地址池中的IP地址给容器;
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。
常用选项:
选项 | 含义 |
---|---|
-i | 让容器的标准输入保持打开 |
-t | 让Docker 分配一个伪终端(如果想要导入一些命令,需要这个参数) |
-it | 合起来实现和容器交互的作用,运行一个交互式会话shell |
--name=容器名称 | 指定容器名称,不指定会随机生成 |
常用选项:
选项 | 含义 |
---|---|
-a | 显示所有的容器,包括未运行的 |
-f | 根据条件过滤显示的内容 |
–format | 指定返回值的模板文件 |
-l | 显示最近创建的容器 |
-n | 列出最近创建的n个容器 |
-no-trunc | 不间断输出 |
-q | 静默模式,只显示容器编号 |
-s | 显示总的文件大小 |
docker run [选项] 镜像 [命令] [参数...]
选项说明:
选项 | 说明 |
---|---|
-a | 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项 |
-d | 后台运行容器,并返回容器ID |
-i | 以交互模式运行容器,通常与 -t 同时使用 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用 |
-P(大写) | 随机端口映射,容器内部端口 随机 映射到主机的端口 |
-p | 指定端口映射,格式为:主机(宿主)端口:容器端口 |
--name= | 为容器指定一个名称 |
-dns 8.8.8.8 | 指定容器使用的DNS服务器,默认和宿主一致 |
-dns-search example.com | 指定容器DNS搜索域名,默认和宿主一致 |
-h | 指定容器的hostname |
-m | 设置容器使用内存最大值 |
-link=[ ] | 添加链接到另一个容器 |
--privileged=true | 授予此容器扩展特权,也就是开启特权模式; 这种模式下容器对docker宿主机拥有root访问权限。慎用! |
--net/--network | 指定网络模式 |
前台运行容器时进入容器,使用exit退出容器后,容器就停止了。
#前台运行容器时,可以同时指定shell环境直接进行容器,但exit退出容器后,容器就停止了。
[root@zhou ~]# docker run -it --name yy1 centos:7 /bin/bash
[root@c86f0e6b5433 /]# exit #退出容器
exit
[root@zhou ~]# docker ps -a #
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c86f0e6b5433 centos:7 "/bin/bash" 16 seconds ago Exited (0) 2 seconds ago yy1
后台运行容器,之后使用docker exec进入容器,exit退出容器,容器不会停止。
docker run -itd --name yy2 centos:7 #后台运行容器
docker exec -it yy2 /bin/bash #使用exec进行容器,之后exit退出容器,容器不会停止
[root@zhou ~]# docker run -itd --name yy2 centos:7
f16a29a2942434cc8dd2b7b29cf56d3e6a5fba32caad329c1b59c7f1fa295685
[root@zhou ~]# docker exec -it yy2 /bin/bash
[root@f16a29a29424 /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@f16a29a29424 /]# exit
exit
[root@zhou ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f16a29a29424 centos:7 "/bin/bash" 23 seconds ago Up 22 seconds yy2
c86f0e6b5433 centos:7 "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago yy1
查看容器的元数据——docker inspect
格式:docker inspect 容器id/容器名称
docker ps -a #先查看运行时容器的id
docker inspect 51fd134c7cc3 #查看容器的元数据
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2", #容器的IP
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": { #使用的是网桥模式
容器日志
格式:
docker logs 容器ID/容器名
宿主机和容器之间的文件复制
1)将宿主机中的文件复制到容器中
#将宿主机中的文件复制到容器中
echo 123 > /opt/f1.txt
docker cp /opt/f1.txt 容器ID:/tmp/
[root@zhou ~]# echo 123 > /opt/f1.txt
[root@zhou ~]# docker cp /opt/f1.txt 93007aee7e8f:/tmp/ #将宿主机中的文件复制到容器中
[root@zhou ~]# docker exec -it 93007aee7e8f /bin/bash #进入容器查看是否复制成功
root@93007aee7e8f:/# cd /tmp
root@93007aee7e8f:/tmp# ls
f1.txt
root@93007aee7e8f:/tmp# cat f1.txt #复制成功
123
root@93007aee7e8f:/tmp#
2)将容器中的文件复制到宿主机中
docker cp 容器ID:/tmp/f1.txt ~/abc.txt #复制并重命名
#将容器中/tmp目录下的f1.txt文件,复制到宿主机的/root目录下,并重命名为abc.txt
[root@zhou ~]# docker cp 93007aee7e8f:/tmp/f1.txt ~/abc.txt
[root@zhou ~]# ls
abc.txt anaconda-ks.cfg initial-setup-ks.cfg mynginx.tar 公共 模板 视频 图片 文档 下载 音乐 桌面
容器的导出与导入(容器的迁移)
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。
可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。(注意:导入文件后会生成镜像,但不会自动创建容器。)
#导出格式:
docker export 容器ID/名称 > 导出文件名
#导入格式:
cat 导出文件名 | docker import – 镜像名称:标签
#主机A将容器导出为文件,并将导出的文件传给主机B
[root@zhou ~]# docker export 51fd134c7cc3 > mycentos7
[root@zhou ~]# scp ~/mycentos7 192.168.6.170:/root/
#主机B将文件导入生成镜像,并使用导入的镜像创建容器
[root@zhou ~]# cat mycentos7 | docker import - centos7:test #导入后会生成镜像,但不会创建容器
[root@zhou ~]# docker run -id centos7:test #使用导入的镜像创建容器
1、容器管理命令
命令 | 作用 |
---|---|
docker create -i [–name=容器名称] 镜像名 | 创建容器 |
docker create -it [–name=容器名称] 镜像名 <命令> | 创建容器并导入命令 |
docker start <容器ID/名称> | 启动容器 |
docker stop <容器ID/名称> | 停止容器 |
docker kill <容器ID/名称> | 立即强制停止容器 |
docker ps | 查询运行状态的容器 |
docker ps -a | 查询所有容器 |
docker rm [-f] <容器ID/名称> | 删除容器 (-f 强制删除正在运行的容器) |
docker rm $(docker ps -aq) | 删除所有容器 |
docker run [–name] -id | 启动容器(一次性执行) |
docker exec -it 容器ID/名称 bash | 进入容器 |
docker run -it 容器ID/名称 bash | 启动时进入容器 |
docker cp 宿主机文件 容器ID:容器目录 | 将宿主机的文件复制到容器中 |
docker cp 容器ID:容器目录/文件 宿主机目录 | 将容器中的文件复制到宿主机中 |
docker logs | 容器pid=1的进程日志 |
docker export 容器ID/名称 > 文件名 | 将容器导出为文件 |
cat 文件名 docker import - 镜像名称:标签 | 将导出的容器文件,导入生成镜像 |
docker stats | 查看docker消耗的资源状态 |