Docker基本命令

镜像操作相关命令

# 查看版本
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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容