参考文档:
Docker 从入门到实践

Docker 安装

1.centos6.8

yum install -y epel-release
yum install -y docker-io
# 配置文件 /etc/sysconfig/docker
# 启动 docker 服务
service docker start
# 验证
docker version

2.其他参考 https://docs.docker.com/engine/install/

阿里云镜像加速

https://help.aliyun.com/document_detail/60750.html

针对安装了Docker for Mac的用户,您可以参考以下配置步骤:

在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧输入栏编辑 json 文件。将

https://ln6hzcek.mirror.aliyuncs.com(自己的加速地址) 加到"registry-mirrors"的数组里,点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。

Docker 命令

帮助命令

# 查看版本
docker version
# docker 相关信息 
docker info
# 帮助命令
docker --help

镜像命令

# 查看本地镜像
docker images
  -a # 列出本地所有镜像,包含中间镜像层
  -q # 只显示镜像 ID
  --digests # 显示镜像的摘要信息
  --no-trunc # 显示完整的镜像信息
  
# 搜索镜像
docker search 镜像名
  --no-trunc # 显示完整的镜像信息
  -s # 列出收藏数不小于指定值的镜像
  --automated # 只列出 automated build 类型的镜像
  
# 下载镜像
docker pull 镜像名[:TAG]  # 默认 tag 为 latest

# 删除镜像
docker rmi 镜像名[:TAG]/镜像 ID [镜像2名[:TAG]/镜像2 ID]
  -f # 强制删除
  
# 删除全部镜像
docker rmi -f $(docker imgages -qa)

# 查看镜像构建历史
docker history 镜像 ID

容器命令

# 新建并启动容器
docker run [OPITIONS] IMAGE [COMMAND] [ARG...]
  OPITIONS 说明
    --name="容器名称"
    -d # 后台运行容器,并返回容器 ID
    -i # 打开标准输入,以交互模式运行容器,通常与 it 同时使用
    -t # 为容器重新分配一个伪输入终端(tty),通常与 i 同时使用
    -P # 随机端口映射
    -p # 指定端口映射,有以下四种格式
      ip:hostPort:containerPort
      ip::containerPort
      hostPort:containerPort
      containerPort
    
# 列出当前所有正在运行的容器
docker ps [OPITIONS]
  -a # 列出当前所有正在运行的容器+历史上运行过的容器
  -l # 显示最近创建的容器
  -n # 显示最近 n 个创建的容器
  -q # 静默模式,只显示容器编号
  -no-trunc # 不截断输出
  
# 退出容器
exit # 停止当前终端进程并退出
ctrl+P+Q # 当前终端不停止退出

# 启动容器
docker start 容器 ID/Name

# 重启容器
docker restart 容器 ID/Name

# 停止容器
docker stop 容器 ID/Name

# 强制停止容器
docker kill 容器 ID/Name

# 删除已停止的容器
docker rm [OPITIONS] 容器 ID/Name
  -f # 强制删除
  
# 一次删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

# 查看容器日志
docker logs [OPITIONS] 容器ID
  -t # 加入时间戳
  -f # 跟随最新的日志打印
  --tail n # 显示最后 n 条 
  
# 查看容器内运行的进程
docker top 容器 ID

# 查看容器内部细节
docker inspect 容器 ID

# 进入正在运行的容器并以命令行交互
docker attach 容器 ID # 直接进入容器启动命令的终端,不会启动新的 bash 进程
docker exec -it 容器 ID bashShell  # 在容器中打开新的终端,并且启动新的 bash 进程,而且可以将命令执行结果返回给宿主机
docker exec -it 容器 ID /bin/bash # 进入容器

# 从容器内拷贝文件到宿主机
docker cp 容器 ID:容器内路径 目的主机路径

# 提交容器副本使之成为一个新的镜像
docker commit 容器 ID 要创建的目标镜像名:[标签名]
  -m="提交的描述信息"
  -a="作者"

-i 选项指示 docker 要在容器上打开一个标准的输入接口,-t 指示 docker 要创建一个伪 tty 终端,连接容器的标准输入接口,之后用户就可以通过终端进行输入。

