Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
(背景),云计算兴起后,服务器硬件扩展非常便利,软件服务部署成为了瓶颈,docker趁势而兴。
为什么要用docker?
容器的启动可以在秒级实现,比传统的虚拟机方式要快得多
对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器
docker的出现,让开发/测试/线上的环境部署,更为便利。
与虚拟机做对比
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘占用 | MB | GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千容器 | 一般几十个 |
优点:
容器和镜像的关系,就类似于类与对象的关系。
镜像之间也存在------层间继承关系
容器类似 镜像new的对象。
CentOS 7环境下,输入命令:
sudo yum install docker -y
安装的是默认版本,安装完后查看版本:
docker version
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce
sudo service docker start
sudo chkconfig docker on
• run/create[镜像名]: 创建一个新的容器并运行一个命令
• start/stop/restart[容器名]:启动/停止/重启一个容器
• kill [容器名]: 直接杀掉容器,不给进程响应时间
• rm[容器名]:删除已经停止的容器
• pause/unpause[容器名]:暂停/恢复容器中的进程
tips:
docker run -d --name cont1
docker run dti --name cont2
• ps:查看容器列表(默认查看正在运行的容器,-a查看所有容器)
• inspect[容器名]:查看容器配置元数据
• exec -it [容器名] /bin/bash:进入容器环境中交互操作
• logs --since=“2019-02-01” -f --tail=10 [容器名]:查看容器日志
• cp path1 [容器名]:path 容器与主机之间的数据拷贝
• export -o test.tar [容器名] / docker export [容器名]>test.tar : 文件系统作为一个tar归档文件
• import test.tar [镜像名:版本号]:导入归档文件,成为一个镜像
• images:列出本地镜像列表 docker history hello-world 镜像存放在imagedb里;一般在image/pverlay2/imagedb/content/sha256下 cat f09fe80eb0e75e97b04b9dfb065ac3fda37a8fac0161f42fca1e6fe4d0977c80 层文件在layerdb里 ll /var/lib/docker/image/overlay2/layerdb/sha256 一个镜像就是一层层的layer层文件,盖楼而成,上层文件叠于下层文件上,若上层文件有与下层文件重复的,则覆盖掉下层文件重复的部分,如下图: 官方仓库:http://hub.docker.com (ps: 这里我出现问题访问网络失败,no route to host 参见:no route to host) 比如拉取 MySQL 镜像: 但是该指令默认拉取最新版本,拉取指定版本使用如下指令: 删除镜像使用指令: 使用registry镜像创建私有仓库 下载registry镜像: 设置http传输: 查询 docker run -it --name centos centos /bin/bash(前台进程) 查看容器的元数据:
• rmi [镜像名:版本]:删除镜像
• tag [镜像名:版本] [仓库]/[镜像名:版本]:标记本地镜像,将其归入某一仓库
• build -t [镜像名:版本] [path]:Dockerfile 创建镜像
• history [镜像名:版本]: 查看指定镜像的创建历史
• save -o xxx.tar [镜像名:版本] / save [镜像名:版本]>xxx.tar : 将镜像保存成 tar 归档文件
• load --input xx.tar / docker loadhistory查看镜像组成:
显示镜像hello-world分三层,其中两个空层。查看镜像文件
打开一个镜像文件查看其内容:
{
"architecture": "amd64",
"config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"Cmd": ["/hello"],
"ArgsEscaped": true,
"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"container": "8e2caa5a514bb6d8b4f2a2553e9067498d261a0fd83a96aeaaf303943dff6ff9",
"container_config": {
"Hostname": "8e2caa5a514b",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
"Cmd": ["/bin/sh", "-c", "#(nop) ", "CMD [\"/hello\"]"],
"ArgsEscaped": true,
"Image": "sha256:a6d1aaad8ca65655449a26146699fe9d61240071f6992975be7e720f1cd42440",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"created": "2019-01-01T01:29:27.650294696Z",
"docker_version": "18.06.1-ce",
"history": [{
"created": "2019-01-01T01:29:27.416803627Z",
"created_by": "/bin/sh -c #(nop) COPY file:f77490f70ce51da25bd21bfc30cb5e1a24b2b65eb37d4af0c327ddc24f0986a6 in / "
}, {
"created": "2019-01-01T01:29:27.650294696Z",
"created_by": "/bin/sh -c #(nop) CMD [\"/hello\"]",
"empty_layer": true
}],
"os": "linux",
"rootfs": {
"type": "layers",
"diff_ids": ["sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3"]
}
}
查看镜像层文件
5.3、镜像与容器总结
---------初始挂载时读写层为空。
---------当需要修改镜像内的某个文件时,只对处于最上方的读写层进行了变动,不复写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但会被读写层中的新版本文件所隐藏,当 docker commit 这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。
---------联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径,是下层存储驱动(aufs、overlay等) 实现分层合并的方式。5.4、仓库操作
一般拉取镜像前我们先查看有哪些版本,如拉取mysql时:docker search MySQL
这里带 OK 标识的表示 是 Docker官方的镜像~
但是又看不到具体有哪些版本,使用如下命令,指定版本查看,没有则结果为空:docker search MySQL:5.7
docker pull MySQL
docker pull MySQL:5.7
docker image rm MySQL:5.7
5.5、私有仓库使用
docker pull registry -- 可配置加速器加速下载
docker run -d --name reg -p 5000:5000 registry
systemctl daemon-reload | systemctl restart docker
docker tag hello-world http://192.168.102.2:5000/hello-world
docker push http://192.168.102.2:5000/hello-world
curl http://192.168.102.2:5000/v2/_catalog | http://192.168.102.2:5000/v2/hello-world/tags/list
6、容器创建详解
6.1、交互式创建容器并进入:
---- exit退出也关闭容器; Ctrl+P+Q退出不关闭容器
6.2、后台启动容器:
docker run -d --name nginx nginx6.3、进入已运行的容器
docker exec -it nginx /bin/bash
docker inspect nginx
6.4、绑定容器端口到主机
docker run -d -p 8080:80 --name nginx nginx:latest
6.5、挂载主机文件目录到容器内
docker run -dit -v /root/peter_dir/:/pdir --name cent centos
6.6、复制主机文件到容器内
docker cp anaconda-ks.cfg cent:/var
7、Docker卸载
7.1、kill掉docker进程
ps -ef|grep docker
kill -9 pid
7.2、删除docker所在目录
rm -rf /etc/docker
rm -rf /run/docker
rm -rf /var/lib/dockershim
rm -rf /var/lib/docker
7.3、查询安装过的包
yum list installed | grep docker
7.4、删除安装的软件包
yum -y remove xxx
7.5、查看卸载成功
docker version