Docker镜像创建及管理(Hub官方仓库使用及私有注册中心搭建)

简介: Docker镜像创建及管理(Hub官方仓库使用及私有注册中心搭建)

写在前面

系统环境:centos 7

一、Docker如何创建镜像

镜像的来源有两种:

  1. 从镜像仓库下载镜像;
  2. 自己创建新的镜像。创建分为两种:(1)基于已有镜像创建;(2)使用Dockerfile创建。
1.1 基于已有镜像创建

基于已有容器构建镜像主要是通过 docker commit 命令来构建新的镜像。构建步骤主要分为三步:(1)运行容器;(2)修改容器;(3)将容器保存为新的镜像。

运行容器
docker run -it ubuntu   # 运行容器

修改容器

这里我们往容器里添加了 hello.c 文件

touch hello.c   ## 修改容器,
exit            # 退出容器

保存为新的容器
docker commit -a "panda" -m "commit test" 7f77678f7782 ubuntu-hello  # 保存为新的容器
docker images # 查看

可以看到已经有了 ubuntu-hello 镜像。启动新的镜像,查看是否存在 hello.c 文件。

1.2 使用Dockerfile创建
1.2.1 构建镜像步骤分为三步:
  1. 将上下文发送到守护进程;
  2. 守护进程拿到上下文,向docker server发送http请求,构建镜像
  3. docker server 拿到上下文,按照docerfile要求创建镜像,构建过程可能会用到缓存
1.2.2 Dockerfile 关键字
FROM         设置镜像使用的基础镜像
MAINTAINER   设置镜像的作者
RUN        编译镜像时,要执行的命令
CMD        设置容器的启动命令
LABEL      设置镜像标签
EXPOSE     设置镜像暴露的端口
ENV          设置容器的环境变量
ADD      编译镜像时复制上下文中文件到镜像中
COPY       编译镜像时复制上下文中文件到镜像中
ENRYPOINT    设置容器的入口程序
VOLUME     设置容器的挂载卷
USER     设置 RUN CMD ENTRYPOINT 的用户名
WORKER     设置RUN CMD ENTRYPOINT COPY ADD 指令的工作目录
ARG        设置编译镜像时加入的参数
ONBUILD      设置镜像的 ONBUILD 指令
STOPSIGNAL   设置容器退出时候的信号量

Add 和 copy的区别

COPY  ./hello.c  ./
ADD   ./nginx.tar.gz  ./
ADD   http://www.panda.com/nginx.tar.gz

ADD可以在拷贝压缩文件的时候回直接进行解压,如果ADD后面跟的是网址,可从网站直接下载文件,这里就是单纯的下载文件了,不解压!

1.2.2 Dockerfile实战:以hello.c 为例,创建Dockerfile

更多关于Dockerfile的编写及优化,会在后面专门出一篇文章,有兴趣的同学可以持续关注~

创建 hello.c 源文件

#include <stdio.h>
int main()
{
    printf("hello, world\n");
    return 0;
}

创建 Dockerfile 文件

FROM gcc 指定基础镜像,如果是go程序 则 FROM golang:1.18,如果不指定版本,默认最新版本。注意:pwd是在构建过程中执行的,并不是在容器中执行

FROM gcc
MAINTAINER panda
COPY ./hello.c ./
RUN pwd
LABEL myhello 1.0.0
LABEL env prod
RUN gcc  hello.c -o hello
CMD ["./hello"]

构建镜像

docker build -t myhellc .

运行镜像

docker run -it myhelloc

细心的小伙伴可能发现了,我们的代码实际上就写了一行。但是,构建出来的镜像却有1.27个g,很明显是不合理的。此时,就需要多阶段构建。

二、Docker镜像管理

2.1 Hub官方仓库使用

Docker Hub是目前Docker官方维护的一个公共仓库,它用来保存我们的镜像其中包括海量镜像,如:nginx、redis、ubuntu等,跟github作用类似。

2.1.1 使用Hub官方仓库需要用户名、密码和邮箱来注册账号。注册完登录成功,就可以开始搭建自己的仓库了。

2.1.2 登录验证

注意:默认登录使用的是官方仓库,登出也是。

docker login -u panbamboo  # 直接使用-u 默认登录的是官方仓库

2.1.3 镜像推送验证

我们将第一部分生成的myhelloc镜像重新打个tag( hello是镜像名称,tag为1.0.0 )上传到我们刚建的公有仓库。

# 打tag
docker tag myhelloc:latest panbamboo/hello:1.0.0
# 推送到公有仓库
docker push panbamboo/hello:1.0.0

推送完成,刷新下界面就能看下途中红色框中的镜像已经成功上传了。

现在我们可以删除本地panbamboo/hello:1.0.0镜像,docker images 查看本地已经没有该镜像。

docker rmi panbamboo/hello:1.0.0  # 

再从远端仓库拉取镜像。

到这里我们就掌握使用官方Hub仓库推送和拉取镜像了,是不是很简单~

2.2 搭建私有仓库

