什么是docker?
docker是一款应用,一款可以帮我们管理容器的应用,而这款应用的源码是开源的。学术的说法就是“Docker 是一个开源的应用容器引擎”。
容器是什么?
容器实际是一项技术,通过容器技术把不同的应用或者服务隔离开。但是大家通常说的容器指的是一个采用容器技术运行的应用。形象的理解就是一个盒子,把服务或者应用放在盒子里运行,每个盒子之间相互不影响。
为什么学习docker?
上一个问题说明了容器技术的一个优点,docker这款应用可以帮助我们实现容器化这个过程,帮助我们创建容器,在容器中运行特定的应用。我觉得首先按照这个需求去学习docker能快速帮助我们理解docker,掌握单个docker的管理。
docker三个基础
镜像、容器、仓库是docker的三个基础,具体关系见下图。有关docker的所有操作主要围绕镜像和容器展开,镜像是创建容器的基础,容器是镜像的动态体现。对用户来说能够掌握部署容器即创建并运行容器,打包生成镜像基本上完成了docker的入门,但是对于开发人员来说你可能还要深究docker每条指令的底层逻辑,相似指令之间的差异性,具体的场景下如何选择最优方法。
docker镜像
镜像是docker创建容器的模板,镜像和容器的关系可以类比java中的类和实例。对于镜像而言我们需要掌握操作包括镜像拉取、镜像查询、镜像删除、镜像创建。
镜像拉取
docker引擎根据docker镜像创建docker容器优先查询本地是否存在该镜像,如果本地没有对应镜像缓存则从远端经i想仓库拉取镜像,然后实现容器创建。例如从远端拉取
//拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
其中,
[OPTIONS]:
-a: 拉取所有标签的镜像;
--disable-content-trust :忽略镜像的校验,默认开启。
NAME:镜像的名称,
TAG:镜像的标签一般指镜像的版本,默认latest最新版本
镜像查看
列出本地镜像
docker images
如果同一个镜像有多个标签会分别被列出,但是它们指向的镜像ID是唯一的。
镜像删除
//删除指定镜像名和标签的镜像或者删除指定Id的镜像
docker rmi nginx:latest
//或者
docker rmi ac8ef //这里并不需要全部打出ID,只要ID的前几位能唯一确定一个镜像即可
但是当有容器(可以试运行的也可以是停止的)依赖该镜像会报错:
Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container ec59ff4b9db4 is using its referenced image ac8efec875ce
有两种删除:
- 使用 docker -f rmi nginx:latest强制删除指令
- 删除该镜像对应的容器后删除该镜像
镜像创建
如果仅仅是创建一个操作系统容器等一些单一内容的容器docker镜像库都能实现。然而实际开发生产过程中程序员需要把自己的特殊环境打包成镜像作为产出。在入门阶段基本上很难用到镜像创建,因为更多的是学习docker容器的操作。但是镜像创建是镜像生命周期中的一个重要阶段因此有必要在这里说。
镜像的创建一般有两种方法:
- 基于已有镜像容器创建自定义镜像
docker run -t -i ubuntu:15.10 /bin/bash //创建并进入容器
apt-get update //根据需求更新环境
docker commit -m="XXX" -a="XXX" e218edb10161 ubuntu:v2 //提交更新镜像
其中,
-m:更改说明
-a:镜像所有者
e218edb10161 :新镜像依托的容器ID
ubuntu:v2:指定新镜像的名称和版本
- 通过Dockerfile文本文件,利用docker引擎创建镜像
1.为新镜像创建一个文件夹,
2.在文件夹根路径下创建Dockerflie文件。
3.将生成镜像所需要的文件放到文件下
4.执行docker build命令
#Dockerfile文件范例
FROM centos:6.7 #基于centos创建的镜像
MAINTAINER Fisher "your name" #镜像作者
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd youj
RUN /bin/echo 'youj:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" > /etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
注意最后的点
docker build -t centos:6.7 .
最后docker容器入门请看的第二课