镜像操作相关命令
# 查看版本
docker version
#拉取镜像(NAME为镜像仓库的名称,TAG是镜像的标签[一般用来表示版本信息,不传默认表示:latest], -a可拉取仓库的所有镜像.REGISTRY为注册服务器,默认为registry.hub.docker.com/)
docker pull NAME[:TAG]|[REGISTRY_HOST[:REGISTRY_PORT/[PATH/]]NAME[:TAG]
docker pull hub.c.163.com/public/ubuntu:14.04
#列出本地主机已有镜像(查看详细参数man docker-images)
docker images
#为镜像添加标签
docker ubuntu:latest myubuntu:latest
#查看镜像详细信息
docker inspect ubuntu:latest
#查看镜像历史
docker history ubuntu:latest
#搜索远程仓库中的共享镜像(-s 指定仅显示评价为指定星级以上的镜像,默认为0)
docker search [-s 3] nginx
#删除镜像(其中IMAGE为标签或ID[ID只需输入到能够唯一标识即可,不需要输入完整]。当同一镜像有多个标签时,只删除指定标签,不会删除镜像文件;若删除id有多个标签,则会失败;若镜像有对应容器存在,则会失败。可以使用-f强行删除镜像)
docker rmi IMAGE
docker rmi myubuntu:latest
#基于容器创建镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]
-a 作者信息
-c 提交的时候执行Dockerfile指令
-m 提交信息
-p 提交时暂停容器运行
#基于本地模板导入镜像
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]
#存储镜像到本地文件
docker save -o centos_latest.tar centos:latest
#载入存储到本地的镜像文件
docker load --imput centos_latest.tar
docker load < centos_latest.tar
#登录registry
docker login -u USER -p PASSWORD REGISTRY
docerk login -u test -p test 192.168.1.100
#上传镜像到仓库(默认上传到Docker Hub官方仓库)
docker push NAME[:TAG]|[REGISTRY_HOST[:REGISTRY_PORT/[PATH/]]NAME[:TAG]
docker tag test:latest user/test:latest
docker push user/test:latest
容器操作相关命令
#创建容器(创建出来的容器处于停止状态。docker create --help 查看可选参数)
docker create [OPTIONS] IMAGE
docker create -it centos
#启动一个已经创建的容器
docker start CONTAINER_ID
#新建并启动容器(-t分配一个伪终端并绑定到容器标准输入上,-i让容器标准输入保存打开, --rm容器停止时自动删除,和-d参数冲突。run等价于先create再start)
docker run [OPTIONS] IMAGE CMD
//bash中Ctrl+D或输入exit可以退出容器
docker run -it centos /bin/bash
#守护态运行容器
docker run -d centos /bin/sh -c "while true; do echo hello world;sleep 1; done"
//获取容器输出信息
docker logs CONTAINER_ID
#终止容器(首先向容器发送SIGTERM信号,等待一段超时时间(默认为10秒)后,再发送SIGKILL信号来终止容器。docker kill命令会直接发送SIGKILL信号来强行终止容器)
docker stop [-t 10] CONTAINER
#重启容器
docker restart CONTAINER
#进入容器--attach命令
docker attch [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
#进入容器--exec命令
docker exec -it 243... /bin/bash
#进入容器--nsenter工具
略
#删除容器
docker rm [-f] [-l] [-v] CONTAINER
-f:是否强行终止并删除一个运行中的容器
-l:删除容器的连接,但保留容器
-v:删除容器挂载的数据卷
#导出容器(不管容器是否处于运行状态)
docker export [-o|--out-put[=""]] CONTAINER
docker export -o test_for_run.tar ce1e
docker export ce1e > test_for_run.tar
#导入容器(导入变成镜像)
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|- [REPOSITORY[:TAG]
docker import test_for_run.tar - test/ubuntu:v1.0
#查看容器
docker ps [-a]
访问Docker仓库
#登录仓库(本地用户目录的.dockercfg中保存用户认证信息)
docker login [-u USER] [-p PASSWORD] [SERVER]
#搜索远程仓库中的镜像
docker search centos
#拉取镜像
docker pull centos
#docker hub可跟踪GitHub等进行自动创建
#使用registry镜像来大家一套本地私有仓库(默认情况下,会将仓库创建在容器的/tmp/registry目录下)
docker run -d -p 5000:5000 [-v /opt/data/registry:/tmp/registry] registry
Docker数据管理
#在容器内创建数据卷(在用docker run命令的时候,使用-v标记可以在容器内创建一个数据卷。多吃重复使用-v可以创建多个)
docker run -d -P --name web -v /webapp training/webapp python app.py
#挂载一个主机目录作为数据卷(本地路径必须为绝对路径,默认权限为读写权限rw,也可指定为只读权限ro)
docker run -d -P --name web -v /src/webapp:/opt/webapp[:rw|ro] training/webapp python app.py
#数据卷容器(如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器)
//可以使用多次--volumes-from从多个容器挂载多个数据卷(容器数据卷并不需要保存运行状态)
docker run -it -v /dbdata --name dbdata centos
docker run -it --volumes-from dbdata --name db1 centos
docker run -it --volumes-from dbdata --name db2 centos
#删除容器时并不会删除关联的数据卷,可以在删除时加上-v参数
docker rm -v 0sesfe
#利用数据卷来备份数据
docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos tar cvf /backup/backup.tar /dbdata
#使用特定驱动的文件系统创建(linux上--driver 为local的支持mount命令的相关参数),以nfs为例
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=192.168.1.1,rw \
--opt device=:/path/to/dir \
foo
端口映射与容器互联
#使用-P或-p将容器端口映射到宿主机端口(默认容器外部不能通过网络访问容器内部的网络应用和服务。-P根据配置范围随机选择一个端口,-p指定特定端口)
docker run -d -P --name test_web training/webapp python app.py
//查看端口映射
docker ps -l
//查看容器控制台日志输出
docker logs -f test_web
#映射所有地址(0.0.0.0)到指定端口(HostPort:ContainerPort)
docker run -d -p 5000:5000 --name test_web training/webapp python app.py
//多次使用可绑定多个端口
docker run -d -p 5000:5000 -p 3000:80 --name test_web training/webapp python app.py
#映射到指定地址的指定端口(IP:HostPort:ContainerPort)
docker run -d -p 127.0.0.1:5000:5000 --name test_web training/webapp python app.py
#映射到指定地址的任意端口(IP::ContainerPort宿主机随机分配一个端口)
docker run -d -p 127.0.0.1::5000 --name test_web training/webapp python app.py
#查看当前端口映射
docker port container_name container_port
docker port test_web 5000
#获取容器的具体信息(可获取容器内部往来ip等)
docker inspect container_id
#容器互联(--link name:alias name是要链接的容器名,alias为链接的别名.Docker通过更新环境变量和/etc/hosts文件来是两个容器互联)
docker run -d --name db training/postgres
docker run -d -P --name web --link db:db training/webapp python app.py
Dockerfile
#FROM指令(指定创建镜像的基础镜像.任何Dockerfile的第一条指令必须为FROM指令,同一个Dockerfile可以创建多个镜像)
FROM <image>[:<tag>]
#MAINTAINER指令(指定维护者信息)
MAINTAINER image_creator@docker.com
#RUN指令(运行指定命令)
//在shell终端中运行,即/bin/sh-c
RUN <command>
//使用exec执行,不会启动shell环境
RUN ["executable", "param1", "param2", ...]
//当命令较长是可以使用\对换行符转义
RUN apt-get update \
&& apt-get install -y gcc g++ \
&& rm -rf /var/cache/apt
#CMD指令(用来指定启动容器时默认执行的命令,共支持三种格式。每个Dockerfile只能有一条CMD命令,如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时手动制定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令)
//使用exec执行,推荐使用该方式
CMD ["executable", "param1", "param2", ...]
//在/bin/sh中执行,提供给需要交互的应用
CMD command param1 param2 ...
//提供给ENTRYPOINT的默认参数
CMD ["param1", "param2", ...]
#LABEL指令(用来指定生成镜像的元数据标签信息)
LABEL <key>=<value> <key>=<value> ...
#EXPOSE指令(声明镜像内服务监听的端口。该指令只起到声明作用,并不会自动完成端口映射。启动容器时用-P或-p来指定映射)
EXPOSE <port> [<port> ...]
#ENV指令(指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在)
ENV <key> <value>
//在启动容器时可以使用--env <key>=<value>覆盖掉
#ADD指令(该命令将复制指定的<src>路径下的内容到容器中的<dest>路径下。其中<src>可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,还可以是一个tar文件(如果是tar文件,会自动解压到<dest>路径下)。<dest>可以是镜像内的绝对路径,或者相对于工作目录WORKDIR的相对路径.路径支持正则表达式)
ADD <src> <dest>
ADD *.c /code/
#COPY指令(复制本地主机的<src>(为Dockerfile所在目录的相对路径、文件或目录)下的内容到镜像中的<dest>下。目标路径不存在谁,自动创建。路径支持正则表达式)
COPY <src> <dest>
#ENTRYPOINT指令(指定镜像默认入口指令,该入口命令或在启动容器时作为根命令执行,所有传入值作为该命令的参数。此时,CMD指令指定的值将作为根命令的参数。每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。在运行是,可以用--entrypoint参数覆盖掉)
//exec调用执行
ENTRYPOINT ["executable", "param1", "param2", ...]
//shell中执行
ENTRYPOINT command param1 param2 ...
#VOLUME指令(创建一个数据挂载点。可以从本地主机或其他容器挂载数据卷)
VOLUME ["/data"]
#USER指令(指定运行容器时的用户名或UID,后续RUN指令等会使用指定的用户身份。当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需用户。要临时获取管理员权限可以使用gosu或sudo)
USER daemon
RUN groupadd -r postgres && useradd -r -g postgres postgres
#WORKDIR指令(为后续的RUN、CMD和ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前指令指定的路径)
WORKDIR /path/to/workdir
#ARG指令(指定一些镜像内使用的参数(例如版本号信息等),这些参数在执行docker build命令时才以--build-arg <arg-name>=<value>格式传入)
ARG <name>[=<default value>]
#ONBUILD指令(配置当前创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令)
ONBUILD [INSTRUCTION]
#STOPSIGNAL指令(指定创建镜像启动的容器接收退出的信号值)
STOPSIGNAL signal
#HEALTHCHECK指令(配置启动容器入户进行监控检查)
//根据所执行命令返回值是否为0来判断
HEALTHCHECK [OPTION] CMD command
//禁止基础镜像中的监控检查
HEALTHCHECK NONE
#SHELL指令(指定其他命令使用shell时默认shell类型,默认为["/bin/sh", "-c"])
#创建镜像
//该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下的所有内容发送给Docker服务端,由服务端创建镜像
docker build -t image_tag Dockerfile_dir_path
docker build -t python3 .
#忽略目录下的文件
//可以通过.dockerignore文件(每一行添加一条匹配模式)来让Docker忽略匹配模式路径下的目录和文件
*/temp*
*/*/temp*
~*
参考资料
docker 安装
https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.19b21991JvvxTZ
docker镜像阿里云加速
https://cr.console.aliyun.com/?spm=a2c4e.11153959.blogcont29941.9.520269d6euX6tR#/accelerator
网友评论