Docker 基础
软件的依赖,开发环境不确定性,导致部署软件项目是一件令人头疼的事。
虚拟机解决了这个问题,但是太吃内存,很耗资源。 Docker 使用了一个轻量的虚拟机。
优点
- 保证开发、测试、交付、部署的环境完全一致
- 保证资源的隔离
- 启动临时的、用完即丢弃的环境,例如测试
- 迅速(秒级)扩容
Docker 基本概念
docker 可以类比装系统,换系统操作。有了这个前置知识,对于 docker 的一系列知识会更容易理解。
镜像 (images) 与容器 (container)
镜像就和电脑镜像是一样的,而容器对应的就是电脑。电脑和电脑之间是相互隔离的(A 电脑数据无法与其他电脑共享,除非使用特殊手段),容器之间也是如此。
常用命令
pull
1 |
|
从 docker 官方拉取镜像,镜像版本不指定默认下载 Latest 版本。镜像地址不指定默认从 Docker 官方仓库下载。
images 查看所有下载的 docker 镜像
run 运行容器
- –name 为将要启动的容器起一个名字,在引用容器 id 的时候可以替换成容器 name
- –restart=always 遇到错误自动重启
- -p 与宿主机(自己的电脑)
- -v <本地文件>:<容器文件> 与宿主机进行文件映射,使得容器内部和宿主机共享同一份文件
- -p <本地端口>:<容器端口> 将本地端口映射到 docker 容器内部
- -e
= 启动容器时传递的环境变量,使得容器在初始化时可以使用这些变量
rm 删除容器
start/stop/restart 启动/停止/重启一个容器
exec 访问容器,进入容器内部
logs 容器id 查看容器日志
inspect 容器id 查看当前容器的状态信息
tag 镜像id 给镜像取名字
创建自己的镜像
我们可以很方便的从 Docker 官方拉取镜像,就像我们可以很方便的去网上找到 win10 镜像一样。但是,Docker 镜像并不能完全满足你的需求,所以就需要我们自己制作一个镜像。
在开始制作镜像之前,需要知道镜像内部都是分层的,我们来看一个 Redis 的 Dockerfile 文件
1 |
|
上面的代码都很简单
- 使用 FROM 指定基础镜像(当多个镜像指定同一个基础镜像时,就不需要重复下载)
- RUN 后面跟一系列需要执行的命令
- ENV 配置环境变量
- VOLUME 创建可持久化目录
- WORKDIR 指定了工作目录
- ENTRYPOINT 为容器提供命令和参数
- EXPOSE 对外暴露的端口
- CMD 容器启动之后执行的命令
可以看到镜像的制作都是一步一步来的,就好像你跟一个智能机器人说,我要 debian,然后帮我运行一些命令,帮我设置一个工作目录,帮我暴露一个对外端口等等,你只需要用机器人能听懂的语言跟它说,他就会按照你的要求去执行相应步骤。
Dockerfile 文件创建好之后,我们就需要把它构建成一个镜像文件。只需要使用如下命令
1 |
|
等待 Docker 帮你构建完成,接下来你就可以同其他镜像一样使用自己的镜像。
发布自己的镜像
可以通过上面的步骤,自己编写了一个 Dockerfile,并且使用该文件构建一个镜像。如图:
由于新构建的镜像是没有名字的,为了方便后续使用我们可以给它取个名字。我们可以使用如下命令:
1 |
|
再次查看我们的镜像
可以看到 REPOSITORY
那一栏名字变成了 zzf
,TAG
栏也变成了 1.0.0
。需要特别声明的是,REPOSITORY
那一栏的名称,定义了镜像的 push 和 pull 地址,由于我们命令为 zzf
,并没有给镜像设置地址,因此当我们 push 的时候,docker 会使用默认的 docker 官方仓库的地址,如图:
为了发布到自己的 docker 仓库中去,我们需要注册一个 Docker 账号。然后把我们的镜像名称改成如下:
1 |
|
只需要在镜像名前加上 docker 用户名加 /
,即可。这样使用 docker push 命令就能推送到我们的仓库,如图:
这样就推送成功,我们可以登录自己的 Docker 账户查看该镜像。需要使用的时候只需要使用如下命令即可拉取我们自己的镜像,如果有多个版本,则需要在镜像地址后面加冒号跟上对应的版本号即可。
1 |
|