Docker使用笔记
1 Docker基本介绍
1.1 基本概念
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。
Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是docker提出的“Build once,Run anywhere”
备注:java提出的是” compile Once,Run Anywhere” 1.2 Docker与linux内核的关系
docker与linux内核的关系
Cgroup: 对资源进行(如对物理资源CPU、内存、I/O的)
Namespace:对进程进行隔离
Chroot: 能改变当前运行的进程和子进程的根目录
AUFS:联合文件系统,Docker利用AUFS将不同的Layer结合到1个image中去
1.3 Docker架构
Docker采用C/S架构,客户端与服务器端不一定要在一起。客户端可以运行在windows、linux等机器上,然后服务器端必须运行在linux bit的操作系统上。
1.4 Docker“组件间”关系
✓ 主机:运行容器的机器
✓ 镜像:文件的层次结构,以及包含如何运行容器的元数据, Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上
✓ 容器:一个从镜像中启动,包含正在运行的程序的进程
✓ Registry(镜像仓库):存放镜像的地方,如Docker Hub
✓ Volumn(卷):将物理机的文件夹挂载到容器内部.与openstack的volumn不一样,openstack中的卷是块存储,不能共享。而这里的volumn可以共享。
✓ Dockerfile:用于创建镜像的脚本
2 Docker应用场景
2.1 面向开发人员:快速开发、交付应用程序
主要体现在三个方面:
✓ 代码一致:
在没有docker之前,开发、测试、生成环境可能不一样,如发布某个服务的端口时,开发是1000,而生产是2000,这就导致配置文件不一致。然而使用docker后,我在容器内的端口都是一样的,而容器对外暴露的端口可能不一样。
✓ 开发环境与生产环境的一致性
我们知道,在生产环境的部署比较复杂,服务非常繁多。通过docker,我们可以单机版上通过容器来模拟生产环境的分布式环境。从而让开发人员的开发更有效率。
✓ 快速部署
可以将docker理解为轻量级的虚拟机,启动docker容器速度很快,启动虚拟机很慢。
2.2 面向运维人员:降低运维成本
✓ 节约安装各种软件的时间。
在没有docker之前,在部署程序之前,势必要搭建环境,而搭建环境很花费时间,还要解决环境的各种依赖,而docker通过镜像机制,将你的代码和运行环境直接打包成镜像,扔到容器启动即可。
✓ 降低运维成本。
在没有docker之前,由于技术不断发展,运维也要不停的学习各种软件的使用技能,如Node.js、redis等。有了docker,根本不用关系这些技术(或者少关心),只需要关注容器就可以了,能够正常的发布容器,停止容器、删除容器、迁移容器就可以了。
2.3 面向企业: Paas层的实现
Coding.net、Oschina这些代码托管平台,有个功能即提供给用户程序的演示环境,我不知道他们底层到底采用的什么技术,但是如果Iaas层的openstack,给用户直接提供虚拟机,先得太“笨重”,因为虚拟机本身对物理机的开销就比较大,如果采用Docker,我1台物理机可以部署多个容器,可以降低企业的采购物理机的费用,而且运行效率上应该比采用Iaas层的方案快。
3 Docker的基础操作
3.1 创建docker容器
在root账户下操作:
[root@localhost sjw]# docker search centos
列出了可用的centos系统镜像,当使用这个镜像就表明我们可以直接用centos系统环境,而不需要真实的搭建centos系统。
[root@localhost sjw]# docker pull centos
这个命令会下载centos镜像,并加入到docker容器中。
下载好了之后用以下命令查看容器中已有镜像:
[root@localhost sjw]# docker images
如上图所示,容器中有三个镜像,当我们想删除一个镜像时,使用如下命令:
[root@localhost sjw]# docker rmi 3bd6df51020a
但是有的容器如果正在执行就没有办法删除,需要用如下命令
在centos镜像上输出一个hello world程序
[root@localhost sjw]# docker run centos /bin/echo 'hello world'
查看正在运行和停止运行的容器:
[root@localhost sjw]# docker ps –a
显示格式为(容器ID,镜像,命令,创建时间,当前状态,名称)
Docker的名称如果不指定,则为自动生成的。
现在自定义一个名称,且直接进入到centos镜像中:
[root@localhost sjw]# docker run --name mydocker -it centos /bin/bash
命令解释:
docker run //运行docker镜像
--name //给docker命名
-it //i表示在终端中操作,t表示创建一个伪终端,it就表示在centos的伪终端中操作。
/bin/bash 表示要运行的命令
docker要执行centos命令,先检查容器中是否存在centos镜像,不存在则后台执行pull下载,如果存在则会创建一个容器,将一个文件系统放到centos镜像上,那么镜像就可以操作文件系统了。可以发现,现在的命令行头变了,进入到了docker的容器中。那么就可以执行centos命令了:
但是centos的命令是精简的,有些命令是无法执行的。
我们通过以下命令查看系统中的进程:
[root@79544ee400f5 /]# ps aux
可以看到这里有一个进程/bin/bash,它是docker容器创建的一个文件系统。
docker 容器会运行你指定的一个应用程序,当应用程序退出之后,docker容器就退出了,所以,每次docker容器只能启动一个应用程序。要启动多个应用程序,那么就写成脚本的形式。
退出容器:
[root@79544ee400f5 ~]# exit
查看docker的容器:
[root@localhost sjw]# docker ps –a
可以看到刚刚创建的容器已经退出了。
在后台启动一个容器:
[root@localhost sjw]# docker run -d --name mydocker1 centos
返回一个长串的容器ID,再次查看docker的容器:
发现mydocker1已经启动且退出了。
3.2 使用容器
查看最近创建的容器:
[root@localhost sjw]# docker ps -l
进入之前的容器:
[root@localhost sjw]# docker exec -it b7c628fd5bc6 /bin/bash
发现这个容器是未运行状态的,因此无法进入。因此这个命令是针对运行的容器执行的。
在后台启动一个容器,让它一直运行:
[root@localhost sjw]# docker run -d --name mynginx nginx
参数解释
-d:以后台Daemon方式运行,执行成功后会返回一个该容器的ID
发现这个命令无法运行:
从问题上来看,docker会先找nginx镜像,当找不到时就到网上去pull镜像。但是我们知道docker网站的镜像极难pull,所以建议用daoCloud的镜像:
http://docs.daocloud.io/quick-start/deploy-first-container
按照其操作,在你的docker中装一个插件,然后使用dao命令pull镜像:
[root@localhost sjw]# dao pull nginx
就会发现正在下载nginx镜像,然后等待下载完毕。
然后再后台创建一个容器
可以发现nginx是运行状态的。
3.3 docker的访问
查看系统中的网桥
brctl show