一.docker详解
docker的背景与发展
- docker的官网https://www.docker.com/
- docker是一个开源的项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的go语言实现。项目后来加入了Linux基金会,遵从了Apache2.0协议,项目代码在GitHub上进行维护
- docker自开源后受到广泛的关注和讨论,以至于dotCloud公司后来都改名为Docker Inc。Redhat已经在其RHEL6.5中集中支持Docker;Google也在其Paas产品中广泛应用
- Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。docker的基础是Linux容器(LXC)技术。在LXC的基础上docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作docker容器就像操作一个快速轻量级的虚拟机一样简单
- docker属于LXC的一种封装,提供简单易用的容器使用接口。
- docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里面运行,就好像在真实的物理机上运行一样。有了docker,就不用担心环境问题
- 总体来说,docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样
docker与传统虚拟化的比较
virtual machine
- virtual machine就是带环境安装的一种方案,它可以在一种操作系统里面运行另外一种操作系统,比如在windows系统里面运行Linux系统。应用程序对此毫无感知,因为虚拟机和真实系统一样,对于底层系统来说,虚拟机就是一个普通文件,不需要可以删掉,对其他文件无影响
- 但是Virtual machine 占用资源多、冗余步骤多、启动慢
Linux containers
- Linux (containers),不是模拟一个完整的操作系统,而是对进程进行隔离,或者说,在正常进程的外面加了一个保护层,对于容器里面的进程来说,他接触到的各种资源都是虚拟的,从而实现与底层系统的隔离
- 而容器相比于虚拟机是进程级的,容器启动快、资源占用少、体积小
docker的优势
- 更快速的交付和部署
docker在整个开发周期都可以完美的辅助你实现快速交付。
docker允许开发者在装有应用和服务本地容器开发。可以直接集成到可持续开发流程中
docker容器的启动时间是秒级的,大量地节约了开发、测试、部署的时间
例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。
- 高效的部署和扩容
docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、pc、服务器。
这种兼容性可以让用户把一个应用程序从平台直接迁移到另外一个
docker的兼容性和轻量型可以很轻松的实现负载的动态管理,可以快速扩容或者方便的下线应用和服务,趋近于实时
- 更高的资源利用率
docker对系统资源的利用率很高,一台主机上可以同时运行数据个docker容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行10个不同的应用就要10个虚拟机,而docker只需要启动10个隔离的应用即可
- 更简单的管理
使用docker,只需要小小的修改,就可以替代以往的大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理
docker的核心概念
- image(镜像)
docker镜像就是一堆只读层的统一视角(统一文件系统技术能够将不同的层整合成为一个文件系统,为这些层提供一个统一的视角,在用户看来,只存在一个文件系统)
例如:一个镜像可以包含一个完整的操作系统环境,里面仅仅安装了Apache或用户需要的其他应用程序
镜像可以用来创建docker容器,一个镜像可以创建很多容器
docker提供了一个很简单的机制来创建镜像或者更新已有的镜像,用户也可以直接从其他人哪里下载一个已经做好的镜像来直接使用
- repository(仓库)
仓库是集中存放镜像文件的场所。
有时候会把仓库和仓库注册服务器当作同一含义。实际上仓库注册服务器存放着很多仓库,每个仓库之间又包含了多个镜像,每个镜像又有不同的标签(tag)
仓库分为公开仓库(public)和私有仓库(private)两种形式。最大的公开仓库的Docker Hub,存放了数量庞大的镜像,提供用户下载。国内的公开仓库包括时速云、网易云等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库
当用户创建了自己的镜像之后就可以使用push命令将镜像上传到公有或者私有仓库中,这样下次可以在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了
Docker仓库概念和Git类似,注册服务器可以理解为GItHub这样的托管服务
- container(容器)
Docker利用容器(container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序
容器的定义和镜像几乎一样,也是一堆层的统一视角,唯一的区别在于容器的最上面那一层是可读写的
一个运行当中的容器被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程
而正是文件系统隔离技术使得docker成为了一个非常有潜力的虚拟化技术。一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层
docker的引擎
- docker引擎是一个C/S结构的应用,主要组件如下
- server是一个常驻进程
- REST API实现了client和server间的交互协议
- CLI实现了容器和镜像的管理,为用户提供了统一的操作界面
docker的架构
- docker使用c/s架构,client通过接口与server进程通信实现容器的构建,运行和发布。
- client和server可以运行在同一台集群中,也可以实现跨主机远程通信
docker的基本命令
- 获取镜像
docker pull
如:docker pull centos:centos6
-
查看镜像列表
docker images
-
创建镜像
docker build
-
上传镜像
docker push
-
创建容器
docker create <image-id>
-
启动容器
docker start <container-id>
-
进入容器
docker exec <container-id>
-
停止容器
docker stop <container-id>
-
删除容器
docker rm <container-id>
-
运行容器
docker run <image-id>
-
查看容器列表
docker ps
-
删除镜像
docker rmi <image-id>
-
镜像保存
docker save <image-id>
-
容器导出
docker export <container-id>
二.docker的部署以及镜像加速
- 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
-
由于本地没有关于docker的源,因此必须要加载docker源
-
安装docker,
yum install -y docker-ce
-
关闭安全性功能(可以选择永久性关闭),开启docker服务
systemctl stop firewalld
setenforce 0
##开启docker服务
systemctl start docker.service
systemctl enable docker.service
- 查看nginx的镜像
[root@localhost ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 12772 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1750 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 758 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 95
bitnami/nginx Bitnami nginx Docker Image 77 [OK]
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 63 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 45
nginxdemos/hello NGINX webserver that serves a simple page co… 41 [OK]
nginx/unit NGINX Unit is a dynamic web and application … 36
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 35 [OK]
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 28
privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 21 [OK]
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 18 [OK]
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 13
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 13 [OK]
centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 12
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 12
raulr/nginx-wordpress Nginx front-end for the official wordpress:f… 12 [OK]
nginx/nginx-prometheus-exporter NGINX Prometheus Exporter 9
sophos/nginx-vts-exporter Simple server that scrapes Nginx vts stats a… 7 [OK]
mailu/nginx Mailu nginx frontend 6 [OK]
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 4 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 1 [OK]
wodby/nginx Generic nginx 0 [OK]
centos/nginx-110-centos7 Platform for running nginx 1.10 or building … 0
-
由于直接下载镜像,速度很慢,而一般镜像有比较大,所以我们进行镜像加速,使用阿里云的源,即开启阿里云的镜像加速
##由于我们下载的docker版本是19.03.7,满足加速的条件
[root@localhost docker]# docker version
Client: Docker Engine - Community
Version: 19.03.7
API version: 1.40
Go version: go1.12.17
Git commit: 7141c199a2
Built: Wed Mar 4 01:24:10 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.7
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: 7141c199a2
Built: Wed Mar 4 01:22:45 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
[root@localhost docker]# ls
key.json
[root@localhost docker]# cd
##由于已经存在/etc/docker这个目录。所以我们不需要创建
##且在root账户下,不需要sudo提权
[root@localhost ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://dnntzrw4.mirror.aliyuncs.com"]
}
EOF
[root@localhost docker]# ls
daemon.json key.json
[root@localhost docker]# cat daemon.json
{
"registry-mirrors": ["https://dnntzrw4.mirror.aliyuncs.com"]
}
[root@localhost docker]# systemctl daemon-reload
[root@localhost docker]# systemctl restart docker
-
下载镜像
[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
68ced04f60ab: Pull complete
28252775b295: Pull complete
a616aa3b0bf2: Pull complete
Digest: sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6678c7c2e56c 3 days ago 127MB
[root@localhost ~]#