Docker 基础

软件的依赖,开发环境不确定性,导致部署软件项目是一件令人头疼的事。

虚拟机解决了这个问题,但是太吃内存,很耗资源。 Docker 使用了一个轻量的虚拟机。

优点

  • 保证开发、测试、交付、部署的环境完全一致
  • 保证资源的隔离
  • 启动临时的、用完即丢弃的环境,例如测试
  • 迅速(秒级)扩容

Docker 基本概念

docker 可以类比装系统,换系统操作。有了这个前置知识,对于 docker 的一系列知识会更容易理解。

镜像 (images) 与容器 (container)

镜像就和电脑镜像是一样的,而容器对应的就是电脑。电脑和电脑之间是相互隔离的(A 电脑数据无法与其他电脑共享,除非使用特殊手段),容器之间也是如此。

常用命令

pull

1
docker pull 镜像:镜像版本 

从 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM debian:buster-slim

RUN groupadd -r -g 999 redis && useradd -r -g redis -u 999 redis

ENV GOSU_VERSION 1.12
RUN .... // 一系列命令(此处已省略)

ENV REDIS_VERSION 6.2.5
ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-6.2.5.tar.gz
ENV REDIS_DOWNLOAD_SHA 4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae

RUN .... // 一系列命令(此处已省略)

RUN mkdir /data && chown redis:redis /data
VOLUME /data
WORKDIR /data

COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 6379
CMD ["redis-server"]

上面的代码都很简单

  • 使用 FROM 指定基础镜像(当多个镜像指定同一个基础镜像时,就不需要重复下载)
  • RUN 后面跟一系列需要执行的命令
  • ENV 配置环境变量
  • VOLUME 创建可持久化目录
  • WORKDIR 指定了工作目录
  • ENTRYPOINT 为容器提供命令和参数
  • EXPOSE 对外暴露的端口
  • CMD 容器启动之后执行的命令

可以看到镜像的制作都是一步一步来的,就好像你跟一个智能机器人说,我要 debian,然后帮我运行一些命令,帮我设置一个工作目录,帮我暴露一个对外端口等等,你只需要用机器人能听懂的语言跟它说,他就会按照你的要求去执行相应步骤。

Dockerfile 文件创建好之后,我们就需要把它构建成一个镜像文件。只需要使用如下命令

1
docker build <dockerfile 所在目录>

等待 Docker 帮你构建完成,接下来你就可以同其他镜像一样使用自己的镜像。

发布自己的镜像

可以通过上面的步骤,自己编写了一个 Dockerfile,并且使用该文件构建一个镜像。如图:
image.png

由于新构建的镜像是没有名字的,为了方便后续使用我们可以给它取个名字。我们可以使用如下命令:

1
docker tag cf6ef720090d zzf:1.0.0

再次查看我们的镜像
image.png

可以看到 REPOSITORY 那一栏名字变成了 zzfTAG栏也变成了 1.0.0。需要特别声明的是,REPOSITORY那一栏的名称,定义了镜像的 push 和 pull 地址,由于我们命令为 zzf,并没有给镜像设置地址,因此当我们 push 的时候,docker 会使用默认的 docker 官方仓库的地址,如图:
image.png

为了发布到自己的 docker 仓库中去,我们需要注册一个 Docker 账号。然后把我们的镜像名称改成如下:

1
docker tag cf6ef720090d wszzh/zzf:latest

只需要在镜像名前加上 docker 用户名加 /,即可。这样使用 docker push 命令就能推送到我们的仓库,如图:
image.png
这样就推送成功,我们可以登录自己的 Docker 账户查看该镜像。需要使用的时候只需要使用如下命令即可拉取我们自己的镜像,如果有多个版本,则需要在镜像地址后面加冒号跟上对应的版本号即可。

1
docker pull wszzh/zzf

Docker 基础
http://wszzf.top/2021/12/08/Docker 基础/
作者
Greek
发布于
2021年12月8日
许可协议