1.概念
官网文档 https://docs.docker.com/install/linux/docker-ce/centos/#uninstall-old-versions https://docs.docker.com
实例文档:https://github.com/docker-library/docs
配置阿里云加速器 https://cr.console.aliyun.com/cn-qingdao/mirrors centos7以上版本
docker 简明教程 https://www.simapple.com/docker-commandline
1.1 docker
一次封装到处运行,一键部署,大大简化了操作,解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整理发布的容器虚拟化技术,这里的应用组件,既可以是一个 Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群,Docker提供了高效、敏捷和轻量级的容器方案,并支持部署到本地环境和多种主流云平台,为应用的开发、运行和部署提供了“一站式”的实用解决方案。
1.2.docker的优势
更快速的交付和部署,更高效的资源利用(需要额外的虚拟化管理程序支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。跟传统虚拟机方式相比,要提高一到两个数量级。)
1.3与虚拟机比较
1.4Docker的三大核心概念
镜像 容器 仓库
2.安装
官网文档 https://docs.docker.com/install/linux/docker-ce/centos/#uninstall-old-versions https://docs.docker.com
配置阿里云加速器 https://cr.console.aliyun.com/cn-qingdao/mirrors centos7以上版本
service docker start 启动
service docker stop 停止
service docker restart 重行启动
3.docker的基本使用 https://www.simapple.com/docker-commandline
----------------------------------------------------------------
获取镜像 docker pull NAME[:TAG] (NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息),如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。)
参数:
-a,--all-tags=true|false:是否获取仓库中的所有镜像,默认为否。
----------------------------------------------------------------
docker images命令列出本地主机上已有镜像的基本信息。
参数:
-a,--all=true|false:列出所有的镜像文件(包括临时文件),默认为否;
--digests=true|false:列出镜像的数字摘要值,默认为否;
-f,--filter=[]:过滤列出的镜像,如 dangling=true只显示没有被使用的镜像;也可指定带有特定标注的镜像等;
--format="TEMPLATE":控制输出格式,如.ID代表ID信息,.Repository代表仓库信息等;
--no-trunc=true|false:对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是;
-q,--quiet=true|false:仅输出 ID信息,默认为否。其中,对输出结果进行控制的选项如-f,--filter=[]、-- no-trunc=true|false、-q,--quiet=true|false等,大部分子命令都支持。
更多子命令选项还可以通过man docker-images来查看。
----------------------------------------------------------------
docker tag命令来为本地镜像任意添加新的标签。
$ docker tag centos:latest mycentos:latest
----------------------------------------------------------------
docker inspect命令获取该镜像的详细信息(json格式显示)
----------------------------------------------------------------
docker search命令搜索远端仓库中共享的镜像
参数
--automated=true|false:仅显示自动创建的镜像,默认为否;
--no-trunc=true|false:输出信息不截断显示,默认为否;
-s,--stars=X:指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。
----------------------------------------------------------------
docker rmi命令删除镜像 (该镜像创建的容器存在时,镜像文件默认是无法被删除的),-f参数来强制删除一个存在容器依赖的镜像,一般是先关闭在删除,不建议强制删除
----------------------------------------------------------------
docker ps-a命令可以看到本机上存在的所有容器
- a 表示所有
-l 表示最近
-n 指定数目,表示最近前几条
----------------------------------------------------------------
docker commit 基于已有镜像的容器创建,命令格式为docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]] (处于运行状态,会返回新创建的镜像的ID信息)
参数
·-a,--author="":作者信息;
·-c,--change=[]:提交的时候执行 Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
·-m,--message="":提交消息;
·-p,--pause=true:提交时暂停容器运行。
例如:$ docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:1.0
----------------------------------------------------------------
docker import命令从一个操作系统模板文件导入一个镜像,命令格式为docker import[OPTIONS]file|URL|- [REPOSITORY[:TAG]]。
例如: $ cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
----------------------------------------------------------------
docker save 导出镜像到本地文件 参数 -o :输出到的文件。 docker save [OPTIONS] IMAGE [IMAGE...]
docker load将导出的tar文件再导入到本地镜像库 例如$ docker load --input ubuntu_14.04.tar
----------------------------------------------------------------
docker push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录),docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
$ docker tag test:latest user/test:latest
$ docker push user/test:latest
The push refers to a repository [docker.io/user/test]
Sending image list
Please login prior to push:
Username:
Password:
Email:
$ docker push 10.0.2.2:5000/test (推送到私服镜像仓库上)
运行本地仓库:run register
----------------------------------------------------------------
docker create命令新建一个容器 $ docker create -it ubuntu:latest (处于停止状态,可以使用docker start命令来启动它)
----------------------------------------------------------------
docker start 启动
docker stop 来终止一个运行中的容器 docker stop[-t|--time[=10]][CONTAINER...]。参数 -t:关闭容器的限时,如果超时未能关闭则用kill强制关闭,默认值10s,这个时间用于容器的自己保存状态
docker restart 重启
----------------------------------------------------------------
attach命令进入容器 docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
参数
--detach-keys[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;
--no-stdin=true|false:是否关闭标准输入,默认是保持打开;
--sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true。
----------------------------------------------------------------
exec命令可以在容器内直接执行任意命令 docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged][-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]。
参数
-i,--interactive=true|false:打开标准输入接受用户输入命令,默认为false;
--privileged=true|false:是否给执行命令以高权限,默认为false;
-t,--tty=true|false:分配伪终端,默认为false;
-u,--user="":执行命令的用户名或ID。
$ docker exec -it 243c32535da7 /bin/bash
----------------------------------------------------------------
docker rm命令来删除处于终止或退出状态的容器 docker rm[-f|--force][-l|--link][-v|--volumes]CONTAINER[CONTAINER...]。
参数
-f,--force=false:是否强行终止并删除一个运行中的容器
-l,--link=false:删除容器的连接,但保留容器
-v,--volumes=false:删除容器挂载的数据卷。
docker rm -f $(docker ps -a -q)
容器启动,添加--privileged=true(容器不可以写的原因)
----------------------------------------------------------------
docker export命令 导出容器 docker export[-o|--output[=""]]CONTAINER。(不管此时这个容器是否处于运行状态)
docker import命令导入变成镜像(导出容器也变为镜像),
----------------------------------------------------------------
数据卷
数据卷:容器内数据直接映射到本地主机环境;
数据卷容器:使用特定容器维护数据卷
docker run命令的时候,使用- v标记可以在容器内创建一个数据卷。多次重复使用-v标记可以创建多个数据卷。
$ docker run -it centos
$ docker run -d -P --name web -v /webapp training/webapp python app.py (--name指定名称 -v创建一个容器卷 ,-P是将容器服务暴露的端口,是自动映射到本地主机的临时端口。)
$ docker run -d -P --name web -v /src/webapp:/opt/webapp 镜像名 (上面的命令加载主机的/ src/webapp目录到容器的/ opt/webapp目录,没有文件自动新建)
$ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro 镜像名(Docker挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读:)
--volumes-from 挂载dbdata容器中的数据卷 $ docker run -it --volumes-from dbdata --name db1 ubuntu (容器与容器之间的数据交互,共享在之前建立的文件共享卷,如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm-v命令来指定同时删除关联的容器。)
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, --interactive=false 打开STDIN,用于控制台交互 -t, --tty=false 分配tty设备,该可以支持终端登录,默认为false -u, --user="" 指定容器的用户 -a, --attach=[] 登录容器(必须是以docker run -d启动的容器) -w, --workdir="" 指定容器的工作目录 -c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用 -e, --env=[] 指定环境变量,容器中可以使用该环境变量 -m, --memory="" 指定容器的内存上限 -P, --publish-all=false 指定容器暴露的端口 -p, --publish=[] 指定容器暴露的端口 -h, --hostname="" 指定容器的主机名 -v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录 --volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录 --cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities --cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities --cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法 --cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU --device=[] 添加主机设备给容器,相当于设备直通 --dns=[] 指定容器的dns服务器 --dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件 --entrypoint="" 覆盖image的入口点 --env-file=[] 指定环境变量文件,文件格式为每行一个环境变量 --expose=[] 指定容器暴露的端口,即修改镜像的暴露端口 --link=[] 指定容器间的关联,使用其他容器的IP、env等信息 --lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用 --name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字 --net="bridge" 容器网络设置: bridge 使用docker daemon指定的网桥 host //容器使用主机的网络 container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源 none 容器使用自己的网络(类似--net=bridge),但是不进行配置 --privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities --restart="no" 指定容器停止后的重启策略: no:容器退出时不重启 on-failure:容器故障退出(返回值非零)时重启 always:容器退出时总是重启 --rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器) --sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
----------------------------------------------------------------
Dockerfile
一行行命令语句组成,并且支持以#开头的注释行,每一个指令后必须附带内容否则报错,执行顺序从上至下,每条指令都会创建一个新的镜像层
----------------------------------------------------------------
FROM 指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。
格式为FROM<image>,或FROM<image>:<tag>,或FROM<image>@<digest>。
任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一次)。
----------------------------------------------------------------
MAINTAINER 指定维护者信息,格式为MAINTAINER<name>。
----------------------------------------------------------------
RUN 运行指定命令。 格式为RUN<command>或RUN["executable","param1","param2"]。格式为RUN<command>或RUN["executable","param1","param2"]。注意,后一个指令会被解析为Json数组,因此必须用双引号。前者默认将在shell终端中运行命令,即/ bin/sh-c;后者则使用exec执行,不会启动shell环境。
注意,后一个指令会被解析为Json数组,因此必须用双引号。当命令较长时可以使用来换行
----------------------------------------------------------------
CMD指令用来指定启动容器时默认执行的命令
CMD["executable","param1","param2"]使用 exec执行,是推荐使用的方式;
CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用;
CMD["param1","param2"]提供给 ENTRYPOINT的默认参数。
每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时手动指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令。
----------------------------------------------------------------
LABEL指令用来指定生成镜像的元数据标签信息。
格式为LABEL<key>=<value><key>=<value><key>=<value>...。
----------------------------------------------------------------
EXPOSE 声明镜像内服务所监听的端口
格式为EXPOSE<port>[<port>...]。
注意,该指令只是起到声明作用,并不会自动完成端口映射。在启动容器时需要使用-P,Docker主机会自动分配一个宿主机的临时端口转发到指定的端口;使用-p,则可以具体指定哪个宿主机的本地端口会映射过来。
----------------------------------------------------------------
ENV 指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动 的容器中也会存在。 格式为ENV<key><value>或ENV<key>=<value>...。便于后续使用
----------------------------------------------------------------
ADD 该命令将复制指定的<src>路径下的内容到容器中的<dest>路径下。格式为ADD<src><dest>。<dest>可以是镜像内的绝对路径,或者相对于工作目录(WORKDIR)的相对路径。,路径支持正则格式,ADD相对COPY 功能更加强大,包括解压缩
----------------------------------------------------------------
COPY 格式为COPY<src><dest>。 复制本地主机的<src>(为Dockerfile所在目录的相对路径、文件或目录)下的内容到镜像中的<dest>下。目标路径不存在时,会自动创建。路径同样支持正则格式。当使用本地目录为源目录时,推荐使用COPY。
----------------------------------------------------------------
ENTRYPOINT 与CMD的区别是CMD只执行最一条命令,添加覆盖,使用ENTRYPOINT ,后续使用命令表示使用添加的方式,不是覆盖,扩充相对来书是扩充的子参数,一条新的命令还是或失败,也就是一条命令来说,CMD可以补充,否则不行,不论ENTRYPOINT 还CMD只能是一条指令,但是ENTRYPOINT可以使用CMD补充子命令,而CMD不行
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。在最后一个上添加cmd 命令
指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数
----------------------------------------------------------------
VOLUME 创建一个数据卷挂载点。 格式为VOLUME["/data"]。
----------------------------------------------------------------
USER 指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份。格式为USER daemon。
----------------------------------------------------------------
WORKDIR 为后续的RUN、CMD和ENTRYPOINT指令配置工作目录。 格式为WORKDIR/path/to/workdir。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最终路径为/ a/b/c ,也就是run 后的pwd的目录(centos)
----------------------------------------------------------------
ARG 指定一些镜像内使用的参数(例如版本号信息等),这些参数在执行docker build命令时才以-- build-arg<varname>=<value>格式传入。格式为ARG<name>[=<default value>]。则可以用docker build--build-arg<name>=<value>.来指定参数值。
----------------------------------------------------------------
ONBUILD 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令。格式为ONBUILD[INSTRUCTION]。也就是说当其他的镜像建立于该镜像的基础之上那么在构建的时候会出现ONBUILD指定的命令
ONBUILD RUN echo "--------------------------"
----------------------------------------------------------------
STOPSIGNAL 指定所创建镜像启动的容器接收退出的信号值。
----------------------------------------------------------------
HEALTHCHECK 配置所启动容器如何进行健康检查(如何判断健康与否),自Docker1.12开始支持。
HEALTHCHECK [OPTIONS] CMD command:根据所执行命令返回值是否为0来判断;
HEALTHCHECK[OPTIONS]CMD command:根据所执行命令返回值是否为0来判断;
HEALTHCHECK NONE:禁止基础镜像中的健康检查。
OPTION支持:
--interval=DURATION(默认为:30s):过多久检查一次;
--timeout=DURATION(默认为:30s):每次检查等待结果的超时;
--retries=N(默认为:3):如果失败了,重试几次才最终确定失败。
----------------------------------------------------------------
SHELL 指定其他命令使用shell时的默认shell类型
----------------------------------------------------------------
Dockerfile构建
编写完成Dockerfile之后,可以通过docker build命令来创建镜像
如果使用非内容路径下的Dockerfile,可以通过- f选项来指定其路径
指定生成镜像的标签信息,可以使用- t选项
$ docker build -f 文件夹 -t 镜像名称:tag . (最后有一个.)
docker history id 可以查看加载过程,像花卷一样一层一层的
from centos MAINTAINER cyy123 ENV mypath /user/local MAINTAINER $mypath RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo "-----------" ENTRYPOINT echo "-----------" ENTRYPOINT ["ls","-l"] CMD echo "---333333-----"
----------------------------------------------------------------
其他软件的安装
其实在dockerfile的基础上编辑,也就是docker的centos的基础上安装。
tomcat
FROM centos MAINTAINER liyinlong<18312884980@163.com> #把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下 COPY c.txt /usr/local/cincontainer.txt #把java与tomcat添加到容器中 ADD jdk-8u181-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.11.tar.gz /usr/local/ #安装vim编辑器 RUN yum -y install vim #设置工作访问时候的WORKDIR路径,登录落脚点 ENV MYPATH /usr/local WORKDIR $MYPATH #配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_181 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.11 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.11 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.11/bin/startup.sh"] # CMD ["/usr/local/apache-tomcat-9.0.11/bin/catalina.sh","run"] CMD /usr/local/apache-tomcat-9.0.11/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.11/bin/logs/catalina.out
msyql
docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD=123456-d -i -p 3306:3306 mysql:5.7
redies
docker run -p 6379:6379 -v $PWD/data:/data -d redis:3.2 redis-server --appendonly yes 命令说明: -p 6379:6379 :将容器的6379端口映射到主机的6379端口 -v $PWD/data:/data :将主机中当前目录下的data挂载到容器的/data redis-server --appendonly yes :在容器执行redis-server启动命令,并打开redis持久化配置
推送到阿里云