Docker是一种新的容器化技术,为应用开发和部署提供“一站式”容器解决方案,能帮助开发者高效快速的构建应用,实现“Build,Ship and Run Any App, Anywhere”,从而达到“一次构建,到处运行”的目的。是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行。
物美价廉;轻量级和便携化;低CPU 和内存使用,启动、运行、关闭速度快,可以用来作为云计算的基础
对于开发和部署来说,Docker可以:更快速的交付和部署应用环境;更高效的资源利用率;更便捷的迁移和扩展性;更便捷的应用更新管理
Docker和虚拟机都是基于软件的平台虚拟化技术,其中:
虚拟机属于完全虚拟化,即模拟完整的底层硬件环境特权指令的执行,客户操作系统无需进行修改。比如我们常用的VirtualBox,VMWare Workstation和Parallels Desktop等虚拟化软件。
Docker和其它容器技术便是操作系统级虚拟化,即直接通过内核创建虚拟的操作系统实例(内核和库),来隔离不同的进程和资源。
也就是说,Docker容器不需要额外的虚拟机管理软件和虚拟机操作系统层,直接在宿主机操作系统层面上实现虚拟化,从而达到轻量级,高效的目的。
Docker底层组成:
Namespace:隔离技术的第一层,确保 Docker 容器内的进程看不到也影响不到 Docker 外部的进程。
Control Groups:LXC 技术的关键组件,用于进行运行时的资源限制。
UnionFS(文件系统):容器的构件块,创建抽象层,从而实现 Docker 的轻量级和运行快速的特性。
Docker的主要构成:
Docker Client:用户和 Docker 守护进程进行通信的接口,也就是 docker 命令。
Docker Daemon:宿主机上用于用户应答用户请求的服务。
Registry:注册服务器,注册服务器是存放仓库(Repository)的具体服务器。
Docker的三元素:
Container:用于运行应用程序的容器,包含操作系统、用户文件和元数据,相当于镜像Images的一个运行实例,Docker容器包括应用程序及其所有依赖项,但与其他容器共享内核,在主机操作系统的用户空间中作为独立进程运行。Docker容器不依赖于任何特定的基础架构:它们可以在任何计算机,任何基础架构和任何云中运行。
Images:只读的 Docker 容器模板,简言之就是系统镜像文件。Docker镜像是Docker容器的源代码,Docker镜像用于创建容器。使用build命令创建镜像
DockerFile:进行镜像创建的指令文件。Dockerfile实际上是由一行行命令组成的,让用户可以方便的创建自定义镜像。Dockerfile大体由四部分组成:指明基础镜像指令:FROM;维护者信息指令:MAINTAINER;镜像操作指令:RUN、EVN、ADD和WORKDIR等;容器启动时的执行指令:CMD、ENTRYPOINT和USER等
下边就是一个Dockerfile的例子
FROM python:2.7
MAINTAINER
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]
1. 从dockerhub上pull下python 2.7的基础镜像。
2. 维护者的信息
3. copy当前目录到容器中的 /app目录下 复制本地主机的
4. 指定工作路径为/app
5. 安装依赖
6. 暴露5000端口
7. 启动app
1.检查安装 docker info
2. 查看本地镜像 docker images
3. 下载镜像 docker pull
4. 运行镜像 docker run
输入
docker run busybox /bin/echo Hello Docker
输出
Hello Docker
这条命令是运行 busybox 镜像中的 /bin/echo 命令,参数是 Hello Docker
其他标志:
-i 保证容器的stdin开启
-t 为容器生成一个tty终端
-d 表示后台运行
--rm=true 容器终止后删除
--name name 表示 container 的名称
-v 将目录挂载到 container
--privileged=true 防止没有权限访问挂载的目录
-p 9998:80 指定端口映射
--link name:container 与其他 container 链接.
--icc=true 去除 container 之间不互通. 需要放在 run 前面.
5.删除镜像 docker rmi
docker rmi
删除所有未打 tag 的镜像
docker rmi $(docker images -q | awk '/^
删除所有镜像
docker rmi $(docker images -q)
6. 查看本地容器 docker ps
7. 查询输出docker logs
8. 启动容器docker start
docker start
9. 停止容器docker stop
docker stop
10. 重启容器docker restart
docker restart
11.删除容器 docker rm
docker rm
删除所有 Docker 容器
docker rm $(docker ps -a -q)
12.保存容器docker commit
docker commit -m='A new image' --author='Aomine' 614122c0aabb aoct/apache2
将当前的 Docker 容器保存为一个名为 aoct/apache2 的镜像。-m指定创建镜像的提交信息,--author指定镜像作者,接着是容器ID、目标镜像仓库、镜像名。
13. 镜像上传docker push
创建docker hub账户,将本地的image push 到hub上,这样其他人也可以使用了。首先我们先tag 一个image,然后将其push到我们的repo里。
docker tag id {username}/{images_name}:v1
docker push {username}/{images_name}
14. 获取镜像历史docker history
docker history
只能对本地存在的 Docker 镜像执行这个命令。
15.进入容器
当我们使用 -d参数运行了一个Container的时候,有时候我们需要进入这个容器进行一些操作。例如有这样的一个情况,我们运行了一个app在一个容器里,我们想进入容器看看,这个app运行的状态,查看log。那们如何进入呢?
1.docker attach
$ docker run -d --name demo ubuntu /usr/bin/top -b
$ docker attach demo
2.docker exec
docker exec -i -t webapp /bin/bash
docker attach 和 docker exec区别
docker attach让用户可以进入Container查看输出等等操作,但是并不会另外启动一个进程! 如果你用CTRL-c来退出,同时这个信号会kill Container(默认情况)
docker exec会启动另外一个进程来进入Container,这里的操作是在这个进程下的。如果你用CTRL-c来退出,不会kill 原来的Container
16.镜像的导入与导出load & save
使用 load 从 stdin 导入一个 tar 格式的镜像或者仓库,然后用 save 将 tar 镜像输出到 stdout。
docker save -o
命令 # docker save -o a.tar suse
命令 # docker load -i a.tar
17.容器导入import
用于导入 URL / 文件,从本地导入需要 - 参数。docker import [OPTIONS] URL|- [REPOSITORY[:TAG]]、URL/-二选一。
18.容器导出export
和 import 相反,export 将容器导出成 tar 压缩包。
命令 # docker run -i -t -d suse:minimal /bin/bash