Docker 是一个开源工具,它可以将你的应用打包成一个标准格式的镜像,并且以容器的方式运行(还有CRI-O、Containerd等容器运行时)。
Docker由
docker-client
dockerd
containerd
docker-shim
runc
组成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/docker
sudo 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
# 启动的脚本 sh
CMD ["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:/cert
mongo:
image: mongo:4.4
container_name: mongo
ports:
- "27017:27017"
restart: always
volumes:
- /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 章节