初探 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
文件。由于容器的文件系统,只能临时有效果。
小结
现在我们应该可以愉快的使用别人的镜像来创建自己专属的容器,不过,等等,我们好像还只能使用别人的镜像。如果要跑自己写的程序呢?好像挺麻烦的。其实,前面少掉了关于如何构建自己的镜像,不过下一节会将到。
不管怎样,数据卷和网络还是非常重要的内容,因为这些是程序能否持久,能否提供服务的基础。