Docker之镜像和仓库发布讲解

1 Docker镜像

1.1 官方镜像操作

1.1.1 搜索官方仓库镜像

[root@docker02 ~]#docker search centos
NAME                      DESCRIPTION                    STARS    OFFICIAL               AUTOMATED
centos                    The official build of CentOS.  3992     [OK]      
ansible/centos7-ansible   Ansible on Centos7             105

列表说明:

  • NAME:镜像名称
  • DESCRIPTION:镜像说明
  • STARS:点赞数量
  • OFFICIAL:是否是官方的
  • AUTOMATED:是否是自动构建的

1.1.2 获取镜像

格式:docker   pull   仓库名称[:标签]
如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签

根据镜像名称拉取镜像

[root@docker02 ~]#docker pull centos
Using default tag: latest
latest: Pulling from library/centos
af4b0a2388c6: Downloading  34.65MB/73.67MB

查看当前主机镜像列表

[root@docker01 ~]# docker image list 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        3 weeks ago         207MB
nginx               latest              3f8a4339aadd        5 weeks ago         108MB

拉第三方镜像方法

docker pull index.tenxcloud.com/tenxcloud/httpd

1.1.3 导入导出镜像

[root@docker01 ~]# docker image list 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              ff426288ea90        3 weeks ago         207MB
nginx               latest              3f8a4339aadd        5 weeks ago         108MB

导出
[root@docker01 ~]# docker image save centos > docker-centos.tar.gz

导入镜像
[root@docker01 ~]# docker image load -i docker-centos.tar.gz  
e15afa4858b6: Loading layer  215.8MB/215.8MB
Loaded image: centos:latest

1.1.4 删除镜像

格式1:docker   rmi   仓库名称:标签
当一个镜像有多个标签时,只是删除其中指定的标签
格式2: docker   rmi  镜像ID  [-f]
如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像

[root@docker01 ~]# docker image rm centos:latest
[root@docker01 ~]# docker image list 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              3f8a4339aadd        5 weeks ago         108MB

1.1.5 查看镜像的详细信息

镜像下载后默认存放在 /var/lib/docker

  • REPOSITORY: 镜像所属仓库
  • TAG: 镜像的标签信息,标记同一个仓库中的不同镜像
  • IMAGE ID :镜像的唯一ID号,唯一标识一个镜像
  • CREATED: 镜像创建时间
  • SIZE: 镜像大小

为本地镜像添加新的标签
格式:docker   tag  名称:[ 标签]

[root@docker01 ~]# docker image inspect centos

在这里插入图片描述
在这里插入图片描述

1.1.6 将镜像保存为本地文件

格式:docker   save   -o  存储文件名   存储的镜像

[root@localhost ~]# docker save -o /opt/nginx.tar nginx:latest
#将本地镜像传给另一台主机
[root@localhost ~]# scp /opt/nginx.tar 192.168.1.54:/opt

1.1.7 Docker如何迁移备份

容器保存为镜像

[root@jeames ~]# docker images
[root@jeames ~]# docker ps -a
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
[root@jeames ~]# docker commit redis myredis
##使用新的镜像创建容器
docker run -di --name myredis myredis

镜像的备份

[root@jeames ~]# docker save -o myredis.tar myredis

默认放到当前目录

[root@jeames ~]# ll
[root@jeames ~]# pwd

恢复过程

##删除容器
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
docker stop myredis
docker rm myredis
##删除镜像
docker images
docker rmi myredis
[root@jeames ~]# docker load -i myredis.tar

1.2 自定义镜像操作

  1. 我们进入交互式的centos容器中,发现没有vim命令
    docker run -it centos
  2. 在当前容器中,安装一个vim
    yum install -y vim
  3. 安装好vim之后,exit退出容器
    exit
  4. 查看刚才安装好vim的容器记录
    docker container ls -a
  5. 提交这个容器,创建新的image
    docker commit 059fdea031ba chaoyu/centos-vim
  6. 查看镜像文件
    docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    chaoyu/centos-vim latest fd2685ae25fe 5 minutes ago

1.3 Dockerfile自动构建docker镜像

