Docker基础笔记

来源:互联网 发布:eric6知乎 编辑:程序博客网 时间:2024/04/26 00:50

镜像操作

Images(镜像)是由若干layer(层)组成

获取镜像

docker pull name[:TAG] name为镜像名称,tag是镜像标签,默认取latest

镜像信息

  • docker images 列出本机已有镜像的基本信息
  • docker inspect name|ID 查看镜像的详细信息,包括作者、适应架构、各层的数字摘要等
  • docker history name|id 查看镜像的历史信息
# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEsonatype/nexus3     latest              cb646f169074        3 weeks ago         485MBbusybox             latest              54511612f1c4        5 weeks ago         1.13MB

更多用法# man docker-images

为镜像添加标签

docker tag source_name:[tag] target_name:[tag] ,例如:

# docker tag sonatype/nexus3:latest alleyz/nuexs3:latest# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEalleyz/nuexs3       latest              cb646f169074        3 weeks ago         485MBsonatype/nexus3     latest              cb646f169074        3 weeks ago         485MBbusybox             latest              54511612f1c4        5 weeks ago         1.13MB

搜索镜像

默认会搜索官方仓库中的镜像

docker search --filter=stars=10 --limit 12 --no-trunc nexus

说明:搜索 stars大于等于10以上的,返回结果最多12条,太长的名称不需截断,包含nexus关键字的镜像

删除镜像

  • 根据名称删除:docker rmi name,当镜像只剩下一个的时候,会删除镜像的所有层
  • 根据ID删除:docker rmi id,如果镜像有其他的标签,会出现:Error response from daemon: conflict: unable to delete 54511612f1c4 (must be forced) - image is referenced in multiple repositories,此时采用docker rmi -f id 则会将此镜像以及此镜像的所有标签删除

创建镜像

docker中创建镜像的方法主要有3种:

基于已有镜像的容器创建

docker commit -m "its remark” -a “alleyz” -p CONTAINER_ID REPO:TAG`, -m添加备注信息,-a添加作者,-p容器暂停

基于本地模板方法导入

使用OPENVZ创建模板 cat temp.tar.gz | docker import - ubuntu:14.40

基于Dockerfile文件创建
// TODO 大章后续详解

存出和载入镜像

  • 将镜像存储为本地文件: docker save -o busybox.tar.gz busybox
  • 将本地文件导入镜像库: docker load < busybox.tar.gz

上传镜像

docker push alleyz/test:latest

容器操作

创建容器

docker create [OPTIONS] --name alias IMG_NAME

启动容器

docker start container_id

创建并启动

docker run

终止容器

docker stop [-t=10] container_id 先发送SIGTERM信号,等待超过10秒后,发送SIGKILL信号

进入容器

首先我们创建一个后台运行的容器:docker run -itd --name busy busybox
- attach
docker attach busy 退出的时候:先按ctrl p再按ctrl q,如果使用ctrl d或者exit将会终止容器运行
- exec
docker exec -it busy /bin/sh 此处/bin/sh可以是任意命令
- nsenter 通过此方法需要获取容器的PID
PID = $(docker inspect --format "{{ .State.Pid }}" busy)针对具有bash的容器
nsenter --target $PID --mount --uts --ipc --pid

删除容器

docker [-f | -l | -v] rm CONTAINER_ID ,-f终止并删除容器,-l删除容器的连接但保留容器,-v删除容器的数据卷

导出容器

docker export -o busy-c.tar busy 或者 docker export busy > busy-c1.tar

导入容器

docker import busy-c.tar alleyz/bbusy 导入的容器是一个镜像,此方式会丢弃历史信息与元数据信息

数据管理

数据卷(Data Volumes)

可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,它的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷内容的修改会马上生效
  • 对数据卷的更新不会影响镜像
  • 只有没有容器使用的卷才可以被卸载

在容器内创建一个数据卷
docker run -d -p 15000:5000 --name docker-repo -v /home/docker/repo registry,此时-v指令就会在容器中创建一个数据卷/home/docker/repo

挂载一个主机目录作为数据卷
docker run -d -p 15000:5000 --name docker-repo -v /home/docker/repo:/home/docker/repo registry

数据卷容器(Data Volume Container)

如果要在多个容器之间共享一些持续更新的数据,可以使用数据卷容器:
1. 创建数据卷容器

docker run -itd --name data -v /data  busybox
  1. 创建两个容器使用data的数据卷
docker run -itd --name data2 --volumes-from data  busybox