镜像原理

分层的好处:共享资源
有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份 base 镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

Docker 镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下的都叫镜像层。
比如 tomcat,从内到外分别为 kernel、centos、jdk、tomcat,tomcat 为容器层,其他为镜像层。

Doker 容器数据卷

Docker 持久化

Docker 容器网络

  • 所有 docker 容器共用一个网关

  • 网桥为每一个 docker 分配一个 IP

  • 容器之间可以通过 IP 进行通信

  • 外部网络没办法通过 IP 地址访问到容器内部,只能通过端口映射来访问

  • 四种网络模式

    Docker网络模式 配置 说明
    host模式 –network=host 容器和宿主机共享Network namespace。mac 系统无法使用。
    container模式 -network=container:容器名或者 ID 容器和另外一个容器共享Network namespace。
    none模式 –network=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。
    bridge模式 –network=bridge (默认为该模式)

DockerFile

Dockerfile 是用来构建 Docker 镜像的构建文件,是由一系列命令和参数构成的脚本。

编写 Dockerfile 文件 → docker build → docker run

scratch 为源镜像

dockerfile 内容基础知识

  • 每条保留字指令都必须为大写且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • # 表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

docker 执行 dockerfile 的大致流程

  • docker 从基础镜像运行一个容器
  • 执行每一条指令并对容器做出修改
  • 执行类似 docker commit 的操作提交一个新的镜像层
  • docker 再基于刚刚提交的镜像运行一个新容器
  • 执行 dockerfile 中的下一条指令直至所有指令都执行完成

dockerfile 体系结构

  • FROM: 基础镜像,当前镜像是基于哪个镜像的

  • MAINTAINER: 作者+作者的邮箱

  • RUN: 容器构建时需要运行的命令

  • EXPOSE: 暴露端口号

  • WORKDIR: 指定镜像创建后,终端默认登录时的工作目录

  • ENV: 用来在构建镜像过程中设置环境变量

  • ADD: 将宿主机目录下的文件拷贝进镜像且 ADD 命令会自动处理 URL 和解压 tar 压缩包

  • COPY: 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

    • COPY src dest
    • COPY ["src","dest"]
  • VOLUME: 容器数据卷,用于数据保存和持久化工作

  • CMD:

    • 指定一个容器启动时要运行的命令
    • Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run之 后的命令参数替换
      • docker run -it centos ls -l 则原 dockerfile 中的 CMD 会被替换掉
    • CMD <命令>
    • CMD ["可执行命令","参数 1","参数 2"...],例如CMD ["curl", "-s", "http://ip.cn"]
    • 参数列表格式:CMD ["参数 1","参数 2"...],指定了在 ENTERYPOINT 指令后,使用 CMD 指定具体的参数
  • ENTRYPOINT

    • 指定一个容器启动时要运行的命令
    • ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动命令及参数
    • docker run 之后的参数会被当做参数传递给 ENTRYPOINT, 之后形成新的命令组合
  • ONBUILD: 当构建一个被继承的 Dockerfile 时运行命令,父镜像在被子继承后父镜像的 onbuild 被触发

Docker Compose

Docker Compose

Docker 问题汇总

docker 修改容器时间

# 进入容器执行,后重启容器
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 或者宿主机执行,后重启容器
docker cp  /usr/share/zoneinfo/Asia/Shanghai 容器ID:/etc/localtime

改完之后,发现 tomcat 时间仍然不对,是因为 docker 中的 java 应用获取时间是从 timezone 中获取,因此进入 docker,修改timezone

echo "Asia/Shanghai" > /etc/timezone

Alpine Linux 操作系统

介绍

Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。

Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。官方镜像来自 docker-alpine 项目。

目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。

使用

目前,大部分 Docker 官方镜像都已经支持 Alpine 作为基础镜像,可以很容易进行迁移。

例如:

  • ubuntu/debian -> alpine
  • python:3 -> python:3-alpine
  • ruby:2.6 -> ruby:2.6-alpine

由于在国内访问 apk 仓库较缓慢,建议在使用 apk 之前先替换仓库地址为国内镜像。

RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \
      && apk add --no-cache <package>