初探 Docker 2

仓库

Docker Hub

  • 注册
  • 登录

docker login 命令交互式的输入用户名及密码来完成在命令行界面登录 Docker Hub。
你可以通过 docker logout 退出登录。

docker 的登录可以类比于 github,只有你登录了才能拉取你的私有仓库。

  • 拉取镜像

你可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。

根据是否是官方提供,可将镜像分为两类。
一种是类似 centos 这样的镜像,被称为基础镜像或根镜像。这些基础镜像由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。
还有一种类型,比如 tianon/centos 镜像,它是由 Docker Hub 的注册用户创建并维护的,往往带有用户名称前缀。可以通过前缀 username/ 来指定使用某个用户提供的镜像,比如 tianon 用户。

  • 推送镜像

用户也可以在登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub。

  • 自动构建

类比于 github action, docker 的自动构建可以跟踪你的 commit,进而构建你的镜像(需要配置好 Dockerfile)。

不过我更喜欢用 action 打包好推送到 hub 上面。

私有仓库

有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。

相比于创建自己的 registry 不如使用阿里云的 registry 服务。

  • 安装运行 docker-registry
# 获取官方 registry 镜像来运行
docker run -d -p 5000:5000 --restart=always --name registry registry

这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。

  • 在私有仓库上传、搜索、下载镜像
# 部署registry镜像
docker run -d -p 5000:5000 --restart=always --name registry registry

# 使用 docker tag 将 ubuntu:18.04 这个镜像标记为 127.0.0.1:5000/ubuntu:18.04.d
docker tag ubuntu:18.04 127.0.0.1:5000/ubuntu:18.04.d

# 上传
docker push 127.0.0.1:5000/ubuntu:18.04.d

# 查看
curl 127.0.0.1:5000/v2/_catalog
{"repositories":["ubuntu"]}

docker image rm 127.0.0.1:5000/ubuntu:18.04.d

docker pull 27.0.0.1:5000/ubuntu:18.04.d
  • 注意事项

如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.199.100:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。
这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制。

/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
  "registry-mirror": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "insecure-registries": ["192.168.199.100:5000"]
}

一般都很少在命令行里面搜索,直接去 hub.docker.com 里面搜索,里面有详细的使用说明。

配置仓库证书

好麻烦,不想弄。

数据卷

数据卷

  • 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
  • 可以在容器之间共享和重用
  • 对 数据卷 的修改会立马生效
  • 对 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看到的是挂载的 数据卷。

可以看出来,数据卷类属于我们的硬盘,用来进行持久化储存的,比如说数据库文件等。

创建数据卷

# 创建一个my-volumn数据卷,具体存放在/var/lib/docker/volumes/my-vol/_data
docker volumn create my-volumn

挂载数据卷

启动容器的时候可以指定--mount参数来挂载数据卷

$ docker run -d -P \
    --name web \
    # 下面是缩写,效果等同。
    # -v my-vol:/wepapp \
    --mount source=my-vol,target=/webapp \
    training/webapp \
    python app.py

删除

# 需要确保没有容器使用这个数据卷
docker volumn rm my-volumn

ps: 对于重要的数据卷一定要记得备份。

从主机中目录为数据卷

我们把主机的目录挂载为数据卷就可以和容器共享目录了,比如说nginx的配置目录。

$ docker run -d -P \
    --name web \
    # 缩写命令更好记啊
    # -v /src/webapp:/opt/webapp \
    --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \ # 加入 ,readonly 指定数据卷为只读
    training/webapp \
    python app.py

此外,还可以把文件挂载为数据卷,类似与共享文件。

容器网络

有了网络才能提供容器里面的服务。

从外部访问容器

  • 使用 -p 来进行端口映射

格式为 -p 5000:5000 或者 -p 127.0.0.1:5000:5000

和 ssh 的映射差不多啦。

容器之间互联

说实话,网络这块地方我还是有些地方没有弄明白。但是,了解基本的概念已经可以满足个人的需求了。

  • 创建网络

创建网络可以更好的管理和隔离不同的容器

docker network create -d bridge my-net
  • 让容器加入网络
docker run -it --rm --name busybox1 --network my-net busybox sh
docker run -it --rm --name busybox2 --network my-net busybox sh

我们指定--network的参数,来让容器加入到我们创建的网络中。

这里我们创建了两个容器,现在我们进入一个容器里面,来ping一下另一个容器。

可以发现,使用busybox1名称就可以ping通了。显然docker为我们做了很多事情。

当然,docker有时候不能一步到位,这时候需要我们自己配置dns

方法和配置主机的dns差不都,都是修改/etc/resolv.conf文件。由于容器的文件系统,只能临时有效果。

小结

现在我们应该可以愉快的使用别人的镜像来创建自己专属的容器,不过,等等,我们好像还只能使用别人的镜像。如果要跑自己写的程序呢?好像挺麻烦的。其实,前面少掉了关于如何构建自己的镜像,不过下一节会将到。

不管怎样,数据卷和网络还是非常重要的内容,因为这些是程序能否持久,能否提供服务的基础。

Last modification:August 27th, 2020 at 01:13 am
要饭啦~