Docker学习
参考文档
docker从入门到实践
Dockerfie 官方文档
Docker 最佳实践文档
Docker 官方镜像
一、Docker简介
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付和部署
- 更轻松的迁移
- 更轻松的维护和扩展
二、基本概念
镜像
- 概念:相当于模板
- 分层存储:每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
容器
- 容器的实质是进程。与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
- 容器是以镜像为模板而运行的进程。容器可以被创建、启动、停止、删除、暂停等。
- 容器存储层:每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的层为容器存储层。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器。
仓库
概念:
- Docker Registry 公共仓库
- <仓库名>:<标签>
三、安装Docker
Windows PC
CentOS
镜像加速器(私服)
Docker 官方提供的中国加速仓库镜像 https://registry.docker-cn.com
七牛云加速仓库镜像 https://reg-mirror.qiniu.com/
- Windows 10:对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Daemon。在 Registry mirrors 一栏中填写加速器地址 https://registry.docker-cn.com ,之后点击 Apply 保存后 Docker 就会重启并应用配置的镜像地址了。
- Linux
执行命令docker info,检查是否生效;
四、操作镜像
获取镜像
- docker search image
- docker pull image:[tag]
列出镜像
- 虚悬镜像
- docker image ls -f dangling=true
- docker image prune
- 顶层镜像
- docker images
- 中间层镜像
- 列出部分镜像
- docker images 仓库名
- 列出过滤镜像 -f
- docker image ls -f since=mongo:3.2
- since:列出自某镜像之后的镜像
- before:列出自某镜像之前的镜像
- label:根据LABEL列出镜像
删除本地镜像
- 用 docker image ls 命令来配合
- docker image rm $(docker image ls -q redis)
- docker image rm $(docker image ls -q -f before=mongo:3.2)
- CentOS/RHEL 的用户需要注意的事项:内核中没有UnionFS相关驱动
利用commit理解镜像
- docker run --name container -d -p 80:80 image:[tag]
- docker exec -it container bash
- docker diff
- docker history
注意:镜像制作通常有两种方式,dockerfile与docker commit。慎用 docker commit 这种方式。
- 因为在容器上即使是执行一些简单的操作,也会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿,更不用说一些安装软件包、编译构建等。
- 使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,这对维护工作是非常痛苦的,其他人甚至是制作者一段时间之后也很难知晓对镜像做了什么。
使用Dockerfile定制镜像
-
FROM 指定基础镜像
- FROM scratch 以空白镜像为基础
-
RUN 执行命令
- RUN <命令>
- RUN ["可执行文件", "参数1", "参数2"]
以良好的格式编排Dockerfile,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯。 每一层构建的最后一定要清理掉无关文件。
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
- 构建镜像
-
docker build [选项] <上下文路径/URL/->
例:docker build -t nginx:v3 .
-t nginx:v3 指定最终镜像的名称 . 代表当前目录 -
镜像构建上下文(Context)
一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。那么为什么会有人误以为 . 是指定 Dockerfile 所在目录呢?这是因为在默认情况下,如果不额外指定 Dockerfile 的话,会将上下文目录下的名为 Dockerfile 的文件作为 Dockerfile。这只是默认行为,实际上 Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f ../Dockerfile.php 参数指定某个文件作为 Dockerfile。 -
其它 docker build 的用法
- 直接用 Git repo 进行构建
- 用给定的 tar 压缩包构建
- 从标准输入中读取 Dockerfile 进行构建
- 从标准输入中读取上下文压缩包进行构建
-
Dockerfile指令详解
-
COPY复制文件
使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。 -
ADD高级复制文件
适用于需要自动解压缩的场合。 -
CMD容器启动命令
- shell 格式:CMD <命令>
- exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
- 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。在运行时可以指定新的命令来替代镜像设置中的这个默认命令。
在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 ",而不要使用单引号。
-
ENTRYPOINT入口点
ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式。
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 --entrypoint 来指定。
当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:
<ENTRYPOINT> "<CMD>"
-
ENV设置环境变量
通过环境变量,我们可以让一份 Dockerfile 制作更多的镜像,只需使用不同的环境变量即可。 -
ARG构建参数
-
VOLUME定义匿名卷
-
ENPOSE暴露端口
-
WORKDIR指定工作目录
-
USER指定当前用户
-
HEALTHCHECK健康检查
-
ONBUILD为他人做嫁衣
五、操作容器
启动
守护态运行
终止
docker container ls -a
docker container start
docker container restart
进入容器
docker exec 推荐原因:从容器退出不会终止容器运行;
docker attach
导入和导出
docker export
docker import
考虑docker load与 import的区别
六、访问仓库
Docker Hub
私有仓库
私有仓库高级设置
Nexus 3
七、数据管理
数据卷
Volumes
挂在主机目录
Bind mounts
八、使用网络
高级网络配置
Docker三剑客之Compose项目
Docker三剑客之Machine项目
Docker三剑客之DockerSwarm项目
Swarm mode
安全
底层实现
技术点
- shell
- linux
- docker
- drone
- git
- maven
目标
镜像制作流程
操作
**
-- 查看所有镜像
docker images
--进入镜像内部
docker run -it imageId
注:sh chmod +x 
cmd.sh
给执行脚本赋予可执行命令
docker commit -m '注释' imageId(跟之前的不是同一个) 新的镜像名称
docker push 新的镜像名称**
两种制作镜像方式
运行容器,更新
Dockerfile制作
业务组镜像目标
- 抽取应用的公共配置到镜像中;
- 四个环境的网关
- 简化drone配置及执行命令;
实操流程
- drone中对项目注册秘钥设置;


浙公网安备 33010602011771号