# 什么是 Docker
随着技术的发展,计算机硬件越来越强,随之诞生出一些需求,其中一个是,想要充分的利用硬件,在一台计算机上运行多个操作系统,每个操作系统可以运行不同的应用来达到所需的要求,由此出线了虚拟机技术。
虚拟机技术是在操作系统层上面又增加了一个虚拟机管理层,每当创建一个虚拟机,就会在虚拟机里再创建一个操作系统。这种做法的坏处在于虚拟机创建的独立的操作系统极大消耗了系统以及硬件资源。
为了解决避免这个问题诞生了容器 (Container) 技术,它和虚拟机技术的差别在于容器里不需要再跑独立的操作系统了,只运行一套操作系统。
容器技术可以做什么?
容器技术可以解决软件开发中环境配置的难题。开发环境转到测试环境和生产环境,只需要将容器用一条命令部署即可。
Docker 就是其中一种容器技术。
Docker 技术的特点:
- 基于 Linux 的虚拟技术
- 通过对进程的隔离实现容器技术
- 体积小
- 暂用资源很少
- 快速启动
Docker 中有几个概念:
Docker Image (镜像): 包含了容器所需要所有信息的定义,可以用 Image 产生一个或者多个容器。我们交付的也是 Image。
Docker Container (容器): 容器是镜像运行的实例,会共享其所在主机的操作系统 / 内核。
# Mac 安装 Docker
为了避免 Docker Desktop 版权问题,Docker 采用 Colima + Docker 的方式。
| brew install docker docker-compose colima |
| |
| sudo vim ~/.zshrc |
| |
| export DOCKER_HOST="unix://${HOME}/.colima/default/docker.sock" |
| |
| source ~/.zshrc |
# Image 相关命令
- 查看本地镜像
| docker images [OPTIONS] |
| |
| |
| 常用参数: |
| -a :列出所有的镜像 (含历史映像层) |
| -q :只显示镜像ID |
- 查找镜像
| docker search [OPTIONS] |
| |
| |
| -- limit n |
- 拉取镜像
| docker pull <ImageName>:Tags |
- 查看镜像 / 容器 / 数据卷所占的空间
- 删除镜像
| |
| docker rmi 镜像ID |
| docker rmi -f 镜像ID |
| |
| |
| docker rmi -f 镜像名1:TAG 镜像名2:TAG |
| |
| |
| docker rmi -f $(docker images -qa) |
- 通过 Dcokerfile 构建镜像
| docker build . -t <ImageName>:Tags |
- 保存和导出镜像
| docker save -o FileName <ImageName>:Tags |
| docker load -i FileName |
# Container 相关命令
- 启动容器:
| docker run <ContainerName> |
| docker run <ContainerName>:<Tag> |
| |
| |
| 常用参数: |
| --name=NAME |
| -d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行) |
| |
| -i:以交互模式运行容器,通常与 -t 同时使用; |
| -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用; |
| 也即启动交互式容器(前台有伪终端,等待交互,一般连用,即-it) |
| |
| -P: 随机端口映射,大写P |
| -p: 指定端口映射,小写p |
| --expose=[]: 开放一个端口或一组端口 |
| |
| --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致 |
| |
| --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致 |
| |
| -h: 指定容器的hostname |
| |
| -e username=ritchie: 设置环境变量 |
| --env-file=[]: 从指定文件读入环境变量 |
| --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行 |
| |
| -m :设置容器使用内存最大值; |
| --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型 |
| |
| --link=[]: 添加链接到另一个容器 |
| |
| --volume, -v <HostPath>:<ContainerPath>: 绑定一个卷(路径映射) |
- 查看容器列表
| |
| docker ps |
| |
| 常用参数: |
| -a :列出当前所有正在运行的容器+历史上运行过的 |
| -l :显示最近创建的容器。 |
| -n nu:显示最近nu个创建的容器。 |
| -q :静默模式,只显示容器编号。 |
- 查看一个容器的内部信息
| docker inspect <ContainerID> |
- 进入正在运行的容器进行交互
- docker exec
1.3.x 版本后大的新命令 - docker attach
使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。
| docker exec -it <ContainerID or ContainerName> /bin/bash |
| docker attach <ContainerID or ContainerName> |
exec 是在容器中打开新的终端,并且可以启动新的进程。用 exit 退出,不会导致容器的停止。
attach 直接进入容器启动命令的终端,不会启动新的进程。用 exit 退出,会导致容器的停止。
- 启动运行的容器
| docker start <ContainerID or ContainerName> |
- 重启容器
| docker start <ContainerID or ContainerName> |
- 停止容器
| docker stop <ContainerID or ContainerName> |
| |
| |
| docker kill <ContainerID or ContainerName> |
- 删除已停止的容器
| |
| docker rm <ContainerID> |
| docker rm -f <ContainerID> |
| |
| |
| docker rm -f $(docker ps -a -q) |
| docker ps -a -q | xargs docker rm |
- 查看容器日志
| docker logs <ContainerID> |
- 查看容器内部运行的进程
- 从容器内拷贝文件到主机上
| docker cp <ContainerID>:<ContainerPath> <LocalPath> |
- 导入和导出容器
export
导出容器的内容留作为一个 tar 归档文件 [对应 import 命令]
import
从 tar 包中的内容创建一个新的文件系统再导入为容器 [对应 export]
| docker export <ContainerID> > FileName |
| cat FileName | docker import - <ContainerUser>/<ConatinerName>:<Tags> |
- 查看容器资源占用情况
| docker stats <ContainerID or ContainerName> |
| |
| |
| --all , -a :显示所有的容器,包括未运行的。 |
| --format :指定返回值的模板文件。 |
| --no-stream :展示当前状态就直接退出了,不再实时更新。 |
| --no-trunc :不截断输出。 |
- 从容器创建一个新的镜像
| docker commit [OPTIONS] <ContainerID> [REPOSITORY[:TAG]] |
| |
| |
| -a :提交的镜像作者; |
| -c :使用Dockerfile指令来创建镜像; |
| -m :提交时的说明文字; |
| -p :在commit时,将容器暂停。 |