一 Docker 简介
1.1 docker 由来
Docker 的英文翻译是 "码头工人", 即搬运工, 它搬运的东西就是我们常说的集装箱 Container,Container 里面装的是任意类型的 App. 我们的开发人员可以通过 Docker 将 App 变成一种标准的, 可移植的, 自管理的组件, 我们可以在任何主流的操作系统中开发, 调试和运行.
从概念上来看, Docker 和传统的虚拟机比较类似, 只是更轻量级, 更方便使用. Docker 和虚拟机最主要的区别有以下几点:
虚拟化技术依赖的是物理 CPU 和内存, 是硬件级别的; Docker 是构建在操作系统层面的, 复用操作系统的容器化技术, 所以 Docker 同样可以运行在虚拟机上面.
虚拟机中的操作系统是一个完整的操作系统镜像, 比较复杂; 而 Docker 比较轻量级, 我们可以用 Docker 部署一个独立的 Redis, 就类似于在虚拟机当中安装一个 Redis 应用, 但 Docker 部署的应用是完全隔离的.
传统的虚拟机技术是通过快照来保存状态的; 而 Docker 引入了类似于源码管理的机制, 将容器历史版本一一记录下来, 切换成本非常之低.
传统的虚拟化技术在构建系统的时候非常复杂; 而 Docker 可以通过一个简单的 Dockerfile 文件来构建整个容器, 更重要的是 Dockerfile 可以手动编写, 这样应用程序开发都可以通过发布 Dockerfile 来定义应用的环境和依赖, 对于持续交付非常有利.
1.2 容器和虚拟化
下面是 docker 与虚拟机的简单对比图:
特性 | 容器 | 虚拟机 |
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
管理效率 | 管理简单 | 概念里复杂 |
Docker 运行在物理机上与运行在虚拟机上的对比:
二 容器的优势特性
2.1 使用原因
一个做好的应用容器长的就像一个装好了一组特定应用的虚拟机一样, 比如我们现在想用 Redis, 那我就找个装好了 Redis 的容器就可以了, 然后运行起来, 我就能直接使用了.
那为什么不直接安装一个 Redis 呢? 肯定是可行的, 但是有的时候根据每个人电脑的不同, 操作系统的不同, Redis 的安装方法也各不相同. 而且万一机器故障, 应用迁移, 所有当前机器上安装的应用还需要在新的机器上再全部重新安装一次. 但是如果使用容器就要简单多了, 你就相当于有了一个快速运行起来的虚拟机, 而且方便快速移植. 只要你能运行容器, Redis 的配置就省了.
2.2 特性
标准化
保证一致的运行环境
弹性伸缩, 快速扩容
方便迁移
持续集成, 持续交付与持续部署
高性能
不需要进行硬件虚拟以及运行完整的操作系统
轻量级
快速启动
隔离性
进程隔离
2.3 Docker 引擎
Docker 引擎是一个 C/S 架构的应用程序
常驻后台进程 Dockerd
一个用来与 Dockerd 交互的 REST API Server
命令行 CLI 接口, 通过与 REST API 进行交互 (docker 命令)
2.4 Docker 架构说明
Docker 使用 C/S 体系的架构, Docker 客户端与 Docker 守护进程通信, Docker 守护进程负责构建, 运行和分发 Docker 容器. Docker 客户端和守护进程可以在同一个系统上运行, 也可以将 Docker 客户端连接到远程 Docker 守护进程. Docker 客户端和守护进程使用 REST API 通过 unix 套接字或网络接口进行通信.
下面是 Docker 核心组件及元素说明:
Docker Daemon: dockerd, 用来监听 Docker API 的请求和管理 Docker 对象, 比如镜像, 容器, 网络和 Volume.
Docker Client:docker,docker client 是我们和 Docker 进行交互的最主要的方式方法, 比如我们可以通过 docker run 命令来运行一个容器, 然后我们的 docker client 会把命令发送给上面的 Dockerd, 主它来负责处理.
Docker Registry: 用来存储 Docker 镜像的仓库, Docker hub 是官方提供的一个公共仓库, 而且 Docker 默认也是从 Docker Hub 上查找镜像的. 当然你也可以很方便的运行一个私有仓库, 当我们使用 docker pull 或者 docker run 命令时, 就会从我们配置的 docker 镜像仓库中去拉取镜像, 使用 docker push 时, 会将我们构建的镜像推送到对应的镜像仓库中.
Images: 镜像, 镜像是一个只读模板 , 带有创建 docker 容器的说明. 一般来说, 镜像会基于另外的一些基础镜像构建并加上一些额外的自定义功能. 比如你可以构建一个基于 CentOS 的镜像, 然后在这个基础镜像上面安装一个 Nginx 应用, 这样就可以构建成属于我们自己的镜像了.
Containers: 容器, 容器是一个镜像的运行实例. 可以使用 Docker REST API 或者 CLI 来操作容器. 容器的实质是进程, 但与直接在宿主机执行的进程不同, 容器进行运行于属于自己独立的命名空间. 因此容器可以拥有自己的 root 文件系统, 自己的网络配置, 自己的进程空间, 甚至自己的用户 id 空间. 容器内的进程是运行在一个隔离的环境里, 使用起来, 就好像在一个独立于宿主的系统下操作一样. 这种特性使得容器封装的应用比直接在宿主机运行更加案例.
三 Docker 安装
3.1 Docker 版本介绍
docker-io:docker 早期版本, 支持到 1.13, 在 CentOS 6.x 系统上只能使用 docker-io
docker-ce: 当前 docker 发行版本
docker-ee:docker 商业版本
本次使用使用的是 CentOS 系统, 安装 zai CentOS 上
3.2 安装
安装必要的系统工具
- [[email protected] ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
- [[email protected] ~]# yum update
安装 docker 源
- [[email protected] ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- [[email protected] ~]# yum makecache fast
- [[email protected] ~]# yum -y install docker-ce
- [[email protected] ~]# systemctl restart docker
- [[email protected] ~]# systemctl status docker
- docker.service - Docker Application Container Engine
- Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
- Active: active (running) since Sat 2019-11-09 02:36:44 EST; 10min ago
- Docs: https://docs.docker.com
- Main PID: 62112 (dockerd)
- Tasks: 13
- Memory: 46.2M
- CGroup: /system.slice/docker.service
└─62112 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
- Nov 09 02:36:44 docker-server1 dockerd[62112]: time="2019-11-09T02:36:44.288676502-05:00" level=info msg="scheme \...=grpc
- Nov 09 02:36:44 docker-server1 dockerd[62112]: time="2019-11-09T02:36:44.288692565-05:00" level=info msg="ccResolv...=grpc
- Nov 09 02:36:44 docker-server1 dockerd[62112]: time="2019-11-09T02:36:44.288723178-05:00" level=info msg="ClientCo...=grpc
- Nov 09 02:36:44 docker-server1 dockerd[62112]: time="2019-11-09T02:36:44.316499988-05:00" level=info msg="Loading ...art."
- Nov 09 02:36:44 docker-server1 dockerd[62112]: time="2019-11-09T02:36:44.470346871-05:00" level=info msg="Default ...ress"
- Nov 09 02:36:44 docker-server1 dockerd[62112]: time="2019-11-09T02:36:44.525457432-05:00" level=info msg="Loading ...one."
- Nov 09 02:36:44 docker-server1 dockerd[62112]: time="2019-11-09T02:36:44.545391836-05:00" level=info msg="Docker d....03.4
- Nov 09 02:36:44 docker-server1 dockerd[62112]: time="2019-11-09T02:36:44.545511423-05:00" level=info msg="Daemon h...tion"
- Nov 09 02:36:44 docker-server1 dockerd[62112]: time="2019-11-09T02:36:44.565917783-05:00" level=info msg="API list...sock"
- Nov 09 02:36:44 docker-server1 systemd[1]: Started Docker Application Container Engine.
- Hint: Some lines were ellipsized, use -l to show in full.
3.3 docker 配置文件说明
在 docker-ce 中, 已废弃 / etc/sysconfig/docker 这种配置方式, 转而采用 / etc/docker/daemon.JSON 来配置
下面简单列一下 daemon.JSON 的配置项与说明:
- {
- "api-cors-header": "",
- "authorization-plugins": [],
- "bip": "",
- "bridge": "",
- "cgroup-parent": "",
- "cluster-store": "",
- "cluster-store-opts": {},
- "cluster-advertise": "",
- #启用 debug 的模式, 启用后, 可以看到很多的启动信息. 默认 false
- "debug": true,
- "default-gateway": "",
- "default-gateway-v6": "",
- "default-runtime": "runc",
- "default-ulimits": {},
- "disable-legacy-registry": false,
- #容器 DNS 的地址, 在容器的 / etc/resolv.conf 文件中可查看
- "dns": ["192.168.80.1"],
- "dns-opts": [],
- "dns-search": [],
- "exec-opts": [],
- "exec-root": "",
- "fixed-cidr": "",
- "fixed-cidr-v6": "",
- #已废弃, 使用 data-root 代替
- "graph": "/var/lib/docker",
- #Docker 运行时使用的根路径, 根路径下的内容稍后介绍, 默认 / var/lib/docker
- "data-root": "/var/lib/docker",
- "group": "", #Unix 套接字的属组, 仅指 / var/run/docker.sock
- "hosts": [], #设置容器 hosts
- "icc": false,
- "insecure-registries": [],
- "ip": "0.0.0.0",
- "iptables": false,
- "ipv6": false,
- "ip-forward": false,
- "ip-masq": false,
- "labels": ["nodeName=node-121"]
- "live-restore": true,
- "log-driver": "",
- "log-level": "",
- "log-opts": {
- "max-file": "5",
- "max-size": "50m"
- },
- "max-concurrent-downloads": 3,
- "max-concurrent-uploads": 5,
- "mtu": 0,
- "oom-score-adjust": -500,
- "pidfile": "", #Docker 守护进程的 PID 文件
- "raw-logs": false,
- "registry-mirrors": ["xxxx"], #镜像加速的地址, 增加后在 docker info 中可查看.
- "runtimes": {
- "runc": {
- "path": "runc"
- },
- "custom": {
- "path": "/usr/local/bin/my-runc-replacement",
- "runtimeArgs": [
- "--debug"
- ]
- }
- },
- "selinux-enabled": false, #参考: Docker 的启动参数
- "storage-driver": "overlay2",
- "storage-opts": [],
- "swarm-default-advertise-addr": "",
- "tls": true, #参考: Docker 的启动参数
- "tlscacert": "", #参考: Docker 的启动参数
- "tlscert": "", #参考: Docker 的启动参数
- "tlskey": "", #参考: Docker 的启动参数
- "tlsverify": true, #参考: Docker 的启动参数
- "userland-proxy": false,
- "userns-remap": ""
- }
docker systemd 启动说明
- [Unit]
- Description=Docker Application Container Engine
- Documentation=https://docs.docker.com
- BindsTo=containerd.service
- After=network-online.target firewalld.service containerd.service
- Wants=network-online.target
- Requires=docker.socket
- [Service]
- Type=notify
- # the default is not to use systemd for cgroups because the delegate issues still
- # exists and systemd currently does not support the cgroup feature set required
- # for containers run by docker
- ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
- ExecReload=/bin/kill -s HUP $MAINPID
- TimeoutSec=0
- RestartSec=2
- Restart=always
- # Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
- # Both the old, and new location are accepted by systemd 229 and up, so using the old location
- # to make them work for either version of systemd.
- StartLimitBurst=3
- # Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
- # Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
- # this option work for either version of systemd.
- StartLimitInterval=60s
- # Having non-zero Limit*s causes performance problems due to accounting overhead
- # in the kernel. We recommend using cgroups to do container-local accounting.
- LimitNOFILE=infinity
- LimitNPROC=infinity
- LimitCORE=infinity
- # Comment TasksMax if your systemd version does not support it.
- # Only systemd 226 and above support this option.
- TasksMax=infinity
- # set delegate yes so that systemd does not reset the cgroups of docker containers
- Delegate=yes
- # kill only the docker process, not all processes in the cgroup
- KillMode=process
- MountFlags=slave # 解决目录被其它的容器挂载使用, 导致已经退出的容器无法被删除的问题
- [Install]
- WantedBy=multi-user.target
重启 Docker
- [[email protected] ~]# systemctl restart docker
- [[email protected] ~]# systemctl status docker
参考文档: https://www.cnblogs.com/breezey/p/9123098.html
来源: http://www.bubuko.com/infodetail-3280852.html