概述
- Docker 2013 年问世,依赖于 cgroups 技术
- 保证开发、测试、交付和部署的环境完全一致
- 保证资源的隔离 => 资源隔离的好处 // TODO
- 启动临时的、用完即弃的环境,例如测试
- 迅速(秒级)超大规模部署和扩容
Docker 基本概念
- 宿主机 => Docker 所在的容器
- Image => 镜像 => 一个预先定义好的模板文件,Docker 引擎可以按照这个模板文件启动无数个一模一样,互不干扰的容器
- Container => 容器
- 一台虚拟的计算机,拥有独立的网络、文件系统、进程等等
- 默认和宿主机不发生任何交互 => 意味着数据是没有持久化的
- 每个容器都有一个 ID,支持缩写
- Docker 镜像默认是分层的 => 分层的目的或优点: 复用,节省空间
Docker Run
docker run 装载镜像成为一个容器 => 从蛋糕模子做出来一个蛋糕
docker run -it <Image Name> <镜像中要运行的命令和参数> // -it => 交互式命令行,当前 shell 中运行,Ctrl-C 退出
docker run -d <Image Name> <镜像中要运行的命令和参数> // -d => daemon 模式,在后台运行
docker run 参数
-
--name
=> 为容器指定一个名字 -
--restart=always
=> 遇到错误时自动重启 -
-v <本地文件>:<容器文件>
=> 将宿主机的文件映射到 Container 文件,使得宿主机和 Container 可以共同进行读写文件 => volume -
-p <本地端口>:<容器端口>
=> 宿主机端口和 Container 端口相绑定,使得宿主机可以访问 Container 内部的服务 => 可以实现分布式部署 =>-p 8080:8080
+-p 8081:8080
+-p 8082:8080
+ ... => 可以用任意一个端口访问服务,服务是隔离的,是一样的 => port -
-e <Name>=<Value>
=> 环境变量 => environment
Docker 命令
-
docker exec -it <Container ID> <目标命令,通常为 bash>
=> 交互式进入指定目标容器,进入容器执行命令 -
docker images
=> 查看本地已有的 Image -
docker rmi <Image ID>
=> 删除本地 Image =>docker image rm -f <Image ID>
-
docker ps
=> 查看本地当前运行的 Container -
docker run -it mysql
=> 交互式命令行 -
docker start <Container ID>
=> start 一个 Container -
docker stop <Container ID>
= stop 一个 Container -
docker rm <Container ID>
=> 删除一个 Container -
docker rm -f <Container ID>
=> 强制删除一个 Container -
docker logs <Container ID>
=> 查看目标容器的输出 -
docker logs -f <Container ID>
=> 查看最后几行 -
docker inspect <Container ID>
=> 查看容器的详细状态 -
docker build .
=> 使用当前文件夹下的 Dockerfile 生成一个 Image -
docker build -t <IP>:<port>/<ImageName>:<tag> .
=> 使用当前文件夹下的 Dockerfile 生成一个指定 tag 的 Image => 默认是 docker 中心仓库,如果设置了 IP 和 port,将会推到指定的 IP -
docker tag <Image ID> <ImageName>:<Tag>
=> 为 Image 设置 tag => 其中 tag 操作决定了未来这个镜像会被 push 到哪里,使用者需要从哪里下载镜像 =>docker tag <Image ID> 127.0.0.1:5000/hahaha:123
-
docker push <IP>:<port>/<ImageName>:<tag>
=> 推送镜像到指定 IP =>docker push 127.0.0.1:5000/hahaha:123
-
docker pull
=> 下载一个指定的 Image,方便随时启动 -
docker pull mysql:5.7.28
=> 下载一个指定版本的 Image,默认是 latest,其中 5.7.28 是 tag,表明了 version,mysql 是 Image 名字 -
docker pull register.cn-beijing.aliyuncs.com/dr1/mysql:0.0.16
=> 下载一个指定了镜像仓库(register.cn-beijing.aliyuncs.com/dr1/) 的 Image,默认是 Docker 中央仓库
Dockerfile
指定镜像如何生成
# Dockerfile
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y nginx
RUN echo "hahaha" > /usr/share/nginx/html/index.html
EXPOSE 80
Docker 私服
Docker Registry => 可以方便地创建镜像仓库的私服
docker run -d -p 5000:5000 --restart always --name registry registry:2
- 此时 127.0.0.1 相当于一个服务器
-
http://localhost:5000/v2/ =>
{}
- http://localhost:5000/v2/<Image Name>/tags/list => 镜像列表
- --insecure-registry // 私服地址没有 https 时添加
- --registry-mirrors
Kubernetes K8s
Kubernetes 是完全基于 Docker 的一个容器编排引擎,自动化的容器编排引擎,使得容器以统一的自动化的形式进行分布式的提供服务,一个更大体量上的用于自动化的容器编排引擎,自动化是其主要的优点。etcd是 Kubernetes 核心
DevOps Concepts: Pets vs Cattle
- Pets => 出现问题需要修复
- Cattle => 出现问题 Kill 重启一个新的
知识点
- Docker 参数有严格的顺序。镜像名之前是 Docker 本身的参数,没有顺序,镜像名之后是镜像要启动容器的参数,即要传递给容器的参数
- .exe => executable
- Docker set registry mirrors => 可以加速国内访问
- docker 清除 log =>
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
网友评论