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 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 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 #批量删除镜像