01走进云计算-docker基础

什么是Docker

Docker 是Docker.Inc公司开源的,一个基于LXC技术之上构建的Container容器引擎,源码托管在GitHub上,基于Go语言,并基于Apache2.0协议开源。

Docker是通过内核虚拟化技术(namespace及cgroup等)来提供容器的资源隔离与安全保障等。

由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。

容器与虚拟机对比

传统虚拟化和docker分层对比

file

VM虚拟化和Docker特性对比

特性 Docker VM
启动速度 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于原生
系统支持量 单机支持上千个容器 一般几十个
隔离性 安全隔离 完全隔离

什么是容器

容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理

file

程序: 代码,软件,命令

进程:正在运行的程序

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三个重要概念

file

镜像

Docker镜像可以看做是一个特殊的文件系统,除了提供容器运行时所需要的程序、库、资源、配置文件以外,还包含了一些为运行时,准备的配置参数(匿名卷,环境变量,用户等),镜像是不可更改的

容器

容器的定义和镜像,几乎是一模一样,唯一区别在于容器的最上面那一层是可读可写的。

仓库

仓库是Docker用来存放镜像的地方,类似于我们之前常用的代码仓库。

通常一个仓库会包含,同一个软件,不同版本的镜像

我们可以通过<仓库名>:<标签>格式来指定具体使用哪个版本的镜像,如果不给标签,那么默认以Latest作为默认标签

Docker组成部分

Docker是一个传统的C/S结构程序,分为Docker ClientDocker Server

Docker客户端是Docker用户与Docker交互的主要方式

当使用Docker命令型运行命令时,Docker客户端将这些命令发送给服务端,服务端执行这些命令

Dokcer命令使用Docker API

Docker客户端可以与多个服务端进行通讯

file

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镜像站加速

file

file

file

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

山林不向四季起誓 荣枯随缘