官方构建dockerffile文件参考:https://github.com/CentOS/CentOS-Dockerfiles

1.3.1 Dockerfile指令集

dockerfile主要组成部分:

基础镜像信息 FROM centos:6.8
制作镜像操作指令RUN yum insatll openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]

dockerfile常用指令:

  • FROM:这个镜像来源于哪里(指定基础镜像)
  • MAINTAINER:告诉别人,谁负责养它(指定维护者信息,可以没有)
  • RUN:构建镜像时运行的指令
  • ADD
    ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)
    功能也类似,不同之处如下
    • 优点:在执行 <源文件>tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压<目标路径>
    • 缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定
  • COPY:等同于上述ADD效果
    复制指令,从上下文目录中复制文件或者目录到容器里指定路径
    格式:COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
    ADDCOPY一起时,优先使用COPY命令
    ADD除了COPY功能还有解压功能
  • WORKDIR:指定工作目录。
    WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会建立目录。
    docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在
    格式:WORKDIR <工作目录路径>
  • VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷,在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点
    作用:避免重要的数据,因容器重启而丢失,这是非常致命的;避免容器不断变大
    格式:VOLUME ["<路径1>", "<路径2>"...]
    VOLUME <路径>
  • EXPOSE:声明端口
    作用:帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口
  • USER:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
    格式:USER <用户名>[:<用户组>]
  • HEALTHCHECK:用于指定某个程序或者指令来监控 docker 容器服务的运行状态
    格式:
    HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
    HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
    HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用
  • CMD
    为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效
    类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
    • CMDdocker run 时运行
    • RUN 是在 docker build
  • ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
    格式:ENV <key> <value>
    ENV <key1>=<value1> <key2>=<value2>...
  • ONBUILD:用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-buildDockerfile 里的 ONBUILD 指定的命令。
    格式:ONBUILD <其它指令>
  • LABELLABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
  • ARG:构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
    构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
  • ENTRYPOINT:容器启动时运行的命令
    类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是,如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
    优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
    注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
    可以搭配 CMD 命令使用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

注意:每一个指令都会在镜像上创建一个新的层,每一个指令的 前缀都必须是大写

1.3.2 创建一个Dockerfile

创建第一个Dockerfile文件

# 创建目录
[root@docker01 base]# cd /opt/base
# 创建Dcokerfile文件,注意大小写
[root@docker01 base]# vim Dockerfile
FROM centos:6.8
RUN yum install openssh-server -y 
RUN echo "root:123456" |chpasswd
RUN /etc/init.d/sshd start 
CMD ["/usr/sbin/sshd","-D"]

构建docker镜像

[root@docker01 base]# docker image build  -t centos6.8-ssh . 
-t 为镜像标签打标签  . 表示当前路径

使用自构建的镜像启动

[root@docker01 base]# docker run  -d -p 2022:22 centos6.8-ssh-b 
dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a

1.3.3 使用Dcokerfile安装kodexplorer

Dockerfile文件内容

FROM centos:6.8
RUN yum install wget unzip php php-gd php-mbstring -y && yum clean all
# 设置工作目录,之后的操作都在这个目录中
WORKDIR /var/www/html/
RUN wget -c http://static.kodcloud.com/update/download/kodexplorer4.25.zip
RUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zip
RUN chown -R apache.apache .
CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]

2 docker仓库发布

2.1 发布公有仓库

docker hub共有镜像发布
docker提供了一个类似于github的仓库docker hub,官方网站(需注册使用)https://hub.docker.com/

注册docker id后,在linux中登录dockerhub
docker login

注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
语法是:docker tag 仓库名 peng104/仓库名
docker tag chaoyu/centos-vim peng104/centos-vim

推送docker image 到dockerhub
docker push peng104/centps-cmd-exec:latest

去dockerhub中检查镜像
先删除本地镜像,然后再测试下载pull 镜像文件
docker pull peng104/centos-entrypoint-exec

2.2 私有仓库

docker hub 是公开的,其他人也是可以下载,并不安全,因此还可以使用docker registry官方提供的私有仓库
用法详解:https://yeasy.gitbooks.io/docker_practice/repository/registry.html

