Docker
简介
Docker是一个由GO语言写的程序运行的“容器”; 目前云服务的基石是操作系统级别的隔离,在同一台物理服务器上虚拟出多个主机。Docker则实现了一种应用程序级别的隔离; 它改变我们基本的开发、操作单元,由直接操作虚拟主机(VM),转换到操作程序运行的“容器”上来。 Docker是2013年Docker 是 PaaS提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github上, 基于go语言并遵从Apache2.0协议开源,是dotCloud公司的绝处逢生之作,目前该公司以Docker为名。 从2013年3月20日,第一个版本的Docker正式发布到 2014年6月Docker 1.0 正式发布,经历了15个月。 虽然发展历程很短,但Docker正在有越来越流行的趋势。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上,也可以实现虚拟化。通俗解释Docker是什么,有个著名的隐喻:集装箱。在集装箱之前,货物运输没有统一的标准方式进行搬运,于是铁路、公路、海洋等各种运输之间,需要大量的人力作为货物中转,效率极低,而且成本很高。集装箱出现之后,世界上绝大多数的货物运输都可以放到这个神奇的箱子里,然后在公路、铁路、海洋等所有运输场景下,这个箱子都可以不用变化形态直接可以承运,而且中间的中转工作,都可以通过大型机械搞定,效率大大提升。
背景
现代软件开发和计算机技术的快速发展造成了大量异构系统的出现,这给应用开发,测试和部署都带来了巨大的复杂度,如何有效的管理这种复杂度同时保持开发和运维的效率是急待解决的问题。 容器化技术在主机时代已经被证明是非常有效的应用隔离技术,可以帮助企业有效的利用计算资源,同时提供很好的敏捷特性。随着Linux在企业级系统中应用的增多,虚拟化的广泛使用和云计算的兴起,Docker这种围绕容器技术构建的工具/生态系统被广泛接受,成为解决异构系统上应用开发和运维问题的最佳选择,同时也为企业构建混合云数据中心提供了更好的选择和可能性。
安装Docker
Docker有两个版本,一个是Docker-CE(社区版),一个是Docker-EE(企业版),这里安装社区版就够了, Docker可在windows,mac,centos,ubuntu等平台使用。其它安装方式请参考官方文档
卸载旧版本
sudo apt-get remove docker docker-engine docker.io
更新apt包索引:
sudo apt-get update
安装包允许apt通过https使用存储库
sudo apt-get install
apt-transport-https
ca-certificates
curl
software-properties-common
添加Docker的官方GPG密钥
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
设置docker稳定版存储库
sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable"
更新一次docker源索引
sudo apt-get update
安装docker-ce
sudo apt-get install docker-ce
Docker 主要组件
Docker 镜像(Docker images)
Docker 仓库(Docker registeries)
Docker 容器(Docker containers)
容器(container)
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个Docker容器都是从Docker镜像创建的。Docker容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是Docker的运行部分。
Docker 常用基本命令
常用命令 描述
docker build 从Dockerfile构建镜像
docker cp 在容器和本地文件系统之间复制文件/文件夹
docker images 列出本地镜像
docker ps 列出容器
docker restart 重启一个或多个容器
docker rm 删除一个或多个容器
docker rmi 删除一个或多个镜像
docker run 在新容器中运行命令
docker save 将一个或多个镜像保存到tar存档
docker search 在Docker Hub(仓库)中搜索镜像
docker start 启动一个或多个已停止的容器
docker stop 停止一个或多个正在运行的容器
docker tag 设置镜像标签
docker pull 从注册表中提取镜像或存储库
docker load 导入镜像到docker
docker exec 在正在运行的容器中运行命令
更多更详细命令说明请查看官方文档
常用命令使用实例及说明
docker ps 实例
语法
选项
docker ps [OPTIONS]
常用OPTIONS说明:
--all , -a : 显示所有容器(默认显示刚刚运行)
--quiet , -q : 仅显示数字ID
--size , -s : 显示总文件大小
列出当前运行的容器
docker ps
列出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
700dc6a26247 nginx:1.0 "/usr/sbin/nginx" 9 minutes ago Up 9 minutes 0.0.0.0:8484->80/tcp nginx
各个选项说明:
CONTAINER ID:表示容器的ID
IMAGE:镜像名称及版本(表示该容器使用的是哪个镜像)
COMMAND:容器启动后执行的命令
CREATED:容器创建时间
STATUS:容器状态
PORTS:容器端口
NAMES:容器的名称
docker images实例
语法
选项 镜像名:版本
docker images [OPTIONS] [REPOSITORY[:TAG]]
列出所有镜像
docker images
列出如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.0 2980b0d17875 3 hours ago 170MB
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
docker load 实例
语法
选项
docker load [OPTIONS]
加载镜像到docker
docker load < /位置/nginx.tar
docker run 实例
docker run :创建一个新的容器并运行一个命令
语法
选项 镜像名:版本 执行的命令 环境变量
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用OPTIONS说明:
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name: 为容器指定一个名称;
--volume , -v 目录挂载,表示宿主机文件/文件夹挂载到容器内(宿主机文件或目录:容器内文件或目录)
docker run -d -p 8080:80 --name nginx -v /home/conf:/etc/ nginx:1.0
更多Docker Run命令请查看官方文档
docker exec 实例
语法
选项 容器ID或容器名 执行的命令 环境变量
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
进入容器
docker exec -it nginx bash
常用OPTIONS说明:
-i:以交互模式运行容器,通常与 -t 同时使用
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
docker cp 实例
语法
选项 容器ID或容器名:容器内路径 宿主机本地文件/文件夹路径
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
选项 宿主机本地文件/文件夹路径 容器ID或容器名:容器内路径
docker cp [OPTIONS] SRC_PATH| CONTAINER:DEST_PATH
将宿主机index.php文件拷贝到容器96f7f14e99ab的/usr目录下
docker cp /home/index.php 96f7f14e99ab:/usr/
将容器96f7f14e99ab的/usr目录拷贝到宿主机的/home目录中
docker cp 96f7f14e99ab:/usr /home/
docker build 实例
语法
选项 dockerfile路径 构建内容路径
docker build [OPTIONS] PATH | URL
在当前目录的Dockerfile构建镜像,名为nginx,版本1.0,点表示当前,这里使用点需要注意,如果使用点,默认寻找Dockerfile名称的,不带任何后缀
docker build -t nginx:1.0 .
使用-f指定Dockerfile文件位置构建镜像
docker build -t nginx:1.0 -f /home/Dockerfile .
常用OPTIONS说明:
-t : 指定以“name:tag”格式命名
-f : 指定Dockerfile路径
docker tag 实例
语法
源镜像名:版本 更改后的镜像名:版本
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
给镜像添加一个新的标签
docker tag 860c279d2fec zxd/nginx:1.2
如何使用已有镜像快速启动一个容器(实践)
- 需要资源
准备一个本地nginx镜像(已经打包好的镜像,例如镜像名为nginx.tar)或者是Docker仓库公开的镜像
- 实践步骤
加载镜像到docker中
docker load < /位置/nginx.tar
查看是否镜像加载成功 如果存在,那么就已经加载进到docker
docker images
通过刚刚加载的镜像,启动一个容器 语法
选项 容器ID或容器名称 执行的命令 环境变量
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -d -p 8484:80 --name nginx nginx:1.0
上面后台启动(-d表示后台启动)一个名为nginx的容器(container)并且映射出的端口是8484,它的镜像(image)来源与nginx:1.0
此容器开放80端口,但此容器只能通过内部IP进行访问,需要外部可以访问,那么需要做端口映射: -p 8484:80 将内部端口映射到8484端口
执行以上命令后:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6748f39cf68a nginx:1.0 "/usr/sbin/init" About an hour ago Up About an hour 0.0.0.0:8484->80/tcp nginx
ps:请注意 0.0.0.0 这一串数字,必须有此映射端口,我们才能通过宿主机的IP地址来访问容器的端口
例如:宿主机的IP地址是192.168.0.129,在浏览器上输入http://192.168.0.129:8484就可以访问
镜像(image)
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。 当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新 的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。可以理解镜像为系统的iso文件。
在构建镜像前,需要先准备Dockerfile文件
Dockerfile是什么
Dockerfile 是一个文本格式的配置文件,用户可以使用Dockerfile 快速创建自定义的镜像。
Dockerfile 基本结构
Dockerfile 由一行行命令语句组成,# 开头的注释行。一般而言,Dockerfile 的内容分为四个部分:
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令。
Dockerfile 基本选项
指令不区分大小写。但是,命名约定为全部大写。
常用选项 说明
FROM
MAINTAINER
RUN 《command》 在shell或者exec的环境下执行的命令,RUN指令会在新创建的镜像上添加新的层面.
ADD 《src》 《destination》 复制文件指令。它有两个参数
docker run命令的-v标识创建的挂载点只能对创建的容器有效。
通过Dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
更详细指令说明请查看官方文档
Dockerfile 文本内容实例
指定基础镜像
FROM ubuntu
设置维护者信息
MAINTAINER zhengxidong [email protected]
更新软件列表及安装nginx
RUN apt-get update && apt-get install -y nginx
配置nginx.conf文件
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
COPY /home/docker /
容器启动时执行指令
CMD ["/usr/sbin/nginx"]
构建nginx镜像并启动容器(实践)
编写Dockerfile
指定基础镜像
FROM ubuntu
设置维护者信息
MAINTAINER zhengxidong [email protected]
更新软件列表及安装nginx
RUN apt-get update && apt-get install -y nginx
配置nginx.conf文件
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
COPY /home/docker /
VOLUME ["/test/upload"]
容器启动时执行指令
CMD ["/usr/sbin/nginx"]
执行构建
docker build -t nginx:1.0 .
-t:以“name:tag”格式命名,name表示名称,tag表示标签,点表示当前目录
以上命令表示:构建一个名为nginx,1.0版本的镜像,点表示从当前目录找到默认Dockerfile,并从当前目录构建上下文内容
使用已经构建好的镜像启动容器(container)
docker run -d -p 8484:80 --name nginx nginx:1.0