99网
您的当前位置:首页docker使用手册

docker使用手册

来源:99网
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

因篇幅问题不能全部显示,请点此查看更多更全内容