概述
Docker
是一个开源的应用容器引擎,基于Go 语言
并遵从Apache2.0协议开源。- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
- 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
架构模式
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类:
Docker 面向对象 容器 对象 镜像 类 概念名词 含义 Docker 镜像(Images) 用于创建 Docker 容器的模板。 Docker 容器(Container) 独立运行的一个或一组应用。 Docker 客户端(Client) 通过命令行或其他工具使用 Docker API 与 Docker 的守护进程通信。 Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 Docker 仓库(Registry) 用来保存镜像。Docker Hub 提供了庞大的镜像集合供使用。
优点
- 简化程序
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。 - 避免选择恐惧症
Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。 - 节省开支
云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
- 简化程序
相关链接
Docker 安装
Docker 使用
简单使用
Hello World
使用 docker run 命令来在容器内运行一个应用程序:输出Hello world。
1 | Docker 以 ubuntu16.04 镜像创建一个新容器,然后在容器里执行并输出结果 |
第一次拉取, 会检测本地没有ubuntu16.04的镜像, 直接从远端拉取。
运行交互式容器
- 进入容器进行交互
- 可以通过运行exit命令或者使用CTRL+D来退出容器
1 | -i:允许你对容器内的标准输入 (STDIN) 进行交互 |
后台模式运行
1 | 创建一个以进程方式运行的容器 |
常用环境部署
容器环境部署
1 | 配置国内镜像 |
容器与宿主机之间的文件复制
容器往宿主机拷贝
1
docker cp [ContainerID]:/database_dump_bak/db_bak.dmp /home/test
宿主机往容器拷贝
1
docker cp wenjian_001.xml [ContainerID]:/mnt/5101388419
容器与宿主机共享文件
1 | 进入Docker容器后,进入 /share 文件夹下即可查看到共享内容 |
镜像使用
列出本地主机上的镜像列表
1 | docker images |
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
列出本地正在运行的容器
1 | docker ps |
容器内部获取当前ID
1 | 其实就是主机名, 记下可用于保存镜像使用 |
获取新的镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。
如果我们想预先下载这个镜像,我们可以使用
docker pull
命令来下载它
1 | 如果不指定一个镜像的版本标签, 将默认使用 ubuntu:latest 镜像 |
查找远端镜像
比如我们需要一个httpd的镜像来作为我们的web服务。
1 | docker search httpd |
更新镜像
比如本地的 ubuntu:16.04 配置了一定环境之后, 想重新弄一个同样镜像tag来配置另一个环境
1 | 查看本地镜像列表 |
- -m : 提交的描述信息
- -a : 指定镜像作者
- 9361ce633ff1 : 容器ID
- wzx/ubuntu:v1 : 指定要创建的目标镜像名
重命名镜像
docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
1 | docker tag 9bf883b9c50c wzx/ubuntu:16.04 |
重命名容器
dokcer rename 容器ID REPOSITORY:TAG(仓库:标签)
1 | docker rename 9c7da7245195 wzx/ubuntu:16.04 |
删除镜像
1 | 停止所有的容器 |
注1: 删除镜像时报必须停止容器的错误
具体错误:
Error response from daemon:###unable to delete ### (must be forced) - image is being used by stopped
错误解析: 这是由于要删除的目标镜像中有容器存在,故无法删除镜像
解决办法: 先删除镜像中的容器,再删除该镜像
1
2docker rm [ContainerID]
docker rmi [ImageID]注2: 删除镜像时报镜像被引用的错误
具体错误:
Error response from daemon: conflict: unable to delete ### (must be forced) - image is referenced in multiple repositories
错误解析: 镜像被引用了, 删除时可指定
repository
和tag
的方式来删除解决办法:
1
docker rmi tmp/ubuntu:16.04
docker 命令手册(详)
Dockerfile 快速构建镜像
构建命令
docker build -t REPOSITORY:TAG(仓库:标签) path(Dockerfile文件所在目录路径)
1 | 构建 |
Dockerfile 命令大全
常见问题
1. 修改sources.list源
ubuntu默认源执行apt-update,此时build过程非常慢,而且打包出来的镜像使用时也会存在慢的情况。
首先从清华源或Ubuntu 16.04 几个国内更新源复制list
列表,保存为sources.list
存放与dockerfile
同目录下。
因此在 apt-get update
之前加入
1 | ADD sources.list /etc/apt/ |
2. 镜像加速
配置网易的加速器: http://hub-mirror.c.163.com
在任务栏点击 Docker for mac 应用图标 -> Perferences… -> Daemon -> Registry mirrors。在列表中填写加速器地址即可。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。
可以通过 docker info
命令来查看是否配置成功。