Docker与虚拟机相比优势:
- 快,启动停止秒级实现
- 占用较少资源,一个主机上可以同时运行数千个Docker容器
- 类似Git的操作来方便用户获取、分发和更新应用镜像,学习成本低
- 通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率
Docker可以使用隔离容器来同时启动n个不同应用,基本不消耗二外的系统资源
传统的虚拟机是在硬件层面实现虚拟化,需要有二外的虚拟机管理工具和虚拟机炒作系统层,Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
核心概念
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
镜像
类似虚拟机需要安装的系统镜像,包含完整的Ubuntu系统可以称为Ubuntu镜像。
镜像是创建Docker容器的基础
容器
类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
容器是从镜像创建的应用运行实例,可以进行操作,而这些容器都是相互隔离、互不可见的。
镜像自身是只读的,容器从镜像启动的时候,会在镜像的最上层创建一个可写层,镜像本身保持不变。
仓库
类似于代码仓库,是Docker集中存放镜像文件的场所。
更具所存储的镜像公开分享与否,Docker仓库可以分别为公开仓库和私有仓库两种形式。
安装
CentOS
sudo yum install -y docker
启动服务
service docker start
查看镜像信息
docker images
可以查看本地主机上已有的镜像
例如:
分别显示的为:来源仓库、镜像版本信息(唯一)、镜像ID、创建时间、镜像大小
修改标签tag命令:
docker tag ubuntu:latest nihao:666
效果如下:
改tag的镜像id完全一致,说明改便签只是创建了一个快捷方式。
获取镜像详情
docker inspect IMAGEID
例如:
该命令返回的是一个json格式数据
[root@VM_0_10_centos ~]# docker inspect 7698f282e524
[
{
"Id": "sha256:7698f282e5242af2b9d2291458d4e425c75b25b0008c1e058d66b717b4c06fa9",
"RepoTags": [
"docker.io/ubuntu:latest",
"nihao:666"
],
"RepoDigests": [],
"Parent": "",
"Comment": "",
"Created": "2019-05-15T21:20:25.927610362Z",
"Container": "3a6a6b99b2a49c01ba77ebf65d43121a41c0fc34c7ecb6d708771e68ff950a02",
"ContainerConfig": {
"Hostname": "3a6a6b99b2a4",
"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 [\"/bin/bash\"]"
],
"ArgsEscaped": true,
"Image": "sha256:6dba68421bcf398ca037dd630d3b221cc4b894a90f218165175f3d057bcccfb1",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "18.06.1-ce",
"Author": "",
"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": [
"/bin/bash"
],
"ArgsEscaped": true,
"Image": "sha256:6dba68421bcf398ca037dd630d3b221cc4b894a90f218165175f3d057bcccfb1",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 69859102,
"VirtualSize": 69859102,
"GraphDriver": {
"Name": "overlay2",
"Data": {
"LowerDir": "/var/lib/docker/overlay2/48b47eab4773a5ba9355bf6fdf893c623e8f8ce499e3ad414b908eb7a552c975/diff:/var/lib/docker/overlay2/652d9f5309bc1b8a9abfd8459db579f97aef512f41bec1d556b818a48e0b8e0f/diff",
"MergedDir": "/var/lib/docker/overlay2/126509d21d9523a68fe4e929820939af3b8d6ec923edc8a5133a2093d416d9c4/merged",
"UpperDir": "/var/lib/docker/overlay2/126509d21d9523a68fe4e929820939af3b8d6ec923edc8a5133a2093d416d9c4/diff",
"WorkDir": "/var/lib/docker/overlay2/126509d21d9523a68fe4e929820939af3b8d6ec923edc8a5133a2093d416d9c4/work"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:02571d034293cb241c078d7ecbf7a84b83a5df2508f11a91de26ec38eb6122f1",
"sha256:270f934787edf0135132b6780cead0f12ca11690c5d6a5d395e44d290912100a",
"sha256:8d267010480fed7e616b9b7861854042aad4ef5e55f8771f2c738061640d2cb0"
]
}
}
]
也可以通过-发参数来指定查看参数
docker inspect -f {{".参数名"}}
查找镜像
docker search 镜像名
例如:
删除镜像
docker rmi IMAGE
,其中IMAGE可以为标签也可以为ID
例如:
使用标签删除同一ID的镜像不会相互影响。
但是如果使用ID删除,会删除该ID指向的所有镜像,然后删除镜像本身。
不过当该镜像存在容器时,镜像无法删除。
例如:利用ubuntu镜像创建实例
docker run ubuntu echo ''hello world
利用·docker ps -a
命令可以查看本机存在容器
可以看到一个退出状态的容器,在试图删除镜像的时候,会提示有容器存在,无法删除。
可以使用-f参数强行删除,不推荐
docker rmi -f ubuntu
强制删除会生成一个标签为none的临时镜像,原来被强删的镜像换了新的ID存在于系统中
正确的方法应该是,先删除容器,再删除镜像
删除容器可以通过id删除,例如删除b41be78a02cb这个容器,就可以:
docker rm b41
创建镜像
三种方法:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
这里先主要介绍前两种,基于Dockerfile创建后面会详细的去说。
基于已有镜像的容器创建
该方法主要使用docker commit
命令,格式如下:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
例如:
首先启用一个镜像:
docker run -it ubuntu:18.04 /bin/bash
然后对其进行修改,创建一个文件,之后退出:
root@dea03cf2bc92:/# touch test
root@dea03cf2bc92:/# ls
bin dev home lib64 mnt proc run srv test usr
boot etc lib media opt root sbin sys tmp var
root@dea03cf2bc92:/# exit
记住该创建的容器id为:dea03cf2bc92
该容器与原镜像已经发生了改变,然后通过容器id提交新的镜像:
docker commit -m '这是一个新的镜像' -a '作者' dea03cf2bc92 test:1.0
查看本地镜像列表:
~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 1.0 0d4b889599d4 7 seconds ago 69.9MB
ubuntu 14.04 2c5e00d77a67 5 days ago 188MB
ubuntu 18.04 7698f282e524 5 days ago 69.9MB
基于本地模板导入
主要使用doker import
命令
模板来自于本地导出的,或者从OPENVZ 下载,模板下载地址
例如下载了ubuntu-18.04的模板包,可用下面命令导入:
cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04
存出和载入镜像
存出镜像
docker save
该命令支持-o,导出镜像到指定位置
docker save -o ubuntu_18.04.tar ubuntu:18.04
载入镜像
docker load
该命令支持-i,从指定文件中读取
docker load -i ubuntu_18.04.tar
或者:
docker load < ubuntu_18.04.tar
上传镜像
先去docker官网注册个账户
然后使用docker login
来进行登录操作
登陆后,使用docker push
进行上传
例如:
上传我刚才做的test镜像
首先修改tag
docker tag test:1.0 Docker用户名/test:latest
上传:
docker push Docker用户名/test
然后就会开始上传:
docker push hexu0614/test
The push refers to repository [docker.io/hexu0614/test]
9039fc091fc7: Pushed
8d267010480f: Pushed
270f934787ed: Pushed
02571d034293: Pushed
latest: digest: sha256:ce965c32afe3ceb63cfe65190370830541434650673d7ddee6f9ab02054bfb32 size: 1150
去dockerhub查看刚才上传的镜像:
这样 关于Docker的简单操作就结束了,下次开始深入Docker,学习其核心概念,容器