Docker 是一个开源工具,它可以将你的应用打包成一个标准格式的镜像,并且以容器的方式运行(还有CRI-O、Containerd等容器运行时)。
Docker由
docker-clientdockerdcontainerddocker-shimrunc组成Docker 容器将一系列软件包装在一个完整的文件系统中 ,这个文件系统包含应用程序运行所需要的一切:代码、运行时工具、系统工具、系统依赖,几乎有任何可以安装在服务器上的东西。 这些策略保证了容器内应用程序运行环境的稳定性,不会被容器外的系统环境所影响。
- 轻量级;共享系统
Kernel,这使得他们可以启动迅速启动而且占用内存极少。- 开放;基于开放标准,Docker 可以运行在多个操作系统运行。
- 安全;将各个应用程序隔离开来,这给所有的应用程序提供了一层额外的安全防护。
容器与虚拟机比较:
- 虚拟机包含用户的程序,必要的函数库和整个客户操作系统,所有的这些差不多需要占用 好几个GB的空间
- 容器包含用户的程序和所有的依赖,但是容器之间是共享
Kernel的。各个容器在宿主机 上互相隔离,并且在用户态下运行。
安装并启动Docker
Docker 就是这样的一个工具。帮助开发者很方便的构建、部署、运行自己的程序,还可以非常迅捷的测试你的项目并将其部署到生产环境中。
安装
# 卸载旧版本sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 设置存储库sudo yum install -y yum-utils# 官方源sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo# 清华大学源sudo yum-config-manager \--add-repo \https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo# 安装Docker最新版本sudo yum install docker-ce docker-ce-cli containerd.io# 查询版本列表sudo yum list docker-ce --showduplicates | sort -r# 安装Docker 指定版本sudo yum install docker-ce-<版本号> docker-ce-cli-<版本号> containerd.io
启动
# 启动Docker 服务sudo systemctl start docker# 验证Docker 是否安装正确sudo docker run hello-world
卸载
# 移除组件sudo yum remove docker-ce docker-ce-cli containerd.io# 删除所有镜像、容器和卷sudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd
使用 Docker
Docker Hub
Docker Hub 是一个由 Docker 公司运行和管理的基于云的存储库。它是一个在线存储库,Docker 镜像可以由其他用户发布和使用。
Docker命令
| 命令 | 描述 |
|---|---|
| docker info | 显示Docker 系统信息,包括镜像和容器数 |
| docker version | 显示Docker 版本信息 |
容器生命周期管理
| 命令 | 描述 | 举个🌰 |
|---|---|---|
| docker create [镜像名]:[TAG] | 创建一个容器但不启动它 | |
| docker run [镜像名]:[TAG] | 创建并运行一个新容器 | |
| docker start [容器名|容器ID] | 启动一个或多个处于停止状态的容器 | docker start cea968a92c01 |
| docker stop [容器名|容器ID] | 将正在运行的容器停止 | docker stop cea968a92c01 |
| docker restart [容器名|容器ID] | 重启容器 | docker restart cea968a92c01 |
| docker kill [容器名|容器ID] | 杀死(强制)正在运行中的容器 | docker kill cea968a92c01 |
| docker rm [容器名|容器ID] | 删除一个或多个容器 | docker rm cea968a92c01 |
| docker pause [容器名|容器ID] | 暂停容器中所有的进程 | docker pause cea968a92c01 |
| docker unpause [容器名|容器ID] | 恢复容器中所有的进程 | docker unpause cea968a92c01 |
| docker exec [OPTIONS] [容器名|容器ID] /bin/bash | 进入到容器内 | docker exec -it 66c6f21aa2d1 /bin/bash |
| docker ps -all | 查看所有容器 |
容器操作
| 命令 | 参数说明 | 描述 | 举个🌰 |
|---|---|---|---|
| docker ps | 查看容器列表 | ||
| docker inspect [容器名|容器ID] | -f 指定返回值的模板文件 -s 显示总的文件大小 —type 为指定类型返回JSON |
获取容器的元数据 | |
| docker top [容器名|容器ID] | 查看容器中运行的进程信息 | ||
| docker attach [容器名|容器ID] | 挂载到容器上查看屏幕 | docker attach -sig-proxy=false cea968a92c01 | |
| docker events [OPTIONS] | -f 根据条件过滤事件 —since 从指定的时间戳后显示所有事件 —until 流水时间显示到指定的时间为止 |
从服务器获取实时的事件 | |
| docker logs [容器名|容器ID] | -f 跟踪日志输出 —since 显示某个开始时间的所有日志 -t 显示时间戳 —tail 仅列出最新N条容器日志 |
获取容器的日志 | docker start cea968a92c01 |
| docker wait [容器名|容器ID] | 阻塞运行知道容器停止,然后打印退出代码 | ||
| docker export [容器名|容器ID] | -o 将输入内容写到文件 | 将文件系统作为一个tar归档文件导出到STDOUT | |
| docker port [容器名|容器ID] | 列出指定的容器的端口映射 | ||
| docker commit [容器名|容器ID] | -a 提交的镜像作者; -c 使用Dockerfile指令来创建镜像 -m 提交时的说明文字 -p 在commit时,将容器暂停 |
从容器中创建一个新对象 | |
| docker cp [容器名|容器ID]:[路径] [宿主机路径] | 用于容器与宿主机之间数据拷贝 | ||
| docker diff [容器名|容器ID] | 检查容器文件结构的更改 |
镜像管理
| 命令 | 参数 | 描述 | 举个🌰 |
|---|---|---|---|
| docker images | -a 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层) —digests 显示镜像的摘要信息 -f 显示满足条件的镜像 —format 指定返回值的模板文件 —no-trunc 显示完整的镜像信息 -q :只显示镜像ID |
查看镜像列表 | docker images jdk |
| docker rmi [镜像名] | 删除本地镜像 |
打包命令
| 命令 | 描述 | 举个🌰 |
|---|---|---|
| docker tag [源镜像名]:[源镜像TAG] [新镜像名称]:[新镜像TAG] | 标记(复制)本地镜像 | docker tag hello-world:latest ay-a/hello:0.1 |
| docker push [镜像名]:[TAG] | 推送镜像到仓库 | docker push myimages:0.1 |
| docker history [镜像名] | 查看指定镜像的创建历史 | |
| docker save [镜像名] | 将指定镜像保存成tar 归档文件 | |
| docker load < [tar.gz文件] | 导入使用save导出的镜像 | docker load < busybox.tar.gz |
| docker import [tar.gz文件] [镜像名] | 从归档文件中创建镜像 | docker import my_ubuntu_v3.tar runoob/ubuntu:v4 |
Dockerfile 文件
# 基于源镜像FROM adoptopenjdk:14-jdk-hotspot# 添加文件ADD ./web-1.0.0.jar /opt# 工作目录WORKDIR /opt# 申明端口EXPOSE 8081# 启动的脚本 shCMD ["sh", "-c", "java ${OPT} -jar -Duser.timezone=GMT+08 xxx.jar"]
Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具;通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
安装
# 下载sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 授权sudo chmod +x /usr/local/bin/docker-compose# 创建快捷方式(文件影子)sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
yaml 文件
- version 指定本 yml 依从的 compose 哪个版本制定的
build 指定为构建镜像上下文路径
1) context:上下文路径2) dockerfile:指定构建镜像的 Dockerfile 文件名 3) args:添加构建参数,这是只能在构建过程中访问的环境变量 4) labels:设置构建镜像的标签 5) target:Tag
version: '3.8'services:# 服务名称nginx:# 镜像image: nginx:1.19.1# 容器名称container_name: nginx# 宿主机端口ports:- "80:80"- "443:443"# 每次拉取最新restart: always# 挂载磁盘volumes:- /opt/nginx/default.conf:/etc/nginx/conf.d/default.conf- /opt/nginx/cert:/certmongo:image: mongo:4.4container_name: mongoports:- "27017:27017"restart: alwaysvolumes:- /opt/mongo/data:/data/db
基础命令
| 命令 | 参数 | 描述 |
|---|---|---|
| docker-compose build | 构建或者重新构建服务 | |
| docker-compose config | 输出配置 | |
| docker-compose create [option] [服务名称] | —build 在创建容器之间构建镜像 | 创建容器 |
| docker-compose down | —rmi [all|local] | |
| docker-compose events [服务名称] | 将事件用JSON输出 | |
| docker-compose exec [option] [服务名称] [bash|sh] | -d 后台运行命令 —privileged 为进程提供扩展权限 -u 以该用户身份运行命令 |
进入到容器内 |
| docker-compose images | 显示使用到的镜像 | |
| docker-compose kill [服务名称] | 结束掉指定运行的容器服务 | |
| docker-compose logs [服务名称] | -f 关注日志 —tail [行数] -t 显示时间戳 —until [时间] 在指定时间之前显示内容 |
输出容器内日志 |
| docker-compose pause [服务名称] | 暂停正在运行的容器 | |
| docker-compose port [服务名称] | 显示绑定的公共端口 | |
| docker-compose ps | 列出所有运行容器 | |
| docker-compose pull | -q 不输出进度 | 拉取镜像 |
| docker-compose push [服务名称] | 将镜像推送到各自的仓库 | |
| docker-compose restart | 重启现在正在运行或已经停止的容器 | |
| docker-compose rm [服务名称] | 删除指定服务的容器 | |
| docker-compose run [option] [服务名称] | -d 后台运行 —name 设置容器名称 -e [KEY=VALUE] 环境变量 -u 指定的用户名运行 —rm 运行完成后删除容器 -p 将容器端口映射到宿主机 -v 挂载磁盘 |
运行一个容器 |
| docker-compose scale [服务名=数量] | 设置指定服务的容器数量 | |
| docker-compose start [服务名称] | 启动构建服务 | |
| docker-compose stop [服务名称] | 关闭启动服务 | |
| docker-compose top [服务名称] | 显示指定服务(不指定则全部)正在运行的进程 | |
| docker-compose unpause [服务名称] | 继续被暂停挂起的容器 | |
| docker-compose up [服务名称] | -d 后台启动 | 启动指定服务名称(不指定则全部) |

———- 以下内容等待迁移 ———
Linux Namespace
Linux Namespace Kernel的一个功能,它可以隔离系列的系统资源,比如 PIO ( Process ID )、 User ID Network 等。 一般看到这里,很多人会想到一个命令 chroot ,就像chroot 允许把当前目录变成根目录一样(被隔离开来的) , Namespace 也可以在 些资源上,将进程隔离起来,这些资源包括进程树、网络接口、挂载点等。
Namespace API 主要使用如下3个系统调用:
- clone();创建新进程。根据系统调用参数来判断哪些类型的 Namespace 被创建,而且它们的子进程也会被包含到这些 Namespace 中
- unshare();将进程移出某个 Namespaceo
- setns() ;将进程加入到 Namespace 中
// TODO IPC , UTC Mount User Network 迁移到Linux 章节
