01走进云计算-docker基础
什么是Docker
Docker 是Docker.Inc公司开源的,一个基于LXC技术之上构建的Container容器引擎,源码托管在GitHub上,基于Go语言,并基于Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespace及cgroup等)来提供容器的资源隔离与安全保障等。
由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
容器与虚拟机对比
传统虚拟化和docker分层对比
VM虚拟化和Docker特性对比
特性 | Docker | VM |
---|---|---|
启动速度 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于原生 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 安全隔离 | 完全隔离 |
什么是容器
容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理
程序: 代码,软件,命令
进程:正在运行的程序
namespace 和 cgroup
namespace 资源隔离
内核提供了namespace的机制用来隔离相关资源,namespace设计之初就是为了实现轻量级的系统资源隔离,可以让容器中的进程仿佛置身于一个独立的系统环境中。
Namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTC | CLONE_NEWUTC | 主机名和域名 |
IPC | CLONE_NEWIPC | 信号量,消息队列,共享内存 |
PID | CLONE_NEWPID | 进程号 |
Network | CLONE_NEWNET | 网络设备,网络栈,端口 |
Mount | CLONE_NEWNS | 文件系统 |
User | CLONE_NEWUSER | 用户和用户组 |
cgroup 资源限制
cgroups 限制一个进程能够使用的资源。cpu,内存,硬盘io
cgroup的四大作用:
资源限制:例如设定任务指定内存
优先级分配:比如跟任务分配的CPU时间,片数,磁盘IO,带宽大小来控制任务的优先级
资源统计:统计CPU,内存,IO等资源使用时长,该功能比较适合用于计费
任务控制:cgroup可以对任务进行 运行,挂起,恢复等操作
Docker三个重要概念
镜像
Docker镜像可以看做是一个特殊的文件系统,除了提供容器运行时所需要的程序、库、资源、配置文件以外,还包含了一些为运行时,准备的配置参数(匿名卷,环境变量,用户等),镜像是不可更改的
容器
容器的定义和镜像,几乎是一模一样,唯一区别在于容器的最上面那一层是可读可写的。
仓库
仓库是Docker用来存放镜像的地方,类似于我们之前常用的代码仓库。
通常一个仓库会包含,同一个软件,不同版本的镜像
我们可以通过<仓库名>:<标签>格式来指定具体使用哪个版本的镜像,如果不给标签,那么默认以Latest作为默认标签
Docker组成部分
Docker是一个传统的C/S结构程序,分为Docker Client
和Docker Server
Docker客户端是Docker用户与Docker交互的主要方式
当使用Docker命令型运行命令时,Docker客户端将这些命令发送给服务端,服务端执行这些命令
Dokcer命令使用Docker API
Docker客户端可以与多个服务端进行通讯
Docker部署及使用
清华源docker部署帮助网站:TP
# 1.先卸载以前使用的docker
yum remove docker docker-common docker-selinux docker-engine
# 2.下载docker官方源
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
# 3.替换官方源为 清华源
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 4.更新yum缓存
yum makecache fast
# 5.安装docker
[root@db01 ~]# yum install docker-ce -y
# 6.查看docker版本
[root@db02 ~]# docker version
Client: Docker Engine - Community
Version: 20.10.10
API version: 1.41
Go version: go1.16.9
Git commit: b485636
Built: Mon Oct 25 07:44:50 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
# 7.启动docker服务端并加入开机自启
[root@db02 ~]# systemctl start docker
[root@db02 ~]# systemctl enable docker
配置docker镜像站加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pgz00k39.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
运行第一个容器
[root@db01 ~]# docker run alpine /bin/echo "hello world"
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
97518928ae5f: Pull complete
Digest: sha256:635f0aa53d99017b38d1a0aa5b2082f7812b03e3cdb299103fe77b5c8a07f1d2
Status: Downloaded newer image for alpine:latest
hello world
# 查看运行中的容器,alpine没有保持运行
[root@db01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 查看所有容器,alpine已经退出了
[root@db01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b28aebeb5d2 alpine "/bin/echo 'hello wo…" 26 seconds ago Exited (0) 25 seconds ago fervent_shannon
## Docker设计理念:
1.一个容器,最好只做一件事
2.Docker运行容器,在PID进程为1的进程结束后,Docker结束运行
Docker命令-镜像
Docker镜像的组成,仓库名称:镜像标签,标签不指定,默认是latest
# 拉取镜像潜规则:
1.拉取官方版
2.拉取星标最多的版本
## 1.查找镜像
[root@db01 ~]# docker search centos
### 查找镜像黑科技
[root@db01 ~]# yum install -y jq
[root@db01 ~]# curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq
# 找想要的镜像只需要替换centos,输入自己想要找的镜像
## 2.查看下载好的镜像
[root@db01 ~]# docker images
-q:只查看所有镜像的ID
## 仓库名 ## 标签名 镜像id ## 创建时间 ## 镜像大小
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 0a97eee8041e 2 days ago 5.61MB
centos centos7 eeb6ee3f44bd 2 months ago 204MB
## 3.下载镜像
[root@db01 ~]# #docker pull 仓库名称:镜像标签
[root@db01 ~]# docker pull centos:7
## 4.删除镜像
[root@db01 ~]# #docker rmi 仓库名:标签
[root@db01 ~]# #docker rmi ID
[root@db01 ~]# docker rmi alpine:latest
[root@db01 ~]# docker rmi 04661cdce581
## 5.导出镜像
[root@db01 ~]# docker save centos:7 -o centos_7.tar.gz
[root@db01 ~]# docker save centos:7 > centos_7_v2.tar.gz
## 6.导入镜像
[root@db02 ~]# docker load -i centos_7.tar.gz
[root@db02 ~]# docker load < centos_7_v2.tar.gz
Docker命令-容器
# 1.查看正在运行的容器
[root@db01 ~]# docker ps
# 2.查看所有的容器
[root@db01 ~]# docker ps -a
# 3.运行容器
[root@db01 ~]# docker run centos:7
[root@db01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ceccded0881c centos:7 "/bin/bash" 15 seconds ago Exited (0) 14 seconds ago youthful_varahamihira
[root@db01 ~]# docker run -it -d centos:7 /bin/bash
-i:Keep STDIN open even if not attached # 提供一个交互的标准输入
-t:Allocate a pseudo-TTY # 提供一个终端设备
-d:Run container in background and print container ID # 启动容器,在后台运行,并打印ID
# 4.进入容器(连接到虚拟机中)
[root@db01 ~]# docker exec -it d15441db5e7c /bin/bash
[root@db01 ~]# docker exec -it vibrant_dhawan /bin/bash
# 5.停止容器
[root@db01 ~]# docker stop d15441db5e7c # ID 或者 名字
[root@db01 ~]# docker stop vibrant_dhawan
# 6.只查看容器id
## 只查看在运行的容器id
[root@db01 ~]# docker ps -q
d0795224cc70
## 查看所有容器的id
[root@db01 ~]# docker ps -aq
d0795224cc70
d15441db5e7c
781bf6115914
ceccded0881c
## 删除所有容器
docker rm $(docker ps -qa)
## 杀掉docker进程
docker kill ID 或者 名字
Docker部署nginx项目
# 1.拉nginx项目
[root@db01 ~]# docker pull nginx
# 2.启动nginx
[root@db01 ~]# docker run -d nginx
# 3.进入容器
[root@db01 ~]# docker exec -it f66e862ef70a /bin/bash
# 4.先查看镜像内,服务端口
[root@db01 ~]# docker inspect 仓库名:标签
# 5.端口映射
[root@db01 ~]# docker run -p 9999:80 -d nginx:latest
Comments | NOTHING