Docker好处
容器的启动可以在秒级实现,比传统的虚拟机方式要快得多对系统资源的利用率很高,一台主机上可以同时运行数千个Docker 容器,docker 的出现,让开发/测试/线上的环境部署,成为便利一条龙。
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
更高效的虚拟化
Docker 容器的运行不需要额外的hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
更简单的管理
使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
对比传统虚拟机总结
基本概念
Docker 镜像
Docker 镜像就是一个只读的模板。
镜像可以用来创建Docker 容器。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
Docker 容器
Docker 利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的Linux 环境(包括root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
Docker 仓库
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull 下来就可以了。
容器、镜像的运行关系
安装Docker
Docker 支持CentOS6 及以后的版本。
卸载
1.查询安装过的包
yum list installed | grep docker
docker-engine.x86_64 17.03.0.ce-1.el7.centos @dockerrepo
2.删除安装的软件包
yum -y remove docker-engine.x86_64
3.删除镜像/容器等
rm -rf /var/lib/docker
CentOS7
CentOS7 系统CentOS-Extras 库中已带Docker,可以直接安装:
$ sudo yum install docker ##不是最新版本
#最新版安装
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
查看docker 版本
docker version
docker info
启动docker
sudo service docker start
设置随系统启动
sudo chkconfig docker on
Docker 初体验
docker run hello-world ##进入docker 世界
Docker 基本操作
容器操作
docker [run|start|stop|restart|kill|rm|pause|unpause]
- run/create[镜像名]: 创建一个新的容器并运行一个命令
- start/stop/restart[容器名]:启动/停止/重启一个容器
- kill [容器名]: 直接杀掉容器,不给进程响应时间
- rm[容器名]:删除已经停止的容器
- pause/unpause[容器名]:暂停/恢复容器中的进程
docker [ps|inspect|exec|logs|export|import]
- 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 [镜像名:版本号]:导入归档文件,成为一个镜像
镜像操作
docker images|rmi|tag|build|history|save|load]
- images:列出本地镜像列表
- rmi [镜像名:版本]:删除镜像
- tag [镜像名:版本] [仓库]/[镜像名:版本]:标记本地镜像,将其归入某一仓库
- build -t [镜像名:版本] [path]:Dockerfile 创建镜像
- history [镜像名:版本]: 查看指定镜像的创建历史
- save -o xxx.tar [镜像名:版本] / save [镜像名:版本]>xxx.tar : 将镜像保存成tar 归档文件
- load --input xx.tar / docker load<xxx.tar : 从归档文件加载镜像
镜像与容器原理及用法探究
history 命令查看镜像层
例:docker history hello-world
显示镜像hello-world 分三层,其中两个空层
查看镜像文件
镜像存放在imagedb 里
一般在image/overlay2/imagedb/content/sha256 下
打开一个镜像文件查看其内容:
cat f09fe80eb0e75e97b04b9dfb065ac3fda37a8fac0161f42fca1e6fe4d0977c80
{
"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"]
}
}
----其中,history 数组内,标识了镜像的历史记录(与history 命令内容对应)
----rootfs 的diff_ids 中,对应了依赖使用中镜像层文件(history 命令中size 大于0 的层)
容器创建详解
交互式创建容器并进入:
docker run -it --name centos centos /bin/bash(前台进程)
------------------------exit 退出也关闭容器; Ctrl+P+Q 退出不关闭容器
后台启动容器:
docker run -d --name nginx nginx
进入已运行的容器:
docker exec -it nginx /bin/bash
查看容器的元数据: docker inspect nginx
绑定容器端口到主机:
docker run -d -p 8080:80 --name nginx nginx:latest
挂载主机文件目录到容器内:
docker run -d -p 8090:8080 -v /[宿主机文件绝对路径] : /[容器路径] --name [新名字] [容器名字]
docker run -dit -v /root/peter_dir/:/pdir --name cent centos
复制主机文件到容器内:
docker cp anaconda-ks.cfg cent:/var
解决问题
1,卸载podman软件(可以使用rpm -qa|grep docker)
yum remove docker
2,下载docker-ce源
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
3,安装docker-ce
yum install docker-ce -y
配置镜像源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker