Docker 是一个开源工具,它可以将你的应用打包成一个标准格式的镜像,并且以容器的方式运行(还有CRI-O、Containerd等容器运行时)

Docker由 docker-client dockerd containerd docker-shim runc 组成

Docker 容器将一系列软件包装在一个完整的文件系统中 ,这个文件系统包含应用程序运行所需要的一切:代码、运行时工具、系统工具、系统依赖,几乎有任何可以安装在服务器上的东西。 这些策略保证了容器内应用程序运行环境的稳定性,不会被容器外的系统环境所影响。

  • 轻量级;共享系统Kernel,这使得他们可以启动迅速启动而且占用内存极少。
  • 开放;基于开放标准,Docker 可以运行在多个操作系统运行。
  • 安全;将各个应用程序隔离开来,这给所有的应用程序提供了一层额外的安全防护。

容器与虚拟机比较:

  • 虚拟机包含用户的程序,必要的函数库和整个客户操作系统,所有的这些差不多需要占用 好几个GB的空间
  • 容器包含用户的程序和所有的依赖,但是容器之间是共享Kernel 的。各个容器在宿主机 上互相隔离,并且在用户态下运行。

以下测试环境全部都是基于CentOS 8 系统安装

安装并启动Docker

Docker 就是这样的一个工具。帮助开发者很方便的构建、部署、运行自己的程序,还可以非常迅捷的测试你的项目并将其部署到生产环境中。

安装

  1. # 卸载旧版本
  2. sudo yum remove docker \
  3. docker-client \
  4. docker-client-latest \
  5. docker-common \
  6. docker-latest \
  7. docker-latest-logrotate \
  8. docker-logrotate \
  9. docker-engine
  10. # 设置存储库
  11. sudo yum install -y yum-utils
  12. # 官方源
  13. sudo yum-config-manager \
  14. --add-repo \
  15. https://download.docker.com/linux/centos/docker-ce.repo
  16. # 清华大学源
  17. sudo yum-config-manager \
  18. --add-repo \
  19. https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
  20. # 安装Docker最新版本
  21. sudo yum install docker-ce docker-ce-cli containerd.io
  22. # 查询版本列表
  23. sudo yum list docker-ce --showduplicates | sort -r
  24. # 安装Docker 指定版本
  25. sudo yum install docker-ce-<版本号> docker-ce-cli-<版本号> containerd.io

启动

  1. # 启动Docker 服务
  2. sudo systemctl start docker
  3. # 验证Docker 是否安装正确
  4. sudo docker run hello-world

卸载

  1. # 移除组件
  2. sudo yum remove docker-ce docker-ce-cli containerd.io
  3. # 删除所有镜像、容器和卷
  4. sudo rm -rf /var/lib/docker
  5. 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 文件

  1. # 基于源镜像
  2. FROM adoptopenjdk:14-jdk-hotspot
  3. # 添加文件
  4. ADD ./web-1.0.0.jar /opt
  5. # 工作目录
  6. WORKDIR /opt
  7. # 申明端口
  8. EXPOSE 8081
  9. # 启动的脚本 sh
  10. CMD ["sh", "-c", "java ${OPT} -jar -Duser.timezone=GMT+08 xxx.jar"]

Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具;通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

安装

  1. # 下载
  2. 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
  3. # 授权
  4. sudo chmod +x /usr/local/bin/docker-compose
  5. # 创建快捷方式(文件影子)
  6. sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

yaml 文件

  • version 指定本 yml 依从的 compose 哪个版本制定的
  • build 指定为构建镜像上下文路径

    1. 1) context:上下文路径

    2) dockerfile:指定构建镜像的 Dockerfile 文件名 3) args:添加构建参数,这是只能在构建过程中访问的环境变量 4) labels:设置构建镜像的标签 5) target:Tag

  1. version: '3.8'
  2. services:
  3. # 服务名称
  4. nginx:
  5. # 镜像
  6. image: nginx:1.19.1
  7. # 容器名称
  8. container_name: nginx
  9. # 宿主机端口
  10. ports:
  11. - "80:80"
  12. - "443:443"
  13. # 每次拉取最新
  14. restart: always
  15. # 挂载磁盘
  16. volumes:
  17. - /opt/nginx/default.conf:/etc/nginx/conf.d/default.conf
  18. - /opt/nginx/cert:/cert
  19. mongo:
  20. image: mongo:4.4
  21. container_name: mongo
  22. ports:
  23. - "27017:27017"
  24. restart: always
  25. volumes:
  26. - /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 后台启动 启动指定服务名称(不指定则全部)

image.png

———- 以下内容等待迁移 ———

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 章节