02 Docker
Docker 属于 Linux 容器的一种封装,它是目前最流行的容器解决方案。容器有点像虚拟机,提供虚拟化的环境。Docker 本身并不是容器,它是创建容器的工具,是应用容器引擎。
关于 Docker
Docker 概念
Build, Ship and Run. Build once,Run anywhere.
Docker 的主要用途,目前有三大类:
提供一次性的环境:比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
提供弹性的云服务:因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
组建微服务架构:通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
在 Docker 中,有两大核心概念 image(镜像)和 container(容器)。Docker 把应用程序及其依赖打包在 image 文件里面。只有通过这个文件,才能生成 container。
我们以编程语言中的类和实例的关系来类比 image 和 container。其中 image 好比一个 Class 类文件,container 就是类的实例,image 是创建 container 的模板,image 可以“继承”自其他 image 文件,每个 container 容器都是由一个 image 生成,同一个 image 文件,可以生成多个同时运行的 container 实例。
image 镜像生成的 conatiner 实例,本身也是一个文件,称为容器文件。所以一旦容器生成,就会同时存在两个文件:image 文件和 container 文件。关闭容器并不会删除容器文件,只是容器停止运行而已。
传统虚拟化方式区别
Docker 和传统虚拟化方式区别:传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
Docker 跟传统的虚拟化方式相比具有众多的优势:
更高效的利用系统资源:容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。
更快速的启动时间:Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。
一致的运行环境:Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。
持续交付和部署:Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。
更轻松的迁移:Docker 确保了执行环境的一致性,使得应用的迁移更加容易。
更轻松的维护和扩展:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单。
Docker 引擎
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。通过 docker version
命令查看可以看到 docker 包含一个客户端和服务端的程序:
Docker 引擎是一个包含以下主要组件的客户端服务器应用程序:
一种服务器,它是一种称为守护进程并且长时间运行的程序
REST API 用于指定程序可以用来与守护进程通信的接口,并指示它做什么
一个有命令行界面 (CLI) 工具的客户端
Docker 系统架构
标题 | 说明 |
---|---|
镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
容器(Container) | 容器是独立运行的一个或一组应用。 |
客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。 |
主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 |
Docker Machine | Docker Machine 是一个简化 Docker 安装的命令行工具。 |
Docker 命令
Docker 命令分管理命令 Management Commands
和命令 Commands
。Docker 1.13+ 引入了管理命令来帮助组织一堆 Docker 命令。两个命令都做同样的事情,管理命令有助于对所有命令进行分类,并使命令本身更加一致。所以推荐使用管理命令,虽然多敲了几个字符,但是语义更清晰。
示例:
需要注意:
docker container run
命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull
命令并不是必需的步骤。docker container run
是新建容器,每运行一次生成一个容器文件,注意要避免重复执行。可以使用docker container start
启动已生成的容器。docker container kill
向容器内主进程发出 SIGKILL 信号来终止容器运行。docker container stop
先向主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。docker container logs
查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run
命令运行容器的时候,没有使用-it参数
,就要用这个命令查看输出。docker container exec
进入容器内部。如果docker run
命令运行容器的时候,没有使用-it参数
,就要用这个命令进入容器内部。
查看日志
Docker 容器制作
编写 Dockerfile 文件
Dockerfile 文件是一个文本文件,用于配置 image,生成自己的 image 镜像。在配置 Dockerfile 文件之前,需要先添加一个文本文件 .dockerignore
,用于排除不需要打包进入 image 镜像的文件路径。
之后创建 Dockerfile 文本文件,配置如下(摘取自阮一峰博客 Docker 入门教程):
创建 image 镜像
配置好 Dockerfile 文件之后,即可创建自己的 image 镜像文件:
参数详解: -t
用来指定 image 文件的名字,名字后面冒号指定标签,如果不指定默认的标签为 latest
。最后的参数指定 Dockerfile 文件所在的路径,上例中 Dockerfile 在当前路径,所以为点号 .
。
生成容器
参数详解:
--rm 参数
:容器停止运行时自动删除容器文件-p 参数
:容器的 3000 端口映射到本机的 8000 端口。-it 参数
:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。koa-demo:0.0.1
:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。/bin/bash
:附加命令,容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
CMD 命令
上例容器启动之后,需要手动在命令窗口执行 node index.js
来运行服务,通过 CMD 命令
可以自动执行。我们在 Dockerfile 里添加:
需要注意:添加了 CMD 命令
后,启动容器时后面便不能附加命令 /bin/bash
了,否则会覆盖 CMD 命令
。
RUN 命令
与 CMD 命令
的区别:
RUN 命令
在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD 命令
则是在容器启动后执行。一个 Dockerfile 可以包含多个
RUN 命令
,但是只能有一个CMD 命令
。
发布 image 镜像
可以在创建 image 镜像或者发布 image 镜像时标注用户名。
ENTRYPOINT 与 CMD
ENTRYPOINT 与 CMD 的关系:
如果没有定义 ENTRYPOINT,CMD 将作为它的 ENTRYPOINT
定义了 ENTRYPOINT 的话,CMD 只为 ENTRYPOINT 提供参数
CMD 可由 docker run [imageName] 后的命令覆盖,同时覆盖参数
问题
docker 无权限
打包推送脚本
build.sh:
Dockerfile
docker 未启动
docker-compose 无法启动 mysql
报错:
首先在 docker-compose.yml
添加配置文件:
在 ./mysql/conf
文件夹下添加一个本地配置文件 local.cnf
:
给文件授权:
重新启动,问题解决!
docker compose 指定文件启动
docker push 无法推送
报错:
需要修改 tag,然后再推送:
docker push 无权限
docker push 时报错:
解决方式:删除客户端配置文件 ~/.docker/config.json
,然后在登录 docker 后即可推送成功。
sh 脚本无法运行
Linux 执行.sh 文件,提示 No such file or directory
的问题,可能是平台之间权限兼容的问题。
首先用 vim 打开该 sh 文件,输入 :set ff
,回车显示文件编码为 fileformat=dos
。所以需要重新设置下脚本文件格式,vim 输入 :set ff=unix
,保存后退出再执行即可。
需要注意:使用 vagrant 虚拟机进行 maven 打包的时候,需要配置 mvnw 文件编码。
x509: certificate signed by unknown authority
docker 登录报错, x509: certificate signed by unknown authority.
:
docker-compose: command not found
Note: If the command docker-compose fails after installation, check your path. You can also create a symbolic link to /usr/bin or any other directory in your path.
For example:
Install Compose on Linux systems
新增或编辑 /etc/docker/daemon.json
文件:
重启 docker:
一些文档
最后更新于