Docker一次封装,到处运行
●Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源
●是在Linux容器里运行应用的开源工具
●是一种轻量级的“虚拟机”
●Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。
Docker与虚拟机的区别
特性 |
Docker容器 |
虚拟机 |
启动速度 |
秒级 |
分钟级 |
计算能力损耗 |
几乎无 |
损耗50%左右 |
性能 |
接近原生 |
弱于 |
系统支持量(单机) |
上千个 |
几十个 |
隔离性 |
资源隔离/限制 |
完全隔离 |
Linux 的namespace (命名空间)
namespace 的六项隔离
namespace |
系统调用参数 |
隔离内容 |
UTS |
CLONE_NEWUTS |
主机名和域名 |
IPC |
CLONE_NEWWIPS |
信号量,消息队列和共享内存 |
PID |
CLONE_NEWPID |
进程编号 |
NETWORK |
CLONE_NEWNET |
网络设备,网络栈,端口等 |
MOUNT |
CLONE_NEWNS |
挂载点(文件系统) |
USER |
CLONE_NEWUSER |
用户和用户组(3.8以后的内核才支持) |
Docker运行流程

Docker的使用场景
●打包应用程序简化部署
●可脱离底层硬件任意迁移
例:服务器从腾讯云迁移到阿里云
Docker的核心概念
①镜像 一个面向Docker容器引擎的只读模板
②容器 从镜像创建的运行实例
③仓库 集中保留镜像的地方
仓库分为 公有仓库:Docker官方仓库 私有仓库:个人化、私有化的仓库
总结:Docker是容器管理工具,容器由镜像创建而来,镜像从仓库中获取而来,仓库分为公有、私有。
Docker安装
#关闭防火墙
systemctl stop firewalld.service
setenforce 0
yum install -y yum-utils device-mapper-persistent-data lvm2
#配置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装Docker-CE,并启动,同时设置为开机自启
yum -y install docker-ce
systemctl enable --now docker.service
#查看docker的版本信息
docker version
#查看当前docker的详细信息
docker info
#镜像加速
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hgfiuss0.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
##为什么要开启路由转发功能?
开启路由转发 是让docker0能根据虚拟机ip为自己所有的docker容器分配虚拟ip
vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #开启路由转发
sysctl -p
systemctl restart network
systemctl restart docker
###docker-server端配置文件建议配置
#在daemon. json文件中配置
{
"graph":"/data/docker", #数据目录,数据存储位置
"storage-driver":"overlay2", #存储引擎,docker1.18以上版本默认使用overlay2存储引擎。早期的适合存储引擎使用的aufs
"insecure-registries":["registry.access.redhat.com","quary.io"], #私有仓库
#registry-mirrors 以下添加
"bip":"172.184.70.1/24", #docker网络
"exec-opts":["native.cgroupdriver-systemd"], #启动时的额外参数,(是一种挂在驱动,k8s使用)
"live-restore":true #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能继续运行
}
[root@localhost yum.repos.d]# 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 #服务端版本号
Storage Driver: overlay2 #文件类型的驱动引擎
Backing Filesystem: xfs #文件系统类型
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs #Cgroup引擎类型
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc version: v1.1.2-0-ga916309
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-693.el7.x86_64 #当前系统的内核版本
#以下是当前系统的信息,因为docker共享系统配置
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.781GiB
Name: localhost.localdomain
ID: LQWK:2C26:54YI:XEIW:XZP3:Q44T:LB3J:3PAC:LKE3:HMNW:YE3Q:7FIN
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/ #默认仓库地址
Labels:
Experimental: false
Insecure Registries: #指定私有仓库地址
127.0.0.0/8
Live Restore Enabled: false
docker镜像与容器基本的基本操作
docker 镜像操作
●搜索镜像(公共仓库)——docker search
默认是在公共仓库找,如果有私有仓库,会在私有仓库找
#格式:docker search 关键字
#示例:
docker search nginx
●下载镜像——docker pull
#格式:docker pull 仓库名称[:标签]
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
docker pull centos:7
docker pull nginx
●查看镜像——docker images
#查看下载到本地的所有镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 55f4b40fe486 27 hours ago 142MB
--------------------------------------------------------------------
REPOSITORY:镜像属于的仓库;
TAG:镜像的标签信息,标记同一个仓库中的不同镜像;
IMAGE ID:镜像的唯一ID 号,唯一标识一个镜像,经过md5方式加密过;
CREATED:镜像创建时间;
VIRTUAL SIZE:镜像大小;
●获取镜像信息——docker inspect
#格式:docker inspect 镜像ID
#示例:查看nginx镜像信息
docker insect 605c77e624dd
●添加镜像标签——docker tag
#格式:docker tag 名称:[旧标签] 新名称:[新标签]
#示例:
docker tag nginx:latest nginx:lnmp #给nginx打上标签lnmp,原来的标签是latest
●删除镜像——docker rmi
docker rmi是docker rm image的简写
#格式:
docker rmi 仓库名称:标签 #当一个镜像有多个标签时,只是删除其中指定的标签
docker rmi 镜像ID号 #会彻底删除该镜像
●批量删除镜像
#docker images -q 可以加载镜像id
#批量删除所有镜像
docker rmi `docker images -q`
#批量删除nginx镜像
docker rmi `docker images|grep "nginx"`
●导出/导入镜像——docker save/load
#导出镜像
#格式:docker save -o 存储文件名 存储的镜像
docker save -o nginx_v1 nginx:latest #存出镜像命名为nginx存在当前目录下
scp nginx_v1 @root:192.168.59.111:/opt #将导出的镜像以scp方式导到别的服务器上
#导入镜像,可以异地导入,但是必须要有docker引擎,并且版本不可以差太多
#格式:docker load < 存出的文件
docker load -i 存出的文件
docker load < nginx_v1
docker容器操作
●查询所有容器运行状态——docker ps -a
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器的ID号 加载的镜像 运行的程序 创建时间 当前的状态 端口映射 名称
●创建容器——docker create
新创建的容器默认处于停止状态,不运行任何程序,需要在其中发起一个进程来启动容器。
#格式:docker create [选项] 镜像
#常用选项:
-i:让容器的输入保持打开
-t:让 Docker 分配一个伪终端
#示例:
docker create -it nginx:latest /bin/bash
●启动容器——docker start
#格式:docker start 容器的ID/名称
docker start b2a57b3ea48a
docker ps -a
启动容器(一次性执行)—— docker run
#加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束。
#示例1:
docker run -itd nginx:latest /bin/bash
#示例2:执行后退出
docker run centos:7 /usr/local/bash -c ls /
#示例3:执行后不退出,以守护进程方式执行持续性任务
docker run -d centos:7 /usr/local/bash -c "while true;do echo hello;done"
●终止容器运行
格式: docker stop/kill 容器ID/名称
stop: 停止容器,可以给容器一个等待时间,以防止数据的丢失。
kill: 立即强行停止一个容器(相当于linux命令 kill -9) ,不会给容器反应时间,可能会造成数据丢失
●进入容器
需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。
格式:docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。
docker start 2592d3fad0fb #进入容器前,确保容器正在运行
docker exec -it 2592d3fad0fb /bin/bash
ls
exit #退出容器后,容器仍在运行
docker ps -a
●从宿主机上将文件导入到容器中
docker ps -a #先获取需要导入到的容器ID,然后重新开一个终端
另一个终端上操作
echo "wmc" >> cc.txt #创建测试文件
docker cp 123.txt cef59022a4dd:/opt
●容器的导出与导入
#导出格式:docker export 容器ID/名称 > 文件名
docker export 2592d3fad0fb > centos7.tar
#导入格式:cat 文件名 | docker import – 镜像名称:标签
cat centos7.tar | docker import - centos7:test #导入后会生成镜像,但不会创建容器
●删除容器
格式:docker rm [-f] 容器ID/名称
docker stop 2592d3fad0fb
docker rm 2592d3fad0fb #删除已经终止状态的容器
docker rm -f 2592d3fad0fb #强制删除正在运行的容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash #批量停止容器
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash #批量删除所有容器
docker images | awk 'NR>=2{print "docker rmi "$3}' | bash #批量删除镜像