利用数据卷容器迁移数据
1. 数据备份:docker run --volumes-from data -v /home/backup:/backup --name worker busybox tar cvf /backup/back.tar /data
2. 数据恢复:docker run --volumes-from data -v /home/backup:/backup busybox tar xvf /backup/back.tar

端口映射

  • docker run -d -P --name docker-registry registry -P 本地随机端口映射容器中开放的网络端口
  • docker run -d -p 15000:5000 --name docker-registry registry -p 15000:5000 使用本地15000端口映射容器5000端口,可以有多个-p
  • docker run -d -p 10.8.177.22:15000:5000 --name docker-registry registry -p 10.8.177.22:15000:5000 使用IP:PORT映射容器端口
  • docker run -d -p 10.8.177.22::5000 --name docker-registry registry -p 10.8.177.22::5000 指定IP随机端口映射容器端口

  • docker port docker-registry 5000 查看端口映射关系

容器互联

  • docker run -d -P --link CONTAINER_NAME:ALIAS registry 使用--link name:alias使容器不用暴露端口到本地即可被访问,在这个过程中会添加环境变量和配置父容器的/etc/hosts

使用Dockerfile创建镜像

Dockerfile一般分为4部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令,支持#开头的注释

Dockerfile支持的指令

FROM

指定创建镜像的基础镜像,如果本地不存在,则默认去仓库下载指定镜像。 在一个文件中,第一条指令必须是FROM,该指令可以多次出现,但是每个镜像只能一次。 FROM image:tag 或者 FROM image@digest

MAINTAINER

指定维护者信息,MAINTAINER image_author@mail.com

RUN

运行指定指令,格式为RUN command或者RUN ["executable","param1","param2"],前者在shell中运行,后者使用exec执行。 每条RUN指令将在当前镜像的基础上执行,并提交为新的镜像,当命令较长时可以使用\换行

CMD

用来指定启动容器时默认执行的命令,格式有三种:

  • CMD ["executable", "param1", "param2"] 使用exec执行,推荐方式
  • CMD command param1 param2 使用/bin/sh执行
  • CMD ["param1", "param2"] 提供给ENTRYPOINT的默认参数

一个文件只能有一个CMD指令,如果启动容器时手动指定了运行命令,则会覆盖此值

LABEL

生成镜像的元数据标签信息,如LABEL k=v k1=v1 k2=v2

EXPOSE

声明镜像内服务所监听的端口,EXPOSE port port port

ENV

指定环境变量,在镜像生成过程中会被后续的RUN指令使用,在镜像启动的容器中也存在,格式ENV k=v 或者ENV k v

ADD

ADD src dest 将复制指定src路径下的内容到容器的dest目录下,src可以是一个相对路径、绝对路径、也可以是URL,如果为tar文件则会被自动解压至dest路径下, dest可能是绝对路径,也可能是WORKDIR的相对路径

COPY

COPY src dest 复制本地主机的src(相对路径或绝对路径的文件、文件夹)下的内容到镜像的dest下,当src为本地目录时,推荐使用此指令

ENTRYPOINT

指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数,每个Dockerfile文件中只有最后一个ENTRYPOINT指令生效。ENTRYPOINT ["executable", "param"]或者ENTRYPOINT command param

VOLUME

创建一个数据卷挂载点:VOLUME ["/data"]可以从本地或者其他容器挂载数据卷

USER

指定运行容器时的用户名和UID,当程序不需要管理员权限时,可使用RUN创建用户。要临时获取管理员权限可使用sudo

WORKER

RUN CMD ENTRYPOINT指令配置工作目录,格式为WORKER /path/workdir,如果多个worker的后续是相对路径,则此相对路径基于之前的worker路径

WORKER /aWORKER bWORKER cRUN pwd  # 此时目录为/a/b/c
ARG

指定镜像内使用的一些参数(版本号信息等),执行docker build时需要传入。 ARG <NAME>[=default value]

ONBUILD

配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令,ONBUILD INSTRUCTION

SHELL

指定其他命令使用shell时的默认shell类型,SHELL ["executable", "param"]

HEALTHCHECK

配置容器健康检查,HEALTHCHECK NONE不检查;HEALTHCHECK [OPTIONS] CMD command,options取值有三种:

  • --interval=DURATION 默认30秒,多久检查一次
  • --timeout=DURATION 每次检查超时时间,默认30秒
  • --retries=N 失败尝试次数,默认为3

创建镜像

通过docker build命令来创建镜像,docker build [options] path, 使用-t可指定生成镜像的标签

参考资料:《Docker技术入门与实战》

原创粉丝点击