参考文档:
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 分配一个 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 问题汇总
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>