Docker
Docker 发展背景
伴随着容器化技术的发展以及微服务的流行,Docker横空出世,其本身除了对容器技术(LXC)做了应用封装外,更为重要的是,它引入了容器镜像等一整套管理容器的生态系统。Docker 对应用的封装、分发、部署、运行的生命周期的管理,提供了一站式的实用解决方案。
Docker的发展,建议读一下浅谈容器技术发展史。简单概括:
- Unix/Linux的发展
- 虚拟化技术的发展
- 容器技术的发展(Namespace + Cgroups)
- docker的出现 同行竞争-各容器厂家的竞争
- k8s的出现 拥抱云原生
目标
Docker提供一个这样的平台:
- 构建(build)
- 传送(share)
- 运行(run)
应用程序的平台。实现 “Build,Skip and Run Any APP,Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件 “一次封装,到处运行” 的目的。
优势
- 快速,一致地交付应用程序
- 响应式部署和扩展
- 在同一硬件上运行更多工作负载
技术原理
LXC(Linux Container)容器的两个技术
1. Namespace
Linux Namespace(命名空间)是一种操作系统层级的资源隔离技术,不同 namespace 里的进程无法感知到其它 namespace 里面的进程和资源。
2. Cgroups
Cgroups (Control Groups)可以对指定的进程做各种计算机资源的限制,比如限制CPU的使用率,内存使用量,IO设备的流量等等。
Docker 和 虚拟机 的区别
说到区别,就要理解他俩运行的本质。最大的不同在于:
- 虚拟机是在一个物理机下,开多个独立操作系统的一种虚拟化技术
- Docker是利用 Namespace + Cgroup 技术,做到共享底层一套操作系统
理解了这个,其他不同点也顺带而出:
- 启动速度:docker 启动快速属于秒级别。虚拟机通常需要几分钟去启动。
- 性能、资源利用率:docker 需要的资源更少,性能损耗小,系统利用率不同。同样的硬件环境,Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高。
- 隔离性:与虚拟机相比,docker 隔离性更弱,docker 属于进程之间的隔离,虚拟机可实现系统级别隔离。
- 安全性:docker 相对虚拟机要弱。
- 交付、部署速度:docker 更优。
Docker组件的基本概念
-
镜像
可以理解是一个模板,内部包含这些服务组件,如redis、mysql这些组件的版本信息等
-
容器
容器就是运行的一个Docker实例
-
仓库
Docker仓库就是用来存储镜像的地方,提供上传和下载的入口,供分享。如Dockerhub
client-server 模式
docker 的运行模式是 C/S :docker 客户端 -> docker daemon 处理、返回
如何使用
Docker 安装
Docker 安装比较简单,参考 Docker官网
安装成功后,启动Docker,终端执行 $ docker version,显示Client和Server的信息
~ docker version
Client:
Cloud integration: v1.0.33
Version: 24.0.2
API version: 1.43
Go version: go1.20.4
...
Server: Docker Desktop 4.20.0 (109717)
Engine:
Version: 24.0.2
API version: 1.43 (minimum version 1.12)
Go version: go1.20.4
Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
- 创建一个Dockerfile
举例
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
- 使用Dockerfile构建镜像
$ docker build -t hello-first-docker .
# hello-first-docker 镜像名称
# . 当前客户端目录环境, docker daemon执行时可以拷贝文件等
# 查看所有镜像
$ docker images
- 使用镜像创建和运行容器
$ docker run 镜像名称
Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,我们可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令 docker-compose up ,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 执行 docker-compose up 命令来启动并运行整个应用程序。
举例:docker-compose.yml
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
其他常用命令
# 版本信息
$ docker info
$ docker version
# 容器生命周期
$ docker start/stop/restart
$ docker run
$ docker kill
$ docker rm
$ docker create
# 容器操作
$ docker ps :列出容器
$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...] :在运行的容器中执行命令,注意参数是容器名或者容器id
$ docker stats : 显示容器资源的使用情况
# 镜像仓库
$ docker login : 登陆到一个Docker镜像仓库
$ docker push : 将本地的镜像上传到镜像仓库
$ docker pull : 从镜像仓库中拉取或者更新指定镜像
$ docker search : 从Docker Hub查找镜像 如 $ docker search mysql
# 本地镜像管理
$ docker build 命令用于使用 Dockerfile 创建镜像
$ docker images : 列出本地镜像
$ docker save : 将指定镜像保存成 tar 归档文件
$ docker load : 导入使用 docker save 命令导出的镜像
Docker 安装运行组件示例 - MySQL
-
查看可用的 MySQL 版本
$ docker search mysql
-
拉取 MySQL 镜像
$ docker pull mysql:latest $ docker images 查看下
-
运行容器
$ docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql # 说明: # -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
-
安装成功
# 查看容器状态 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9ae4554bb146 mysql "docker-…" 9 minutes ago Up 9 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql-test
-
进入容器
# docker ps中查看容器id 或者使用容器名 $ docker exec -it mysql-test bash $ docker exec -it 9ae4554bb146 bash # 进入后,使用 mysql bash-4.4$ mysql -uroot -p
其他
- 容器化技术的发展,早于Docker的出现,而Docker 使其更加流行,尤其拥抱云原生时代。
- Docker 使用Go 语言开发,也为Go的布道起到推波助澜的作用。
- Docker 和 k8s 是搭配使用。Docker侧重在容器,k8s侧重在对大规模容器的编排管理。
- Docker提供的Compose 和k8s 关系?都是管理多容器工具,配置也很像,但能力差别很大。docker-compose 是侧重单机多容器运行的工具;k8s 是一个集群的管理解决方案,它负责管理数量庞大的节点。