官方给我们提供了一个 registry 的镜像来帮助我们搭建私有镜像注册中心。在首页搜索 registry ,然后复制 红色框命令,准备拉取镜像。私有仓库如果是公司内网访问的话,用户名密码也可以考虑省略。

2.2.1 拉取 registry 镜像
docker pull registry

2.2.2 安装 apache2-utils

apache2-utils 是用来生成用户名和密码,安装命令如下:

#  ubuntu 
sudo apt-get install apache2-utils   
# centos
sudo yum -y install httpd-tools   
2.2.3 创建存储目录

因为是注册中心,用来存放镜像,所以先创建一个位置来存放我们的镜像。

注意:创建前先使用echo $HOME 查看下自己的HOME路径是什么,否则你创建完都不知道自己创建的目录在什么位置

echo  $HOME
/root        #  $HOME 的值
mkdir -p $HOME/registry
mkdir -p $HOME/registry/auth
mkdir -p $HOME/registry/data

将用户名密码写入 /root/registry/auth/ 目录下 htpasswd 文件,密码是加密后的形式。

# 用户名和密码都是:panda
htpasswd -Bbn panda panda > $HOME/registry/auth/htpasswd

2.2.4 运行docker
docker run -d -p 5000:5000 --name registry --restart=always -v $HOME/registry/data:/var/lib/registry -v $HOME/registry/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry:2

使用 docker ps 看到 registry 表明启动完成。

补充:还可以使用docker inspect registry 查看目录挂载情况(Mounts字段)

2.2.5 修改 docker.service 配置文件

在如下位置后面添加:–insecure-registry localhost:5000,localhost:5000 是用户名,可以任意起名。

vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
--insecure-registry localhost:5000

到这里,我们的私有注册中心就构建完成了。

2.2.6 私有中心推送和拉取验证

因为我们目前使用的官方仓库,所以,我们需要先登出,才能登录私有注册中心。

注册中心切换
docker logout
docker login localhost:5000   # 这里写你自己的
docker tag myhelloc:latest localhost:5000/hello:1.0.0
推送验证
docker push localhost:5000/hello:1.0.0   ## 等待推送成功即可
拉取验证
docker images # 找到localhost:5000/hello:1.0.0 对应的 IMAGE ID a62b4a7b6bfc
docker rmi -f a62b4a7b6bfc   # -f 强制删除该镜像
docker pull localhost:5000/hello:1.0.0  ## 拉取镜像
2.3 docker save/load 命令

docker save可以保存本地已有镜像到 xxx.tar 文件,再通过 docker load -i xxx.tar 加载本地镜像

docker save -o nginx.tar nginx:latest  # 将nginx镜像保存到本地 nginx.tar 文件
tar -xvf nginx.tar -C tmp/  # 将镜像解压到tmp目录,有兴趣的可以看看里面有什么,实际上还是分层存储
docker load -i nginx.tar  # 从本地加载镜像

与docker import/ export 的区别

docker load 在加载的时候是无法修改镜像的名称以及tag的,docker import/ export可以。


推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:

相关文章
|
3天前
|
Docker 容器
【Docker】掌握 Docker 镜像操作:从基础到进阶
【Docker】掌握 Docker 镜像操作:从基础到进阶
|
2天前
|
运维 Linux Docker
Docker详解(四)——Docker换源与镜像拉取
Docker详解(四)——Docker换源与镜像拉取
10 0
|
2天前
|
应用服务中间件 Shell nginx
制作docker镜像的dockerfile编写规则汇总
制作docker镜像的dockerfile编写规则汇总
|
2天前
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI 操作报错合集之在本地构建easyrec docker镜像时遇到了无法连接docker服务如何解决
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
2天前
|
Linux 网络安全 Docker
【Linux】-docker配置容器并打包成镜像
【Linux】-docker配置容器并打包成镜像
|
5天前
|
存储 Apache Swift
无限套娃_docker入门(镜像、容器、仓库)
无限套娃_docker入门(镜像、容器、仓库)
16 0
|
6天前
|
存储 API 数据安全/隐私保护
企业级Docker镜像仓库Harbor部署与使用
企业级Docker镜像仓库Harbor部署与使用
|
6天前
|
Ubuntu Linux Shell
Docker 镜像及其命令
Docker 镜像及其命令
45 0
|
6天前
|
存储 Ubuntu Linux
[Docker] 镜像讲解
[Docker] 镜像讲解
|
7天前
|
安全 JavaScript Docker
修改docker镜像版本,容器大小缩小10%!
`shigen`,一位专注于Java、Python、Vue和Shell的博主,分享其通过修改Docker镜像版本实现容器瘦身的技巧。将服务从`1.0.0`更新至`1.0.1`,基于Alpine版Docker镜像,容器体积减小至原来的10%。文章展示了问题背景、选择轻量级镜像的原因及步骤,包括Docker镜像版本对比、构建和启动新容器的过程,并证实功能未受影响。`file-server`更新将发布在GitHub上,期待用户试用。一起学习,每天进步!
21 2
修改docker镜像版本,容器大小缩小10%!