安装
- 配置yum源
vi /etc/yum.repos.d/docker-main.repo
name=Docker main Repository
baseurl=https://get.daocloud.io/docker/yum-repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://get.daocloud.io/docker/yum/gpg
yum -y install docker-engine
systemctl start docker
镜像操作
Images
(镜像)是由若干layer
(层)组成
获取镜像
docker pull name[:TAG]
name为镜像名称,tag是镜像标签,默认取latest
镜像信息
docker images
列出本机已有镜像的基本信息docker inspect name|ID
查看镜像的详细信息,包括作者、适应架构、各层的数字摘要等docker history name|id
查看镜像的历史信息
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sonatype/nexus3 latest cb646f169074 3 weeks ago 485MB
busybox 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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
alleyz/nuexs3 latest cb646f169074 3 weeks ago 485MB
sonatype/nexus3 latest cb646f169074 3 weeks ago 485MB
busybox 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 "it
s 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
- 创建两个容器使用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端口,可以有多个-pdocker 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 /a
WORKER b
WORKER c
RUN 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技术入门与实战》