Docker如何构建私有镜像以及私有镜像仓库(三)

相信经过前两章的”内功“、”招式“,我们现在已经对Docker比较熟悉了,接下来我们就要学习如何构建私有镜像以及私有镜像仓库,从而使我们所学的docker知识更方便的运用在工作之中。

Docker镜像制作

我们在日常的工作中,常常需要制作公司自己的项目的容器,还要有一个属于自己公司的私有仓库,去保存和随时拉取镜像。

而制作容器有两种方式docker commit以及Dockerfile,接下来就了解一下这两种方式吧

Docker commit

docker commit 容器名 新镜像名:tag

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y6q4cINA-1577675533078)(evernotecid://AAC7D5BC-71C4-4E87-83E8-9011C690F76D/appyinxiangcom/26964881/ENResource/p173)]

制作好之后我们看图片发现镜像制作时间为20s之前,就是我们commit镜像的时间。
使用这种方式的缺点是

  1. 对外不可解释,假设镜像出了问题,使用镜像的人不好排查问题
  2. 第二个缺点是,可维护性差,因为对镜像的操作没有记录。一个理想的镜像制作过程应当如同编码的过程一样,可以通过阅读代码或者注释的方式,能够知道镜像的操作过程。所以我们一般更偏向于使用Dockerfile的方式

Dockerfile

  • 创建一个Dockerfile,一般文件名约定的名称为Dockerfile
  • Dockerfile中一些常用字段的含义
字段名 作用
From 指定继承哪个镜像
ADD 将工作目录下的某个目录或者文件copy到镜像的某个路径下
Run 执行shell 命令
ENTRYPOINT 指定容器启动脚本
ENV 指定容器启动时的环境变量(注意,只有在容器启动时,启动脚本能读取到,如果希望其他用户登录到容器也生效的话,需要写入.bashrc)
USER 容器启动时使用的用户(无的话,则默认root用户)
WORKDIR 容器启动时的工作目录
实战演示

Dockerfile脚本

from jenkins/jenkins:latest
USER root
RUN apt-get update

使用build命令构建镜像,要注意Dockerfile要在当前目录下,才可以直接运行docker build。如果在别的路径下面则需要添加-f参数指定Dockerfile的路径。但是在实际的工作中,我们更加提倡一个目录管理一个Docker及一些配置文件

docker build -t 镜像名称:tag 工作目录
docker build -t lx:v1.0 .

如下图所示,在执行命令时,我们会发现会将执行命令打印出来
Docker如何构建私有镜像以及私有镜像仓库(三)_第1张图片

如果我们需要将外部文件copy到镜像中供镜像使用,则需要ADD命令。而ENTRYPOINT命令则是指定容器启动脚本。
首先,创建Dockerfile

from centos:7
USER root
ADD run.sh /root/
RUN echo "hello world" >> /root/hello.log
ENTRYPOINT ["/root/run.sh"]

并在与Dockerfile同个目录下创建一个run.sh脚本。

#!/bin/bash
env
while true
do
   sleep 10
done

我们进入容器内部可以发现,PID为1的就是我们在Dockerfile中写的run.sh,而进程号为1的进程是所有进程的父进程,如果run.sh进程结束,则其他进程也会一并结束,所以如果目的是启动一个在线服务的容器,为了防止容器运行结束之后就直接退出,我们就将脚本内容,写为一个死循环
Docker如何构建私有镜像以及私有镜像仓库(三)_第2张图片

为run.sh添加权限

chmod 777 run.sh

在build镜像成功之后,我们就可以运行制作好的镜像。

docker build -t test:v1.2 .
docker run -d --name=wayyt_test test:v1.2

Docker如何构建私有镜像以及私有镜像仓库(三)_第3张图片
接下来我们就可以进入镜像,验证run.sh镜像是否copy到了镜像内部

docker exec -it wayyt_test bash

Docker如何构建私有镜像以及私有镜像仓库(三)_第4张图片
结果是,成功!

接下来继续为大家演示env参数

我们在Dockerfile中填加一行ENV DOCKER_HOME=/usr/local/docker
,并在启动脚本中添加env用来打印环境变量
Docker如何构建私有镜像以及私有镜像仓库(三)_第5张图片
启动之后我们查看日志docker logs -f wayyt2发现添加的环境变量成功打印了出来
Docker如何构建私有镜像以及私有镜像仓库(三)_第6张图片
ENV的作用就是注入一些绝对固定的环境变量,这样我们就不用在每次启动后固定再去注入一些环境变量

如果,echo “hello world” >> /root/hello.log

注意,前方有坑
在使用以上配置方式配置Dockerfile时,我们常常会发现使用ssh协议连接容器的时候,明明在dockerfile中指定了环境变量,但是在运行中依然找不到环境变量?
因为在任何用户登录的时候,都会去找.bashrc,执行其中的命令。如果在容器中,我们希望指定的环境变量在ssh协议中依然能够生效。我们需要做的就是用echo命令写到bashrc中。

如图这样子配置Dockerfile,将环境变量写入bashrc,这样通过jenkins或者ssh 协议的连接才能连接到
Docker如何构建私有镜像以及私有镜像仓库(三)_第7张图片

WORKDIR的作用是指定容器的启动目录,只要在Dockerfile中指定一个已存在目录WORKDIR /root/workdir
Docker如何构建私有镜像以及私有镜像仓库(三)_第8张图片

那么当容器运行起来后,进入容器我们会发现,会直接进入WORKDIR的指定路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JrZpMFC2-1577675533083)(evernotecid://AAC7D5BC-71C4-4E87-83E8-9011C690F76D/appyinxiangcom/26964881/ENResource/p169)]

Docker私有仓库

在工作中,为了信息安全,我们是不可能将私有的镜像传到dockerhub中使用,那如果要多个机器共享,又能怎么办呢?

所以每个公司/每个部门,都会有一个私有的镜像仓库供工作使用。私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。

接下来我们就教大家,如果搭建docker的私有镜像仓库
在学习docker的过程中,我们一定要养成多看官方文档的好习惯
这个是官方文档的地址
https://hub.docker.com/_/registry

如何搭建

我们分为两个部分去试验私有镜像仓库是否搭建成功。第一个部分是部署私有仓库,第二个部分是向私有仓库推送镜像,并测试能否拉取成功

部署私有仓库
  1. 拉取官方团队镜像
docker pull registry
  1. 启动registry镜像
docker run -d -p 5000:5000 -v /usr/local/registry:/var/lib/registry --restart=always --name registry registry:2

--restart=always:如果容器出现意外停止,会自动进行重启
3. 查看当前仓库的镜像

curl http://localhost:5000/v2/_catalog

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5JBuG8l-1577675533083)(evernotecid://AAC7D5BC-71C4-4E87-83E8-9011C690F76D/appyinxiangcom/26964881/ENResource/p183)]
可以看到当前镜像仓库镜没有任何镜像

推送并测试拉取镜像
  1. 下载任意一个镜像
docker pull busybox
  1. 为这个打一层tag
docker tag busybox:latest 镜像仓库ip:5000/busybox:v1

busybox:lastest 这是源镜像,也是刚才pull下来的镜像文件;
镜像仓库ip:5000/busybox:v1:这是目标镜像,也是registry私有镜像服务器的IP地址和端口;

  1. 将打好tag的镜像推送到镜像仓库ip:5000仓库中
docker push 镜像仓库ip:5000/busybox:v1

注意在这个地方,可能会出现报错http: server gave HTTP response to HTTPS client,我们需要https的方法才能上传,我们可以修改下daemon.json来解决:

vim /etc/docker/daemon.json 

在daemon.json文件中添加下面的内容,保存后要重启docker服务systemctl restart docker

{
  "registry-mirrors": [ "https://registry.docker-cn.com"],
  "insecure-registries": [ "172.18.18.90:5000"]
}
  1. 再次去服务端镜像仓库查看仓库的镜像,发现多了一个busybox的镜像
curl http://localhost:5000/v2/_catalog

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gmSr3oKj-1577675533084)(evernotecid://AAC7D5BC-71C4-4E87-83E8-9011C690F76D/appyinxiangcom/26964881/ENResource/p182)]

  1. 将本地镜像清空,然后拉取服务端镜像仓库镜像
docker rmi -f $(docker images -aq)
docker images
docker pull 镜像仓库ip:5000/busybox:v1

Docker如何构建私有镜像以及私有镜像仓库(三)_第9张图片
从图片中可以看出这次镜像就拉取成功啦

相信学习完这次的Docker内功研习、招式修炼、加上最后的内外结合,一定能让你对Docker的理解”融会贯通“,更上一层楼。s

你可能感兴趣的:(Docker如何构建私有镜像以及私有镜像仓库(三))