docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包括系统。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在LXC的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机
一样简单。
Docker虚拟化有三个概念需要理解,分别镜像、容器、仓库。
镜像:Docker的镜像其实就是模板,跟我们常见的ISO镜像类似,是一个样板。
容器:使用镜像常见的应用或者系统,我们称之为一个容器。
仓库:仓库是存放镜像的地方,分为公开仓库(Public)和私有仓库(Private)两种形式。
docker引擎架构
docker引擎是一个C/S结构的应用
server是一个常驻进程,REST API实现了client和server间的交互协议,CLI实现容器和镜像的管理,为用户提供统一的操作界面。client通过接口与server进程通信实现容器的构建、运行和发布。
安装docker
确保centos系统内核版本高于3.10
[root@localhost ~]# uname -r 3.10.0-514.el7.x86_64
安装依赖包
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
添加docker软件源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
更新YUM缓存
[root@localhost ~]# yum makecache fast
安装docker ce
[root@localhost ~]# yum -y install docker-ce
设置默认国内镜像仓库
[root@localhost ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
启动docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
查看版本
[root@localhost ~]# docker version Client: Version: 18.09.0 API version: 1.39 Go version: go1.10.4 Git commit: 4d60db4 Built: Wed Nov 7 00:48:22 2018 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.0 API version: 1.39 (minimum version 1.12) Go version: go1.10.4 Git commit: 4d60db4 Built: Wed Nov 7 00:19:08 2018 OS/Arch: linux/amd64 Experimental: false
docker镜像管理
镜像不是一个单一的文件,而是由多层构成。我们可以通过docker history <ID/NAME> 查看镜像中各层内容及大小,每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/<storage-driver>中。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。
镜像的工作原理:
当我们启动一个新的容器时,Docker会加载只读镜像,并在其之上添加一个读写层,并将镜像中的目录复制一份到/var/lib/docker/aufs/mnt/容器ID为目录下,我们可以使用chroot进入此目录。如果运行中的容器修改一个已经存在的文件,那么会将该文件从下面的只读层复制到读写层,只读层的这个文件就会覆盖,但还存在,这就实现了文件系统隔离,当删除容器后,读写层的数据将会删除,只读镜像不变。
镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
地址:https://hub.docker.com/explore
配置镜像加速器:https://www.daocloud.io/mirror
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
镜像常用命令
ls 列出镜像
build 构建镜像来自dockerfile
history 查看镜像历史
inspect 显示一个或多个镜像详细信息
pull 从镜像仓库拉取镜像
push 推送一个镜像到镜像仓库
rm 移除镜像
prune 移除未使用的镜像,没有被标记或被任何容器引用的。
tag 创建一个引用源镜像标记目标镜像
export 导出容器文件系统到tar归档文件
import 导入容器文件系统tar归档文件创建镜像
save 保存一个或多个镜像到tar归档文件
load 加载镜像来自tar归档或标准输出
从docker仓库搜索镜像
[root@localhost ~]# docker search nginx
获取镜像
[root@localhost ~]# docker pull nginx
查看镜像
[root@localhost ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 62f816a209e6 13 days ago 109MB
查看镜像的历史分层
[root@localhost ~]# docker history nginx
导出一个镜像
[root@localhost ~]# docker image save nginx > nginx.tar
导入一个镜像
[root@localhost ~]# docker load < nginx.tar
删除镜像
[root@localhost ~]# docker image rm nginx
创建镜像的方法有以下3种方式:
(1)基于已有镜像的容器创建
(2)基于本地模板导入
(3)基于Dockerfile创建
容器管理
Docker容器,可以理解为一个或多个运行进程,而这些运行进程将占有相应的内存,相应的CPU计算资源,相应的虚拟网络设备以及相应的文件系统资源。而Docker容器所占用的文件系统资源,则通过Docker镜像的镜像层文件来提供。 基于每个镜像的json文件,Docker可以通过解析Docker镜像的json的文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置怎么样的环境变量,Docker守护进程实现了静态向动态的转变。
当使用docker run来创建并启动容器时,Docker在后台运行的标准操作:
(1)检查本地是否存在指定的镜像centos,不存在就从公有仓库下载
(2)利用镜像创建并启动一个容器
(3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
(4)从宿主主机配置的桥接网络接口中桥接一个虚拟接口到容器中去
(5)从地址池配置一个IP地址给容器
(6)执行用户指定的应用程序
(7)执行完毕后,容器被终止
创建容器常用选项
选项 描述 -i, –interactive 交互式 -t, –tty 分配一个伪终端 -d, –detach 运行容器到后台 -e, –env 设置环境变量 -p, –publish list 发布容器端口到主机 -P, –publish-all 发布容器所有EXPOSE的端口到宿主机随机端口 –name string 指定容器名称 -h, –hostname 设置容器主机名 –ip string 指定容器IP,只能用于自定义网络 –network 连接容器到一个网络 –mount mount 将文件系统附加到容器 -v, –volume list 绑定挂载一个卷 –restart string 容器退出时重启策略,默认no,可选值:[always|on-failure]
管理容器的常用命令
选项 描述 ls 列出容器 inspect 查看一个或多个容器详细信息 exec 在运行容器中执行命令 commit 创建一个新镜像来自一个容器 cp 拷贝文件/文件夹到一个容器 logs 获取一个容器日志 port 列出或指定容器端口映射 top 显示一个容器运行的进程 stats 显示容器资源使用统计 stop/start 停止/启动一个或多个容器 rm 删除一个或多个容器
创建容器
[root@localhost ~]# docker create -it nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx f17d81b4b692: Pull complete 82dca86e04c3: Pull complete 046ccb106982: Pull complete Digest: sha256:d59a1aa7866258751a261bae525a1842c7ff0662d4f34a355d5f36826abc0341 Status: Downloaded newer image for nginx:latest f51d7ef037f53073825efda4ad76d99a3041328c2569ccf337388c72f2f2bd4a [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f51d7ef037f5 nginx "nginx -g 'daemon of…" 8 seconds ago Created competent_kalam [root@localhost ~]# docker start f51d7ef037f5 #启动容器 f51d7ef037f5 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f51d7ef037f5 nginx "nginx -g 'daemon of…" About a minute ago Up 3 seconds 80/tcp competent_kalam
[root@localhost ~]# docker stop f51d7ef037f5 #终止容器
[root@localhost ~]# docker inspect f51d7ef037f5 #查看容器详细信息
进入容器
[root@localhost ~]# docker exec -it f51d7ef037f5 /bin/bash
删除容器
[root@localhost ~]# docker rm f51d7ef037f5
端口映射
[root@localhost ~]# docker run -d -p 80:80 --name=nginx -h nginx_web nginx
查看容器日志
[root@localhost ~]# docker logs nginx
容器资源限制
选项 描述 -m,–memory 容器可以使用的最大内存量 –memory-swap 允许交换到磁盘的内存量 –memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1) –oom-kill-disable 禁用OOM Killer -cpus 可以使用的CPU数量 –cpuset-cpus 限制容器使用特定的CPU核心,如(0-3, 0,1) –cpu-shares CPU共享(相对权重)
[root@localhost ~]# docker run -d -m 1G --cpus=2 nginx
c6bc3d89ea124fc902f47a8e03c25dba25c849160b05a198664b1dd63bc781fd
[root@localhost ~]# docker stats c6bc3d89ea12
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c6bc3d89ea12 amazing_easley 0.00% 3.504MiB / 1GiB 0.34% 648B / 0B 0B / 0B 2
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c6bc3d89ea12 amazing_easley 0.00% 3.504MiB / 1GiB 0.34% 648B / 0B 0B / 0B 2