什么是Docker
- 基于Go语言
- 开源
- 容器项目
为什么使用Docker
举个栗子,假设用户试图基于常见的LAMP(Linux+Apache+MySQL+PHP)组合来构建网站。按照传统的做法,首先需要安装Apache 、MySQL 和PHP 以及它们各自运行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户、配置参数等);经过大量的操作后,还需要进行功能测试,看是否工作正常;如果不正常,则进行调试追踪,意味着更多的时间代价和不可控的风险。可以想象,如果应用数目变多,事情会变得更加难以处理。
更为可怕的是, 一旦需要服务器迁移(例如从亚马逊云迁移到其他云),往往需要对每个应用都进行重新部署和调试。这些琐碎而无趣的“体力活”,极大地降低了用户的工作效率。究其根源,是这些应用直接运行在底层操作系统上,无法保证同一份应用在不同的环境中行为一致。
而Docker 提供了一种更为聪明的方式,通过容器来打包应用、解藕应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台。这无疑将帮助我们节约大量的宝贵时间,并降低部署过程出现问题的风险。
Docker的优势
- 更快速的交付和部署
- 更高效的资源利用
- 更轻松的迁移和扩展
- 更简单的更新管理
- Docker容器很快,秒级启动停止
- DOcker容器对系统资源需求很少,一台机器可以运行数千个Docker容器
- 获取、分发、更新应用镜像方便
- Dockerfile支持灵活的自动化创建和部署机制
- 隔离性
核心概念
-
Docker镜像
类似于虚拟机镜像,可以理解为一个只读模版,一个镜像可以包含一个基本的操作系统等好多内容,镜像是创建Docker容器的基础 -
Docker容器
类似于一个轻量级沙箱,Docker利用容器来运行和隔离应用,容器从镜像创建的应用运行实例,容器可以启动、开始、停止、删除,容器之间互相隔离、互不可见 -
Docker仓库
类似于代码仓库,存放着镜像文件的场所
Docker常用命令
获取镜像
docker [image] pull NAME [ :TAG]
支持选项:
- -a, --all-ags=true|alse: 是否获取仓库中的所有镜像,默认为否;
- –disable-content-trust:取消镜像的内容校验,默认为真。
docker pull ubuntu: 18. 04
说明:对于Docker镜像来说, 如果不显式指定TAG, 则默认会选择latest标签,这会下载仓库中最新版本的镜像。
查看镜像信息
docker images或docker image ls
支持选项:
- -a, --all =true I false: 列出所有(包括临时文件)镜像文件,默认为否;
- –digests=true | false: 列出镜像的数字摘要值,默认为否;
- -f, --filter=[] : 过滤列出的镜像, 如dangling =true 只显示没有被使用的镜像;也可指定带有特定标注的镜像等;
- –format=“TEMPLATE” : 控制输出格式,如. ID代表ID信息,.Repository代表仓库信息等;
- –no-trunc=true I false: 对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是;
- -q, --quiet=true I false: 仅输出ID信息, 默认为否。
docker iamges
说明:可以使用docker [image] inspect获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等
可以使用docker [image] history查看镜像的创建过程。
搜寻镜像
docker search [option] keyword
支持选项:
- -f, --filter filter: 过滤输出内容;
- –format string: 格式化输出内容;
- –limit int:限制输出结果个数, 默认为25 个;
- –no-trunc: 不截断输出结果。
docker search --filter=is-official=true nginx
删除和清理镜像
docker rmi或docker image rm
支持选项:
- -f, -force: 强制删除镜像, 即使有容器依赖它;
- -no-prune: 不要清理未带标签的父镜像。
docker rmi myubuntu:latest
说明:当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像的多个标签中的指定标签,并不影响镜像文件。当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,可以使用-f参数强行删除。正确的做法是先使用docker rm来删除容器,然后在删除镜像。
docker使用一段时间后,系统中会遗留一些临时文件,以及一些没有被使用的镜像,可以通过docker image prune来镜像清理。
创建镜像
- 基于已有容器创建
docker [container] commit [OPTIONS] CONTAINER [REPOSITORY] [:TAG]]
支持选项:
- -a, --author="": 作者信息;
- -c, - -change=[] : 提交的时候执行Dockerfile指令, 包括CMD | ENTRYPOINT | NV | EXPOSE | LABEL | ONBUILD | USER | VOLUME | WORKDIR等;
- -m, - -message= " ": 提交消息;
- -p, --pause=true: 提交时暂停容器运行。
docker [container] commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1
说明:顺利的话会返回新创建镜像的ID信息。
- 基于本地模板导入
docker [container] import [OPTIONS] file|URL|-[REPOSITORY] [:TAG]]
cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:lB.04
说明:要直接导入一个镜像,可以使用OpenVZ提供的模版来创建,或者用其他已导出的镜像模版来创建。
- 基于Dockerfile创建
docker build [选项] <上下文路径/URL/->
下面是Dockerfile文件
FROM tomcat:8.0-jre8
#作者
MAINTAINER AuthorName
#定义工作目录
ENV WORK_PATH /usr/local/tomcat/conf
#定义要替换的server.xml文件名
ENV SERVER_CONF_FILE_NAME server.xml
#删除原文件server.xml
RUN rm $WORK_PATH/$SERVER_CONF_FILE_NAME
#复制文件server.xml
COPY ./$SERVER_CONF_FILE_NAME $WORK_PATH/
docker build -t w2gtomcat:0.0.1 . 注意后面的点不能少了
存出和载人镜像
docker [image] save
docker [image] load
支持参数:
- -o、导出镜像到本地文件中
docker save -o ubuntu 18 04 tar ubuntu:18 .04
docker load -i ubuntu_ 18 04 tar
说明:save导出镜像到本地文件中,load将导出的tar文件再导入到本地镜像库。
上传镜像
docker [image] push NAME [:TAG] | [REGISTRY_HOST [ :REGISTRY_PORT] / ]NAME [:TAG ]
docker tag test:latest user/test : latest //添加新的标签user/test:latest
docker push user/test:latest
说明:用户在DockerHub网站上注册后可以上传自制的镜像。
创建容器但不启动
docker [container] create
支持选项:参数太多就不一一展示了
参数列表
docker create -t -i fedora bash
docker create -it ubuntu:latest
说明:注意创建的容器为停止状态,如果要启动需要使用start命令。
或者使用docker run命令
docker run ubuntu / bin/ echo ’ Hello world'
停止容器
docker [container] pause CONTAINER [CONTAINER ... ]
例如,启动一个容器然后将其暂停:
$ docker run --name test --rm -it ubuntu bash
$ docker pause test
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
893c8llcf845 ubuntu "bash” 2 seconds ago Up 12 seconds (Paused) test
说明:处于paused状态的容器,可以使用unpause命令来恢复到运行状态
终止容器
docker [container] stop
docker stop ce5
说明:处于终止状态的容器,可以通过start命令来重新启动,
docker restart 命令会将一个运行的容器先终止,然后再重新启动。
进入容器
- attach命令
docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
支持参数:
- -- detach-keys [=[]]:指定退出attach 模式的快捷键序列, 默认是CTRL-p CTRL-q;
- -- no-stdin=trueifalse :是否关闭标准输入,默认是保持打开;
- -- sig-proxy=truelfalse :是否代理收到的系统信号给应用进程,默认为true 。
docker attach nginx
说明:使用attach命令有时候并不方便,当多个窗口同时attach到同一个容器的时候,所有窗口会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
- exec命令
docker [container] exec [-d| --detach] [ detach-keys[=[]]] [-i|--interactive] [ - -privileged][-t|--tty] [- u | --user [=USER]] CONTAINER COMMAND [ARG . . . ]
支持参数:
- -d, --detach : 在容器中后台执行命令;
- -- detach-keys ="":指定将容器切回后台的按键;
- - e, - - env= []:指定环境变量列表;
- - i, --int eractive=true I false :打开标准输入接受用户输入命令, 默认值为false;
- -- privileged=true | false : 是否给执行命令以高权限,默认值为false;
- - t, --tty=true | false : 分配伪终端,默认值为false;
- - u, --user ="":执行命令的用户名或ID 。
docker exec -it 24 3 c32535da7 / bin/ bash
说明:通过指定-it参数来保持标准输入打开,并且分配一个伪终端,通过exec命令对容器执行操作是最为推荐的方式
容器的其他命令
- 复制文件
docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH |-
支持选项:
- - a, -archive :打包模式,复制文件会带有原始的uid/gid 信息;
- - L, -follow-link :跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
docker [container] cp data test : / tmp/
说明:如果要将容器中的文件复制到宿主机中,将参数对调即可。
- 查看变更
docker [container] diff CONTAINER
docker container diff test
说明:查看容器内文件系统的变更。
- 查看端口映射
docker container port CONTAINER [PRIVATE_PORT[/PROTO ]]
docker container port test
说明:查看该容器的端口映射信息,输出为端口映射信息。
- 更新配置
docker [container] update [OPTIONS] CONTAINER [CONTAINER .. . ]
支持选项:
- –blkio-weight 更新块IO 限制, 10 ~ 1000 ,默认值为0 ,代表着无限制;
- –cpu-period 限制CPU 调度器CFS (Completely Fair Scheduler )使用时间,单位为微秒,最小1000;
- –cpu-quota 限制CPU 调度器CFS 配额,单位为微秒,最小1000;
- –cpu-rt-period 限制CPU 调度器的实时周期,单位为微秒;
- –cpu-rt-runtime 限制CPU 调度器的实时运行时,单位为微秒;
- –cpu-shares , -c 限制CPU 使用份额;
- –cpus decimal 限制CPU 个数;
- –cpuset-cpus 允许使用的CPU 核,如0-3, 0,1;
- –cpuset-mems 允许使用的内存块,如0-3’ 0, 1;
- –kernel-memory 限制使用的内核内存;
- –memory , -m 限制使用的内存;
- –memory-reservation 内存软限制;
- –memory-swap 内存加上缓存区的限制, - 1 表示为对缓冲区无限制;
- –restart 容器退出后的重启策略。
例如:限制总配额为1秒,容器teset所占用时间为10%:
docker update --cpu-quota 1000000 test
说明:可以更新容器的一些运行时配置,只要是一些资源限制份额。