本文将介绍CentOS 7下Docker的基本操作,关于Docker的安装请参见CentOS 7安装Docker。
Docker的基本概念
Docker包含了三个基本的概念将在本文中出现:镜像、容器、仓库。
- 镜像(Images)
- 容器(Containers)
- 仓库(Repositories)
镜像
只读的模板,包含可以创建容器的指令,类比于面向对象中的类。镜像采用分层设计的方式,如下图所示,
上层的镜像依赖于下层的镜像,并且包含相关的配置。例如,图中为一个ubuntu15.04的镜像,你可以基于此镜像安装Apache Web服务,并进行相关配置,从而形成新的镜像。使用docker images命令可以列出本地的所有镜像。
容器
容器是镜像的一个运行实例,类比于面向对象中类的实例对象,如上图中最上层。你可以创建、运行、停止、移动和删除容器。容器的读写并不会写到镜像之中,并且Docker可以很好的隔离多个运行的容器。使用docker ps -a命令可以列出本地所有的容器,包括非活跃的容器。
仓库
仓库是镜像集中存放的地方。你可以把镜像存放与本地,但若想要共享镜像,需要一种镜像分发服务,比如Docker Registry。比较有名的公共Registry服务如Docker官方的Docker Hub,本文后续将使用到。
Docker基本操作
Docker的命令使用
注意:Docker的操作需要用户获得root权限。
Docker命令的基本格式:
docker [选项] [命令] [参数]
查看docker所有的命令,键入:
docker
得到类似如下图所示的命令说明(图片不完全覆盖所有命令):
特定命令的使用帮助:
docker 特定命令 --help
查看当前系统docker的相关信息:
docker info
输出为(图片不完全覆盖所有信息):
可见当前并未安装任何镜像(Images),运行任何容器(Containers)。
加载Docker镜像
Docker镜像是容器运行的基础,默认情况下,将从Docker Hub拉取镜像。首先使用search命令查询Docker Hub中的可用镜像,这里以查询可用的CentOS镜像为例:
docker search centos
命令从Docker Hub拉取centos镜像的相关信息,并返回可用镜像的列表,输出结果类似于:
接下来拉取官方版本(OFFICIAL)的镜像:
docker pull centos
一旦镜像下载完成,可以基于该镜像运行容器,使用run命令:
docker run centos
查看一下当前系统中存在的镜像:
docker images
输出结果类似于:
运行Docker容器
以上述的CentOS镜像为例运行其容器,使用-it参数进入交互shell模式:
docker run -it centos
进行container内部shell,如下图所示:
其中00123e32a83c是容器的ID,后续要用到。你可以在此shell运行任何命令,比如安装Apache Web服务器:
yum install httpd
现在此容器已经安装了Apache Web服务器。注意:所有对于容器的更改只保存在当前运行的容器中,并未写入镜像。
创建新的镜像
在前序操作的基础上,本小节将创建新的镜像,即提交更改到新的镜像。首先从容器的交互shell退出并保存状态,使用exit命令
exit
我们首先使用如下命令查看本地中的容器:
docker ps -a
参数-a表示列出所有容器,包含活跃的和不活跃的。输出类似下图:
可以发现刚才运行的ID为00123e32a83c的容器也在列表之中。
现在使用commit命令来提交更改到新的镜像中,即创建新的镜像。命令格式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
例如:
docker commit -m “install apache server” -a “ll” 00123e32a83c centos:apache_web
这种提交类似于git协议的提交,同样这里提交的镜像只保存在本地。后续可以提交到远程镜像仓库,比如Docker Hub。
再次使用镜像查看命令:
docker images
可以看到新生成的镜像:
可以看到刚才创建的新镜像“centos:apache_web”,并且从大小(SIZE)来看(346MB),区别于我们原始从Docker Hub拉取的CentOS的官方镜像(202MB)。
接下来要为新建的镜像打上标签(Tag),否则后续推送镜像到Docker Hub的时候将出现“ denied: requested access to the resource is denied”的错误。关于这个错误的解答详见stackoverflow。
Tag命令的语法:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
进一步细化到推送至Docker Hub的镜像,使用如下格式:
docker tag SOURCE_IMAGE[:TAG] docker-hub-username/REPOSITORY[:TAG]
其中hub-username是Docker Hub的用户账户,这里采用如下命令:
docker tag 3e46de335eeb docker-hub-username/centos:apache_web
docker-hub-username替换为Docker Hub的实际用户名。这里使用镜像ID来指代想要打标签的镜像。完成之后,同样查看已存在的镜像:
docker images
推送镜像到远程镜像仓库
可以把本地镜像推送到远程镜像仓库,最为著名的就是Docker官方的Docker Hub。当然比如阿里也提供容器仓库,同时也可以自己构建镜像仓库。这里以Docker Hub为例介绍如何实现镜像推送。首先要到Docker Hub上进行注册,然后这里我们使用shell登录:
docker login -u docker-hub-username
输入密码。用户名和密码都正确,随后会显示登录成功。
使用如下命令推送新创建的镜像:
docker push docker-hub-username/docker-image-name
对于本例为:
docker push docker-hub-username/centos:apache_web
docker-hub-username替换为实际的用户名,镜像名这里使用REPOSITORY:TAG的组合。这将花费一定的时间,完成之后登陆Docker Hub,查看Repository,可以看到新上传的镜像。