继续本小结内容之前,你需要安装好docker环境,并自行学习完docker的基本使用

后边配置CI/CD的时候,会用到docker镜像,但是公网的镜像不一定能满足我们,我们需要自定义docker镜像,这里面可能会包含敏感信息,因此不能上传到公网。这时候,我们就需要搭建个私有docker仓库,内网可访问即可,docker官方提供的registry镜像是个很不错的选择,完全可以满足我们的需要。除此之外,因为在内网,不管是pull还是push镜像,私有镜像仓库还有速度快的特点。

registry安装

拉取镜像

1
docker pull registry

启动容器

1
docker run -d -p 5000:5000 --restart always --name registry registry

执行curl http://{your ip}:5000/v2/_catalog,看到正常输出内容,表名私有镜像仓库建立成功了。

创建私有镜像

我们以PHP为例,创建一个PHP环境,在centos:latest镜像的基础上,安装php、各种扩展、composer等等,具体的Dockerfile如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM centos:latest
MAINTAINER Liam Yan <ritoyan@163.com>

# remi 源是包含最新的PHP和MYSQL版本的源
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
&& rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm

RUN yum install -y php72-php php72-php-fpm php72-php-devel php72-php-opcache \
php72-php-pecl-redis php72-php-pdo php72-php-pecl-memcached php72-php-mbstring \
php72-php-gd php72-php-xml php72-php-pecl-yaf php72-php-pecl-yac php72-php-pecl-yar \
php72-php-process php72-php-pecl-mysql php72-php-pecl-imagick \
php72-php-ldap php72-php-pecl-mcrypt php72-php-pecl-msgpack \
php72-php-mysqlnd php72-php-soap php72-php-pecl-zip

RUN groupadd www \
&& useradd -g www www

ENV PATH /root/.composer/vendor/bin:/opt/remi/php72/root/usr/bin:/opt/remi/php72/root/usr/sbin:$PATH

RUN php -r "readfile('https://getcomposer.org/installer');" | php \
&& mv composer.phar /usr/local/bin/composer \
&& composer config -g repo.packagist composer https://packagist.phpcomposer.com

RUN composer global require phpunit/phpunit && \
composer global require --dev jakub-onderka/php-parallel-lint && \
composer global require --dev jakub-onderka/php-console-highlighter

Dockerfile所在目录下执行下面命令,--rm表示创建成功之后,删除中间容器,-t后边儿是镜像的名字和标签,php_runner是镜像名,latest是镜像标签

1
docker build --rm -t php_runner:latest .

创建时间可能比较长,等待执行完成之后,运行docker images,看到有一个我们自己创建的镜像

1
2
3
➜  what: ✗ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php_runner latest 0e206cd04042 22 hours ago 711MB

将镜像推送到私有仓库

上一步,我们私有镜像已经创建好了,但是,只能自己在本地用,内网其他人还是用不了,接下来,我们通过简单的几部,将镜像推送到私有仓库,共内网使用。

建立私有仓库tag

1
docker tag php_runner:latest {your ip}:5000/php_runner:latest

将tag推送到私有docker仓库

1
docker push {your ip}:5000/php_runner:latest

可能你会发现,提示错误,推送不上去,o(╯□╰)o。

因为我们建立的私有仓库是http的,docker默认需要https,我们需要在docker后台中配置白名单。

Centos中如果安装的是docker-ce,修改/etc/docker/daemon.json文件,不存在的话创建,添加下面内容

1
2
3
{
"insecure-registries": ["{your ip}:5000"]
}

如果是MAC OS平台,docker服务端完全是界面化操作,设置步骤:Docker => Perference => Daemon => Basic => Insecure Registries,添加一行内容{your ip}:5000

配置完成之后,重启docker服务,再次推送,不出意外,会成功推送到docker私有仓库。

再次执行curl http://{your ip}:5000/v2/_catalog,会返回{"repositories":["php_runner"]},可以看到我们刚建立的image已经存在了。

使用的时候加上ip:port,跟拉取docker hub中的镜像类似。

1
docker pull pull {your ip}:5000/php_runner