Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docker的基本使用 #2

Open
chikinlee opened this issue Mar 18, 2019 · 0 comments
Open

docker的基本使用 #2

chikinlee opened this issue Mar 18, 2019 · 0 comments
Labels
knowledge knowledge

Comments

@chikinlee
Copy link
Collaborator

chikinlee commented Mar 18, 2019

前言

随着Docker技术的不断成熟,越来越多的企业开始考虑使用Docker持续集成、版本控制、可移植性、隔离性和安全性的优势上有着不可替代的优势,在看似稳定而成熟的场景下,使用Docker的好处越来越多,所以趁着开年摸鱼期间,学习了一下docker的基本应用

  • docker刷新了我对状态保存的认知,传统的虚拟技术的状态保存是依靠快照的方式来记录,切换速度贼慢,docker引入了类似于git的代码管理的概念,容器版本一一记录,切换效率和成本大大提高
  • docker也可以当做一个云计算平台,可以很轻松的实现一个沙盒隔离的概念,实现文件、资源、网络等隔离,dock的可以利用这些方式实现类似于paas平台的应用隔离
  • 就我目前对docker的理解,docker就是在基于一台有操作系统服务器上可部署的多个虚拟主机,各虚拟环境相互隔离的状态

特性

以下特性是我复制粘贴的😆


文件系统隔离: 每个进程容器运行在完全独立的根文件系统里。

资源隔离: 可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。

网络隔离: 每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。

写时复制: 采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。

日志记录: Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。

变更管理: 容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。

交互式Shell: Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。

应用场景

image.png

  • 简化配置:统一配置,通过镜像快速启动
  • 代码流水线管理: 开发环境->测试环境->预生产环境->灰度发布->正式发布,docker在这里可以快速实现迁移
  • 提高开发效率:开发者来说,有了镜像,直接启动容器即可,就像在自己本地跑自己的项目一样简单
  • 隔离应用:相对于虚拟机的完全隔离会占用资源,docker会比较节约资源
  • 服务器整合:同一台服务器可以跑多个docker容器,提高服务器的利用率
  • 调试能力:docker debug :exec,ps,top,stats,events,logs
  • 多租户:感觉类似于子主账号
  • 快速部署

概念

镜像

只读模板

仓库

集中存放镜像文件的地方,和git的概念类似,有公开和私有之分,用户创建自己的镜像后可以使用push上传到仓库,在使用时随时pull下来

容器

区别于镜像的唯一区别在于容器是可读写的

操作

获取镜像

docker pull

从仓库拉取镜像

例如: docker pull node

相当于 docker pull registry.hub.docker.com/centos:lastest

从其他仓库下载时需要指定完整的仓库地址

image-20190311164312173

查看镜像列表

docker images

列出了所有顶层镜像,每个顶层下隐藏了多个镜像层

image-20190311165002004

  • 来自哪个仓库,如node
  • 镜像标记 比如latest(最新的)
  • 唯一ID
  • 创建时间
  • 镜像大小

创建镜像

docker builddocker commit

docker build

mkdir 85ido

cd 85ido

vim Dockerfile 
#这里需要到Dockerfile下修改这个文件

image-20190311171626943

 docker build -t 85ido/node:1.0 .

其中-t 来标识添加的tag,指定新的镜像用户信息, "." 是Dockerfile所在的路径(当前路径),也可以替换为一个具体的Dockerfile路径,但是不能一个镜像不能超过127层

更详细的语法说明请参考 Dockerfile

然后我们用docker images来看下镜像列表

image-20190311172423890

docker commit

使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享

  • 需要在容器内操作麻烦,效率低
  • 不知道这个镜像是怎么做出来的,都安装了什么,但是使用Dockerfile我们看到是执行了apt-get install命令

上传镜像

docker push

例如:

在上传之前,需要先登录自己的docker hub账号

docker login

image-20190311174129089

docker tag 85ido/node:1.0 chikinlee365/node:1.0
#将要发布的镜像改到自己的账户名下 我的账户名 chikinlee365

image-20190311175909632

docker push chikinlee365/node:1.0
#推送到自己账户下的docker hub

image-20190311175938275

创建容器

创建

docker create <image-id>

docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行,docker create 命令提供了许多参数选项可以指定名字,硬件资源,网络配置等等。

例如:

创建一个node的容器,可以使用仓库+标签的名字确定image,也可以使用image-id 来指定,返回image id

#仓库+标签
docker create -it --name node_container chikinlee365/node:1.0

#使用image-id
docker create -it --name node_container_by_id 6cf2124ba2a6 bash

查看目前已存在的容器列表,不加-a只显示当前运行中的容器
docker ps -a

image-20190311180957166

image-20190311181013093

image-20190311181249115

将本地目录挂在到容器中

docker create -it --name node_container_golf -v ../../work/project/golfOperator node	

image-20190311182010006

启动容器

·docker start <container-id>

Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。

#通过名字启动 -i为启动并进入docker容器
$ docker start -i node_container_golf

#通过容器ID启动
$ docker start -i 2c22396edcbb

image-20190311182507892

进入容器

docker exec <container-id>

在当前容器中执行新命令,如果增加 -it参数运行bash 就和登录到容器效果一样的。

docker exec -it 2c22396edcbb bash

image-20190311182752456

停止容器

docker stop <container-id>

image-20190311183147442

删除容器

docker rm <container-id>

![image-20190311183221687](/Users/mac/Library/Application Support/typora-user-images/image-20190311183221687.png)

删除镜像

docker rmi <image-id>

image-20190312180524162

这里注意,由于同一个image id被两个资源所引用,所以会提示无法删除的问题

这里可以使用 REPOSITORY:TAG的方式删除镜像

你也可以使用-f来强制删除只读层(镜像)

image-20190312180835628

commit 容器

docker commit <container-id>

把容器(I/O)变为了一个镜像(O)

镜像保存

docker save <image-id>

#保存镜像node(id或者REPOSITORY:TAG)到node.tar文件
docker save -o node.tar 6cf2124ba2a6

创建一个镜像的压缩文件,这个镜像文件可以在其他docker上使用(如:堡垒机)和下面的export不一样的是save可以保存每层的元数据,只对镜像有效

image-20190312181713961

容器导出

docker export <container-id>

创建了一个tar文件,并且移除掉元数据和不必要层,将多个层压缩,export后的容器import到docker中时,不会有历史镜像,而save可以

容器提取

docker inspect <container-id> or <image-id>

提取出容器或者镜像最顶层的元数据

@tingrun919 tingrun919 added the knowledge knowledge label Mar 27, 2019
@tingrun919 tingrun919 pinned this issue Mar 27, 2019
@tingrun919 tingrun919 unpinned this issue Mar 27, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
knowledge knowledge
Projects
None yet
Development

No branches or pull requests

2 participants