1.下载一个docker官方私有仓库镜像
docker pull registry

2.运行一个docker私有容器仓库
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
-d 后台运行
-p 端口映射 宿主机的5000:容器内的5000
-v 数据卷挂载 宿主机的 /opt/data/registry :/var/lib/registry
    registry 镜像名
    /var/lib/registry 存放私有仓库位置

Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制
3.修改docker的配置文件,让他支持http方式,设置信任,上传私有镜像,

vim /etc/docker/daemon.json 写入如下内容
    {
        "registry-mirrors": ["http://f1361db2.m.daocloud.io"],
        "insecure-registries":["192.168.11.37:5000"]
    }

4.修改docker的服务配置文件
vim /lib/systemd/system/docker.service
找到[service]这一代码区域块,写入如下参数
[Service]
EnvironmentFile=-/etc/docker/daemon.json

5.重启docker服务
systemctl restart docker
注意:重启docker服务,所有的容器都会挂掉

6.修改本地镜像的tag标记,往自己的私有仓库推送
docker tag docker.io/peng104/hello-world-docker 192.168.11.37:5000/peng-hello

2.3 带basic认证的仓库

1、安装加密工具

[root@docker01 clsn]# yum install httpd-tools  -y

2、设置认证密码

mkdir /opt/registry-var/auth/ -p
htpasswd \-Bbn clsn 123456  > /opt/registry-var/auth/htpasswd

3、启动容器,在启动时传入认证参数

docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

4、使用验证用户测试

# 登陆用户
[root@docker01 ~]# docker login 10.0.0.100:5000 
Username: clsn  
Password: 123456
Login Succeeded
# 推送镜像到仓库
[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox 
The push refers to repository [10.0.0.100:5000/clsn/busybox]
4febd3792a1f: Pushed 
1.0: digest: sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352d size: 527
#认证文件的保存位置
[root@docker01 ~]# cat .docker/config.json 
{
    "auths": {
        "10.0.0.100:5000": {
            "auth": "Y2xzbjoxMjM0NTY="
        },
        "https://index.docker.io/v1/": {
            "auth": "Y2xzbjpIenNAMTk5Ng=="
        }
    },
    "HttpHeaders": {
        "User-Agent": "Docker-Client/17.12.0-ce (linux)"
    }
}

至此,一个简单的docker镜像仓库搭建完成

2.4 docker企业级镜像仓库harbor

容器管理

[root@docker01 harbor]# pwd
/opt/harbor
[root@docker01 harbor]# docker-compose stop

1、安装docker、docker-compose
下载 harbor

cd /opt && https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
tar xf harbor-offline-installer-v1.3.0.tgz

2、修改主机及web界面密码

[root@docker01 harbor]# vim harbor.cfg 
    ···
    hostname = 10.0.0.100
    harbor_admin_password = test
    ···

3、执行安装脚本

[root@docker01 harbor]# ./install.sh

浏览器访问 http://10.0.0.11
在这里插入图片描述

添加一个项目
在这里插入图片描述

4、镜像推送到仓库的指定项目

[root@docker02 ~]# docker  tag centos:6.8  10.0.0.100/clsn/centos6.8:1.0
[root@docker02 ~]#  
[root@docker02 ~]# docker images 
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
busybox                     latest              5b0d59026729        8 days ago          1.15MB
10.0.0.100/clsn/centos6.81.06704d778b3ba        2 months ago        195MB
centos                      6.86704d778b3ba        2 months ago        195MB
[root@docker02 ~]# docker login 10.0.0.100
Username: admin
Password: 
Login Succeeded

5、推送镜像

[root@docker02 ~]# docker push 10.0.0.100/clsn/centos6.8 
The push refers to repository [10.0.0.100/clsn/centos6.8]
e00c9229b481: Pushing  13.53MB/194.5MB

6、在web界面里查看
在这里插入图片描述

参考文献:
https://mp.weixin.qq.com/s/8Dt_negpFfecJRsgWwWfsA
https://mp.weixin.qq.com/s/oujJYbWITT_5pqoDDyxKPw

posted @ 2022-12-09 23:03  上善若泪  阅读(299)  评论(0编辑  收藏  举报