Docker

Docker

安装 & 启动

  1. 安装

    yum install -y docker
  2. 装完之后需要在 /etc/docker/daemon.json 修改image注册地址 & 存储目录

    {
    "insecure-registries" : ["registry.xxx.com"]
    "graph": "/data0/docker"
    }
  3. 然后启动 dockerd:

    systemctl enable docker
    systemctl start docker

Docker命令参考

命令概览

  • 容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
  • 容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
  • 容器rootfs命令 — docker [commit|cp|diff]
  • 镜像仓库 — docker [login|pull|push|search]
  • 本地镜像管理 — docker [images|rmi|tag|build|history|save|import]
  • 其他命令 — docker [info|version]

参考: Docker 命令大全 @ref

pull镜像

获取镜像: docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

可能需要先执行 docker login

管理本地镜像

  • 列出已经下载下来的镜像: docker images -a # 列表包含了仓库名(REPOSITORY)、标签(TAG)、镜像ID(IMAGE ID)、创建时间以及所占用的空间
    • 无标签的镜像很多都是”中间层镜像”
    • 根据仓库名列出镜像: docker images 仓库名
  • 删除镜像: docker rmi 仓库:Tag

运行镜像

  • docker run --name webserver -d -p 80:80 repoName:tag # 启动镜像
    • -p host_port:container_port // 端口映射
    • -v host_path:container_path // 绑定主机目录到…
    • -d: 容器在后台运行, 并不立即进入容器终端
    • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
    • -i: 以交互模式运行容器,通常与 -t 同时使用

示例:

  • docker run -d repoName:tag: 后台启动容器(执行后不立刻进入容器)
  • docker run -it repoName:tag /bin/bash: 交互模式启动容器

登录/退出容器

  • docker exec -it 容器ID /bin/bash : 进入镜像的bash命令行, -i保持STDIN 打开, -t分配一个伪终端
  • docker attach 容器ID: 如果docker run -d在后台运行的镜像, 需要这样连接上容器
  • exit 退出容器

镜像修改和提交

docker attach or docker exec -it 进入容器后, 可以对正在运行的镜像进行修改,

  • docker cp /Users/xx/xxx/ 容器ID:/tmp : 本地文件拷贝到docker 容器内

然后 exit 退出 ..

  • docker diff # 显示对 docker 镜像做了哪些修改
  • docker commit --author "xx" --message "xxx" 容器ID 仓库名:TAG # 提交对容器的修改到镜像
  • docker history 仓库名:TAG # 列出改动历史
  • docker push 仓库名:TAG # 上传

管理容器

运行镜像之后:

  • docker ps -a: 列出容器(不是镜像!)
    • 列出正在运行的 容器ID(CONTAINER ID), 镜像(IMAGE), 状态(STATUS)
  • docker top 容器ID : 显示一个运行的容器里面的进程信息
  • docker stop 容器ID : 停止容器, 先发送SIGTERM, 再发送SIGKILL, docker内的应用程序可以接收到SIGTERM做处理
  • docker kill 容器ID : 直接发送SIGKILL
  • docker restart 容器ID : 重启
  • docker rm 容器ID: 删除容器, 如果加了-f参数则是直接发送SIGKILL

容器日志

  • docker logs -f 容器ID: 查看log, 类似tailf
  • docker logs --since 30m CONTAINER_ID : 查看近30分钟的日志

创建镜像 & 编译镜像

  • 准备Dockerfile
  • 执行: docker build --build-arg xArg1=$ARG1 -t <image_name>:<tag> .
    • --build-arg xArg1=$ARG1: 把外界参数传入Dockerfile, 在Dockerfile里可以$xArg1取到
    • -t <image_name>:<tag>: 设置tag

Dockerfile 说明

Example:

FROM xxx.com/REPOSITORY:latest

RUN mkdir -p /data/remotedump-controller

COPY remotedump-controller/* /data/remotedump-controller

# 创建两个ARG变量, 只在dockerfile内有效
ARG Arg1
ARG Arg2

# ENV创建的变量可以在docker运行环境使用
ENV Arg1=$Arg1
ENV Arg2=$Arg2

COPY remotedump-controller/start.sh /etc/kickStart.d/
RUN chmod +x /etc/kickStart.d/start.sh

ENTRYPOINT command param1 param2

参考: https://docs.docker.com/engine/reference/builder/:

  • Dockerfile 中每一个指令都会建立一层, 新建立一层, 在其上执行这些命令, 执行结束后, commit 这一层的修改, 构成新的镜像.
    • Union FS 是有最大层数限制的, 比如 AUFS, 曾经是最大不得超过 42 层, 现在是不得超过 127 层.
  • RUN: 后面跟shell命令, 在镜像里执行
  • WORKDIR 指定工作目录, 对后面的RUN都有效
  • ARG: 指令是定义参数名称, 以及定义其默认值.该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖
  • ENV: ENV Arg2=$Arg2, 在运行时容器中就可以使用$Arg2这个环境变量了. 用ENV赋值之前, 必须要用ARG声明变量ARG Arg2
  • COPY: COPY ./package.json /app/ # 拷贝资源
  • ADD 类似COPY, 但ADD源地址可以是URL
  • EXPOSE: EXPOSE 3306 声明镜像的3306端口要暴露给外面, 仅仅是声明, 真正映射还是在docker run -p 宿主端口:容器端口
  • CMD:
    • CMD ["sh", "-c", "echo $HOME"] : 执行sh, 执行完后sh会退出, 容器也退出了
    • CMD ["nginx", "-g", "daemon off;"] : CMD的可执行程序必须在前台执行! 否则容器自动退出
  • ENTRYPOINT: ENTRYPOINT command param1 param2

docker build

  • 编译命令: docker build --build-arg env=${env} -t repository_name:tag_name -f Dockerfile .
    • 注: 最后的.tar cvzf xxx.tar.gz .类似, 表示打包哪个目录
    • --build-arg k=v会把参数传入dockerfile, 在dockerfile里
    • -t repository_name:tag_name: 冒号前面部分是仓库名, 后面是TAG
  • 删除镜像: docker rm IMAGE_ID, 或者 docker rmi repository_name:tag_name注意这样会删除该tag下所有镜像

核心技术与实现原理

参考: