初识docker
docker是什么
docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
docker是在linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。
docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
docker的核心概念
镜像
创建容器的基础,是一个只读的模板文件,里面包含运行容器中的应用程序所需要的所有资料。
容器
用镜像运行的实例,容器可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的
仓库
是用来集中保存镜像的地方,有公有仓库和私钥仓库之分
容器优点
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核。
- 可互换:可以即时部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并自动分发容器副本。
- 可堆叠:可以垂直和即时堆叠服务。
容器在内核中支持2种重要技术:
docker容器本质就是宿主机的一个进程,docker容器是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g,只有当需要修改时才复制一份数据)。
docker容器与虚拟机的区别
docker容器 | 虚拟机 |
---|---|
所有容器共享宿主机的内核 | 每个虚拟机都有独立的操作系统和内核 |
通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 | 完全隔离。每个虚拟机都有独立的硬件资源分配 |
秒级启动速度 | 分钟级启动速度 |
容器相当于宿主机的进程,性能几乎没有损耗 | 需要通过hypervisor虚拟机管理程序对宿主机资源虚拟访问 |
一个宿主机可以启动成百上千个容器 | 最多几十个虚拟机 |
- 虚拟机
- docker
安装docker
源码安装
#推荐使用国内的阿里镜像作为下载源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装所需的docker安装包
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装docker的社区版本
yum install docker-ce
#检查docker的是否安装成功
docker -v
#开启docker服务并设置开机自启动
systemctl enable --now docker.service
yum安装
cd /opt
# 上传压缩包并解压
tar xf docker-20.10.9.tgz
#将包下面的文件拷贝到 /usr/bin目录
mv docker/* /usr/bin
# 查看是否安装成功
docker -v
#添加docker的系统启动服务
cat > /usr/lib/systemd/system/docker.service << eof
[unit]
description=docker application container engine
documentation=https://docs.docker.com
after=network-online.target firewalld.service
wants=network-online.target
[service]
type=notify
execstart=/usr/bin/dockerd
execreload=/bin/kill -s hup $mainpid
limitnofile=infinity
limitnproc=infinity
limitcore=infinity
timeoutstartsec=0
delegate=yes
killmode=process
restart=on-failure
startlimitburst=3
startlimitinterval=60s
[install]
wantedby=multi-user.target
eof
#开启docker服务并设置开机自启动
systemctl enable --now docker.service
检查docker
docker info
[root@cgs-1 ~]# docker info
client:
context: default
debug mode: false
server:
containers: 0 # 容器数量
running: 0
paused: 0
stopped: 0
images: 0 # 镜像数量
server version: 20.10.9 # 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 驱动
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
runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
default runtime: runc
init binary: docker-init
containerd version: 5b46e404f6b9f661a205e28d59c982d3634148f8
runc version: v1.0.2-0-g52b36a2d
init version: de40ad0
security options:
seccomp
profile: default
kernel version: 3.10.0-1160.119.1.el7.x86_64 # 宿主机的相关信息
operating system: centos linux 7 (core)
ostype: linux
architecture: x86_64
cpus: 2
total memory: 3.682gib
name: cgs-1
id: 34ji:hkwx:rblr:bzwn:ykal:64xr:gwpb:s5yz:xvpx:wqh5:qa5t:n2fn
docker root dir: /var/lib/docker # docker 数据存储目录
debug mode: false
registry: https://index.docker.io/v1/ # registry 地址
labels:
experimental: false
insecure registries:
127.0.0.0/8
live restore enabled: false
product license: community engine
docker 镜像操作
配置镜像加速器(阿里系)
#获取进行注册阿里云账号,阿里云会根据用户信息通过不同的个人docker镜像源
#浏览器访问 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取镜像加速器配置
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'eof'
{
"registry-mirrors": ["https://{your_id}.mirror.aliyuncs.com"]
}
eof
systemctl daemon-reload
systemctl restart docker
#检查docker
docker info
····
registry mirrors: # 加速站点
https://{your_id}.mirror.aliyuncs.com/
live restore enabled: false
搜索镜像
- 格式:
docker search [关键字]
- 例:搜索nginx的镜像
docker search nginx
获取镜像
- 格式:
docker pull <仓库名称:标签>
- 例:下载nginx的镜像默认标签
docker pull nginx
查看镜像信息
-
格式:
docker images [选项] #常用选项: #-q 表示仅显示镜像id
-
例:查看本地镜像列表
docker images
镜像本地存储
docker 相关的本地资源存放在 /var/lib/docker/ 目录下
其中containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。
#查看下载的镜像文件信息
cat /var/lib/docker/image/overlay2/repositories.json
添加新的镜像名或标签
- 格式:
docker tag <名称:标签> <新名称:新标签>
- 例:使用原来的nginx的"laster"镜像创建“new”
docker tag nginx:latest nginx:new
删除镜像
- 格式:
docker rmi <仓库名称:标签> [选项] 或 docker rmi <镜像id号> [选项] #常用选项: #-f 表示强制删除 #注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
- 例:删除nginx:laster
docker rmi nginx:latest
存储镜像:将镜像保存成为本地文件
- 格式:
docker save -o <镜像文件路径> <镜像名或镜像id>
- 例:存储镜像nginx:new命名为nginx-1存在/opt/nfs目录下
docker save -o /opt/nfs/nginx-1 nginx:new
导入镜像:将本地镜像文件导入到镜像库中
- 格式:
docker load < <镜像文件路径> 或 docker load -i <镜像文件路径>
- 例:
docker load -i /opt/nfs/nginx-1
docker 容器操作
容器的创建
- 格式:
docker create [-i -t] [--name 容器名] <镜像名:标签> [容器启动命令] 常用选项: -i:让容器开启标准输入接受用户输入命令 -t:让docker分配一个伪终端tty -it :合起来实现和容器交互的作用,运行一个交互式会话shell --name : 指定容器名
- 例:创建名为nginx-1.20的镜像
docker create -it --name nginx-1.20 nginx:1.20 /bin/bash
启动容器
- 格式:
docker start <容器名或容器id>
- 例:启动nginx-1.20
docker start nginx-1.20
查看容器的运行状态
- 格式:
docker ps -a
- 例:查看所有的容器的运行情况
docker ps -a
查看容器详细信息
- 格式:
docker inspect <容器名或容器id>
- 例:查看容器nginx-1.20的详细情况
docker inspect nginx-1.20
停止容器
- 格式:
docker stop <容器名或容器id> [-t 等待时间] #停止容器,发送 sigterm 信号 #默认等待10s 或 docker kill <容器名或容器id> #停止容器,默认发送 sigkill 信号
- 例:停止容器nginx-1.20
docker stop nginx-1.20
删除容器
- 格式:
docker rm <容器名或容器id> [选项] #常用选项: #-f 表示强制删除
- 例:删除容器nginx-1.20
docker rm nginx-1.20
创建并启动容器
- 格式:
docker run [-i -t] [--name 容器名] <镜像名:标签> [容器启动命令]
- 例:创建并启动nginx-1.20
docker run -it --name nginx-1.20 nginx:1.20 /bin/bash
登录容器
- 格式:
docker exec -it <容器名或容器id> sh|bash
- 例:登录容器nginx-1.20
docker exec -it nginx-1.20 bash
复制宿主机文件到容器中
- 格式:
docker cp <宿主机文件路径 ><容器名或容器id:绝对路径>
- 例:将宿主机内/opt/docker-20.10.9.tgz文件复制到容器nginx-1.20的/opt目录中
docker cp /opt/docker-20.10.9.tgz nginx-1.20:/opt
复制容器文件到宿主机中
- 格式:
docker cp <容器名或容器id:绝对路径> <宿主机文件路径 >
- 例:将容器nginx-1.20的/opt/zhuzhu.txt文件复制到宿主机的/opt目录中
docker cp nginx-1.20:/opt/zhuzhu.txt /opt
docker run 的启动过程
- 检查本地是否有指定镜像,如果有则直接使用本地镜像创建容器,如果没有则从仓库拉取镜像再创建容器
- 在只读的镜像层上再挂载一层可读可写的容器层
- 从docker网桥给容器分配一个虚拟接口和ip地址
- 使用镜像的默认启动命令或docker run 指定的命令来启动容器,直到容器中的pid=1的主进程退出为止
docker网络模式
docker 的网络模式
- host:容器将不会虚拟出自己的网卡,配置自己的ip等,而是使用宿主机的ip和端口。
- container:创建的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享ip、端口范围。
- none:该模式关闭了容器的网络功能。
- bridge:默认为该模式,此模式会为每一个容器分配、设置ip等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
- 自定义网络
命令格式:
docker run [--network=网络模式] ....
host模式
相当于vmware中的桥接模式,与宿主机在同一个网络中,但没有独立ip地址。
docker使用了linux的namespaces技术来进行资源隔离,如pid namespace隔离进程,mount namespace隔离文件系统,network namespace隔离网络等。
一个network namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的network namespace隔离。 一个docker容器一般会分配一个独立的network namespace。 但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的network namespace, 而是和宿主机共用一个network namespace。容器将不会虚拟出自己的网卡、配置自己的ip等,而是使用宿主机的ip和端口。
命令格式:
docker run --network=host ....
container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享ip、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
命令格式:
docker run --network=container:容器名或容器id ....
none模式
使用none模式,docker容器拥有自己的network namespace,但是,并不为docker容器进行任何网络配置。 也就是说,在这个网络模式下的docker容器没有网卡、ip、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
命令格式:
docker run --network=none ....
bridge模式
bridge模式是docker的默认网络模式,不用–net参数,就是bridge模式。
相当于vmware中的 nat 模式,容器使用独立network namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配network namespace、设置ip等,并将一个主机上的 docker 容器连接到一个虚拟网桥上。
命令格式:
docker run [--network=bridge] ....
自定义网络
可以用来自定义创建一个网段、网桥、网络模式,还可以实现使用自定义网络指定容器ip来创建容器
命令格式:
#创建自定义网络
docker network create --subnet=<自定义网段> --opt "com.docker.network.bridge.name"="<自定义网桥名>" <自定义网络模式名>
docker run --network=<自定义网络模式名> --ip=<自定义容器ip> ....
查看docker网络列表
- 格式:
docker network ls 或 docker network list
资源限制
cpu限制
设置单个容器进程能够使用的cpu使用率上限
针对新建的容器
- 格式:
docker run [参数]
- 参数
--cpu-period=<单个cpu的调度周期时间(1000~1000000) > --cpu-quota=<容器进程能够使用的最大cpu时间(>=1000,<=调度周期时间)>
针对已存在的容器
修改 /sys/fs/cgroup/cpu/docker/容器id/ 目录下的 cpu.cfs_period_us(单个cpu的调度周期时间) cpu.cfs_quota_us(容器进程能够使用的最大cpu时间) 这两个文件的值
设置多个容器的cpu占用比份额
- 格式:
docker run [参数]
- 参数
--cpu-shares=<容器进程最大占用的cpu份额(值为1024的倍数)>
设置容器绑定指定的cpu
- 格式:
docker run [参数]
- 参数
-
--cpuset-cpus cpuid[,cpuid2,....]
内存限制
设置容器能够使用的内存和swap的上限
- 格式:
docker run [参数]
- 参数
-m=<内存值> --memory-swap=<内存和swap的总值> --memory-swap==<0或不设置,表示容器的swap为内存的2倍> --memory-swap==<-1,表示不限制swap的值,宿主机有多少swap,容器就可使用多少>
磁盘io限制
- 格式:
docker run [参数]
- 参数
--device-read-bps 磁盘设备文件路径:速率 #限制容器在磁盘上每秒读的数据量 --device-write-bps 磁盘设备文件路径:速率 #限制容器在磁盘上每秒写的数据量 --device-read-iops 磁盘设备文件路径:次数 #限制容器在磁盘上每秒读的次数 --device-write-iops 磁盘设备文件路径:次数 #限制容器在磁盘上每秒写的次数
发表评论