虚拟机和容器对比
操作系统
虚拟机:
在宿主机机,虚拟硬件,在虚拟的硬件安装操作系统
docker:
轻量级虚拟机、对于容器而言,不需要在宿主机上虚拟硬件,而是直接使用宿主机的硬件,一个容器会包含操作系统和一个应用程序,可以看作具备用户空间的进程而已
容器引擎
包含计算、存储、网络
提供网络、计算、存储的能力
容器运行时
只能提供计算能力、containerd
cni:容器网络接口
*网络 :calico、flannel、cannel、contiv
csi:容器存储接口
*存储:ceph、nfs、disk、...
cri: 容器运行时接口
-
计算:containerd
安装docker
有线部署
1、修改名称
2、配置yum源和epel源
2、修改镜像源
https://developer.aliyun.com/mirror/docker-ce
3、systemctl start docker
4、systemctl enable docker
docker是CS架构的
服务端 dockerd
客户端命令 docker
离线部署
docker镜像
包含操作系统和应用程序
镜像仓库
私有仓库
推送镜像 1、登录docker私有仓库 docker login + 仓库地址 2、打tag docker tag redis:7.0.4 registry.cn-hangzhou.aliyuncs.com/命名空间/redis:7.0.4 3、推送镜像 docker push registry.cn-hangzhou.aliyuncs.com/命名空间/redis:7.0.4
http默认不能拉取、推送镜像,https不安全证书 1、进入配置文件 vi /etc/docker/daemon.json 2、加入 { "insecure-registris":["http://xxx.xxx.com","https://xxx.xxx.com"] } 3、修改后,需要重启docker
/etc/docker/daemon.json文件解析 { "exec-opts":["native.cgroupdriver=systemd"], #指定cgroup驱动 "log-driver":"json-file", #docker日志存储位置及格式 "log-level":"info", #日志存储级别 "log-opes":{ "max-size":"100m" "max-file":"10" }, "registry-mirrors":["https://pqbap4ya.mirror.aliyuncs.com"], #镜像加速器 "live-restore":true #当dockerd被重启时,容器不会退出 } 1、本地日志存放位置: /var/lib/docker/containers 2、1000m=1G
公有仓库
library是公共空间
hub.docker.com:latest
拉取镜像命令:
docker pull nginx:1.2
! 建议拉取镜像写明版本、见名知意
增
docker pull
删
docker rmi redis:7.0.4
参数:-f 强制删除容器(包括在运行容器)
改
镜像不能修改
查
查看镜像列表 :
docker image ls
查看镜像详情:
docker inspect redis:7.0.4
Repository:镜像仓库名称
TAG: 标签
CREATED: 镜像创建时间
SIZE:大小
docker容器
将镜像运行起来就是一个容器,容器为任务而生,不可以空跑、任务退出、容器就退出。
增
运行容器:docker run -d -p 80:80 nginx:1.23.1
启动参数
-d:将容器放到后台运行,以守护进程
-i: 交互式运行
-t: 为容器分配一个终端、-it组合使用
-p:端口映射
-P:宿主机随机映射容器端口
-v:持久化挂载
-e:容器启动时传递容器变量,可多次-e
--name:指定容器运行的名称
--dns:默认使用宿主机dns
--restart:默认no(no、always),当为always,重启后容器自动运行
--rm :退出自动删除容器
docker run -it nginx:1.23.1 /bin/bash /bin/bash会覆盖docker-entrypoint在前台终端执行
容器怎么知道进程执行完了? 在容器内部开启一个虚拟tty,然后要求将这个进程以前台的方式运行在这个tty上,这个tty不能退出,否则进程就退 容器里必须有 ps -ef | grep tty 任何容器在运行会执行一个任务,这个任务被称之为command
进入一个已经运行的容器 docker exec -it <容器id> /bin/bash
--name参数案例
--dns参数案例
-restart参数案例
-v参数案例
docker run -d -e MYSQL_ROOT_PASSWORD=cka01 -e MYSQL_DATABASE=lsz -v /data/mysql:/var/lib/mysql mysql:5.7 -v前面是宿主机路径、后面是容器路径 再新建容器可以直接-v路径继承之前的源数据 docker run -d -v /data/mysql:/var/lib/mysql mysql:5.7
挂载本地时间到容器里面 -v /etc/localtime:/etc/localtime -v /etc/localtime:/etc/localtime:ro #只读挂载 :ro #只读挂载 :rw #读写挂载、默认读写 #容器卷挂载 第一种 -v /var/lib/mysql #匿名卷 容器直接在宿主机自动新建一个目录路径,容器覆盖宿主机的 可以通过inspect查看 第二种 docker volume create webdir1 #新建卷 docker run -d -v webdir:/usr/share/nginx/html nginx:1.23.1 #容器的内容挂载到宿主机卷
容器网络
安装好docker默认会安装一块网卡,每创建一个容器会创建一个网桥
docker网卡有DHCP的能力,各容器默认通信
容器三种网络方式
--net
1、bridge:使用iptables实现端口映射、-p、-P #默认
2、host: 不为容器配置网卡,而直接使用宿主机网卡,获得最佳网络性能,但例如有两个nginx,会产生同一宿主机ip,端口被占用的问题
3、none: 不为容器分配任何IP地址
-p
-p 80:80 #前面是宿主机端口
123和8015都是宿主机的端口
-P
以nginx为例,宿主机会自动映射容器80端口,宿主机端口随机
删
删除容器:docker rm 容器id
注:运行容器不能直接删除,需要
停止容器: docker stop <容器id>
docker kill <容器id>
或 强制 rm -f
删除所有容器:
docker ps -aq | xargs docker rm -f
重启容器:
docker restart <容器id>
暂停容器 :
docker pause <容器id>
恢复暂停容器:
docker unpause <容器id>
改
启动后,参数无法被修改,容器里面数据可以修改
查
查看容器命令参数:docker run --help
看容器运行状态: docker ps -a
container ID : 容器id
IMAGE: 使用的镜像
COMMAND: 启动执行的命令
CREATED: 创建时间
STATUS: 运行状态
PORTS: 端口映射
NAMES: 随机生成的容器名字
查看容器详情: docker inspect 容器id
查看容器日志:docker logs 容器id