环境

软件 版本
CentOS 7
Docker docker-ce

安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
#从官方下载 docer-ce 的 yum 源文件
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
#也可以从阿里下载
wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#替换成清华源
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
#替换成中科大源
sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
yum install docker-ce
systemctl start docker

基本命令

  • 镜像

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    docker pull [选项] [Docker Registry地址]<仓库名>:<标签> #获取镜像
    docker images [选项] #列出镜像
    docker images -f dangling=true #列出虚悬镜像
    docker images -q -f dangling=true | xargs docker rmi #删除全部虚悬镜像
    docker commit -m "提交的说明信息" -a "更新的用户信息" <容器ID> [地址]<仓库名>:<标签> #根据现有容器创建镜像
    docker build -t="[地址]<仓库名>:<标签>" <Dockerfile 所在的目录> #构建镜像
    docker tag <镜像ID> [地址]<仓库名>:<标签> #修改镜像的标签
    docker push [地址]<仓库名>:<标签> #上传镜像
    docker save -o <本地文件名.tar> [地址]<仓库名>:<标签> #保存镜像到本地文件
    docker load < <本地文件名.tar> #把本地文件加载到镜像库
    docker rmi <镜像ID> #删除镜像
  • 容器

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    docker run [选项] [地址]<仓库名>:<标签> [命令] #从镜像启动一个容器
    docker stop <容器名|容器ID> #终止运行中的容器
    docker start <容器名|容器ID> #启动已停止的容器
    docker retart <容器名|容器ID> #重新启动运行中的容器
    docker ps [-a] #查看(全部)容器信息
    docker logs <容器名|容器ID> #获取容器输出信息
    docker attach <容器名|容器ID> #进入运行中的容器
    docker export <容器ID> > <本地文件名.tar> #导出容器快照到本地文件
    cat <本地文件名.tar> | docker import - [地址]<仓库名>:<标签> #从本地文件导入容器快照
    docker rm -r <容器名|容器ID> #删除(运行中的)容器
  • 数据卷

    1
    2
    3
    4
    5
    6
    
    docker run [选项] -v /webapp [地址]<仓库名>:<标签> [命令] #启动容器时创建一个数据卷挂载到容器的 /webapp 下
    docker rm -v <容器名|容器ID> #删除容器时同时删除数据卷
    docker run [选项] -v <主机绝对目录>:<容器绝对目录>[:ro] [地址]<仓库名>:<标签> [命令] #启动容器时挂载本地目录到容器指定目录下,默认可读写
    docker run [选项] -v <主机文件>:<容器文件>[:ro] [地址]<仓库名>:<标签> [命令] #启动容器时挂载本地文件到容器指定文件,默认可读写
    docker inspect <容器名|容器ID> #查看容器信息
    docker run [选项] --volumes-from <挂载数据卷的容器名> [地址]<仓库名>:<标签> [命令] #在其他容器中挂载指定容器(不必运行)的数据卷
  • 备份数据卷

    1
    
    docker run [选项] --volumes-from <挂载数据卷的容器名> -v $(pwd):/backup [地址]<仓库名>:<标签> tar cvf /backup/backup.tar <数据卷挂载目录> #备份数据卷到主机当前目录的 backup.tar 文件
  • 恢复数据卷

    1
    2
    3
    
    docker run [选项] -v <数据卷挂载目录> --name <自定义一个容器名> [地址]<仓库名>:<标签> [命令] #创建一个带空数据卷的容器
    docker run [选项] --volumes-from <第一步挂载空数据卷的容器名> -v $(pwd):/backup busybox tar xvf /backup/backup.tar #挂载空数据卷和本机备份目录,解压备份文件
    docker run [选项] --volumes-from <第一步挂载空数据卷的容器名> busybox 'ls <数据卷挂载目录>' #查看恢复的数据
  • 网络

    1
    2
    3
    4
    
    docker run [选项] -P [地址]<仓库名>:<标签> [命令] #随机映射主机 49000-49900 中的端口到容器开放的端口
    docker run [选项] -p <ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort>[/udp] [地址]<仓库名>:<标签> [命令] #映射本机指定tcp(udp)端口到容器指定tcp(udp)端口
    docker port <容器名> <容器开放的端口> #查看主机被绑定的地址
    docker run [选项] --link <待链接容器名>:<链接别名> [地址]<仓库名>:<标签> [命令] #创建一个链接到其他容器的新容器

Dockerfile

  • 井号 “#” 后是注释
  • FROM 基础镜像
  • MAINTAINER 维护者信息
  • RUN shell命令
  • ADD 复制本地文件到容器,自动解压 tar 文件,可以增加网络文件
  • COPY 复制本地文件到容器,不自动解压,也不可以增加网络文件
  • LABEL 为镜像添加元数据
  • ENV 设置镜像内环境变量
  • USER 容器运行时的用户和用户组
  • ONBUILD 镜像触发器
  • EXPOSE 向外部开放端口
  • CMD 容器启动后运行的程序

Harbor

  • docker registry 采用 http 协议,客户端提示 “server gave HTTP response to HTTPS client”

    1
    2
    3
    4
    
    #在客户端 /etc/docker/daemon.json 中增加 insecure-registries 配置
    #    "insecure-registries":["10.0.2.22:5080"]
    #重启客户端的 docker 服务
    systemctl restart docker
  • docker registry 采用 https 协议,客户端提示 “authority unknown …”

    1
    2
    3
    4
    5
    6
    
    #在客户端 /etc/docker/ 下创建 registry server 的 domain/ip 目录
    mkdir /etc/docker/certs.d/10.0.2.22:5080/ -p
    #复制 registry server 的 ca.crt (该文件由 openssl 创建密钥时生成)
    scp root@10.0.2.22:/opt/harbor/keys/ca.crt /etc/docker/certs.d/10.0.2.22:5080/
    #重启客户端的 docker 服务
    systemctl restart docker