Docker是Google公司推出的Go语言开发的,基于Linux内核的cgroup
,namespace
,AUFS类的UnionFS
等技术。对进程进行封装格力,属于操作系统层面的虚拟化技术。隔离的进程独立于宿主和其他的进程,称为容器。
Docker是在容器的技术上进行了进一步的封装,从文件系统、网络互连到进程格力等等,简化了容器的创建和维护,使得Docker技术比虚拟化技术更为轻便、快捷。
Docker与传统虚拟机对比
Virtual Machines:传统虚拟机技术是虚拟出一套硬件,然后再其上运行一个完整的操作系统,然后应用服务再运行在其上。
Docker: 容器内的应用程序直接运行与宿主的内核,容器和宿主公用一个内核,只是实现了一个隔离的操作。它比传统的虚拟机更轻便。
为什么用docker?
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和拓展
docker架构
客户端,主机,远程仓库
docker是使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建docker容器。
image:是用于创建docker容器的一个模版
container: 是独立运行的一个或一组应用。
client:客户端通过API进行容器的管理。
Docker安装
Centos 安装docker: docker CE支持64位的centos 7 ,且内核版本不低于3.10。
卸载旧版本:sudo yum remove docker docker-common docker-selinux docker-engine
使用yum安装:sudo yum install docker-ce
安装必要的软件依赖以及增加docker-ce 的yum源:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --app-repo https://download.docker.com/linux/centos/docker-ce.repo
使用脚本安装docker:
在测试或者开发环境中,docker官方为了简化安装流程,提供了一套便捷的安装脚本,Centos系统上可以使用这套工具安装curl -fsSL https://get.docker.com -o get-docker.sh
, sudo sh get-docker.sh --mirror Aliyun
启动docker CE
sudo systemctl enable docker #设置开机启动
sudo systemctl start docker
创建docker用户组:
默认情况下,docker命令会使用Unix socket与docker引擎通信,只有root用户和docker组用户才可以访问docker引擎的Unix socker,一般linux不使用root进行操作,所以需要将docker的用户加入docker用户组
sudo groupadd docker #建立docker组
sudo usermod -aG docker $USER #将当前用户加入docker组
测试docker是否安装正确:docker run hello-world
删除docker安装包: sudo yum remove docker-ce
删除docker镜像:sudo rm -rf /var/lib/docker
Centos 7配置镜像加速器
对于使用systemd的系统,请在/etc/docker/daemon.json中写入如下内容(如果文件不存在,新建即可):
{
"registry-mirrors":[
"http://hub-mirror.c.163.com"
]
}
重启服务生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
可以使用docker info
来查看docker的信息,其中的Registry Mirrors
这个栏位会显示出docker镜像仓库的地址。
Docker 常用的命令
Docker镜像操作
Docker运行容器需要本地的镜像,如果本地不存在镜像,docker会从镜像仓库中下载该镜像。
- 从仓库中获取镜像
- 管理本地主机上的仓库
- 介绍镜像实现的基本原理
获取镜像:从docker仓库中拉取镜像的命令是 docker pull。
docker pull [选项] [Docker Registry地址[:端口号]/]仓库名[:标签]
# 默认地址仓库为Docker hub,仓库名是两段式的 <用户名>/<软件名> 如果不给用户名,则默认为library
docker pull ubuntu:16.04
docker pull library/ubuntu:16.04
运行镜像
有了镜像,就可以以进行为模版,启动并运行一个容器。
# -it : -i是交互式操作,-t是终端
# --rm: 容器退出后,自动删除
# bash: 放在镜像名后的命令,是有一个交互式的shell,此处为bash
docker run -it --rm ubuntu:16.04 bash
列出镜像:docker images ls
或docker images
查看镜像、容器、数据卷所占空间:docker system df
显示虚悬镜像(dangling image,即仓库名和标签都为):docker image ls -f dangling=true
删除虚悬镜像:docker image prune
删除本地镜像
命令: docker image rm [选项] <镜像1> [<镜像2>...]
批量删除镜像
docker image rm $(docker image ls -q ubuntu) #删除所有仓库名为ubuntu的镜像
如果有多个版本的镜像,需要删除所有在ubuntu:16.04之前的镜像:
docker image rm $(docker image ls -q -f before=ubuntu:16.04)
注:删除镜像前要先删除掉所有存活的或者未存活的容器。
容器操作
容器是独立运行的一个或一组应用,以及他们的运行态环境。
创建并启动容器(docker run ...)
启动容器分两种,一种是基于镜像新建容器,
如:docker run ubuntu:16.04 /bin/echo 'hello world'
一种是将终止态的容器重新启动,docker container start
docker run -t -i ubuntu:16.04 /bin/bash
-t 让docker分配一个伪终端并绑定到容器的标准输入上,-i让容器的标准输入保持打开。
执行完这个命令后,docker会在后台执行:
- 检查本地是否存在指定的镜像,不存在就从公共仓库中下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主机配置的网桥接口桥接到一个虚拟接口到容器中
- 从地址池中配置一个ip地址给容器
- 执行完指定的应用程序
- 执行完毕后容器被终止。
后台运行:很多时候让docker在后台运行,而不是直接吧执行命令的结果输出到当前宿主机下。可以使用-d参数。
如: 不使用-d ,docker run hello-workd
会吧日志答应到宿主机控制台,docker run -d hello-world
不会输出日志,只会打印容器id,输出结果用 docker logs查看
停止容器
# 停止运行中的容器
docker container stop xx
#终止状态的容器用如下命令可以查看到
docker container ls -a
#启动终止状态下的容器
docker container start xx
#重启一个运行态的容器
docker container restart xx
进入容器(exec)
使用docker exex -it xx /bin/bash
可以进入容器
导入(import)导出(export)容器:
导入 :docker export xx > 导出文件名.tar
导入:cat 导出文件名.tar |docker import -镜像用户名/镜像名:镜像版本
或docker import -i 导出文件名.tar
也可以导入远程http的资源。
删除容器
#删除终止的容器
docker container rm ubuntu:16.04
#删除运行中的容器
docker container rm -f ubuntu:16.04
#删除所有终止状态的容器
docker container prune