双十一薅了一个ECS该怎么玩

罗秦

共 5074字,需浏览 11分钟

 · 2021-11-20

have one say one,双十一某宝的东西便不便宜不说,双十一新用户的ECS确实比较便宜,2核4G3M的ECS买三年只要500来块,算是比较便宜的了。

做为一个程序员,对服务器这种东西总是有种不一样的情感,会不会玩、需不需要不要紧,先买一个再说。东西是到手了,但是要怎么玩呢?今天介绍一下在ECS上搭建私有Docker仓库的玩法。

Docker

Docker 是一个开源的应用容器引擎,基于Go 语言并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

Docker的应用场景

  1. Web 应用的自动化打包和发布。
  2. 自动化测试和持续集成、发布。
  3. 在服务型环境中部署和调整数据库或其他的后台应用。

Docker 私有仓库

docker 官方开放了公有仓库Docker Hub,用户可以将自己的镜像发布到Docker Hub,发布的镜像对所有人可见。但是很多时候我们会将自己的应用服务打包成镜像进行部署,这时候发布到公有仓库显然不合适。

开发者也可以自己搭建私有仓库,搭建私有仓库可以有以下优点:

  1. 不对外开放,可以发布包含敏感信息的应用镜像。
  2. 镜像加速,可以内网部署,下载速度提升。

私有仓库的搭建

搭建私有仓库开发者可以使用官方提供的docker-registry镜像进行搭建,该镜像只包含仓库的基本功能,不包含WEB界面,对于咱们小玩家来说,包含WEB界面的仓库会占用更多资源,咱们使用docker-registry就可以了。

Docker 安装

开始前请确保Docker已安装。

1、卸载原有Docker

sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

2、设置repository

sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

3、安装Docker

sudo yum install docker-ce docker-ce-cli containerd.io

4、启动Docker

sudo systemctl start docker

5、安装docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

安装docker-registry

使用docker-compose安装docker-registry,更方便管理。

1、编写docker-compose.yml

# docker-compose.yml

version: '3'
services:
registry:
image: registry:2
container_name: registry
ports:
- 5000:5000
volumes:
- ./data:/var/lib/registry
environment:
- TZ=Asia/Shanghai
restart: always

2、启动registry

docker-compose up

可以看到仓库已经启动

docker ps
# 86c0eef146b9 registry:2 "/entrypoint.sh /etc…" 8 days ago Up 8 days 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry

3、推一个镜像测试一下

docker pull ubuntu
docker image tag ubuntu 127.0.01:5000/ubuntu
docker push 127.0.01:5000/ubuntu
docker pull 127.0.01:5000/ubuntu

#
查看一下本地镜像
docker images
# 可以看到类似的如下信息
# REPOSITORY TAG IMAGE ID CREATED SIZE
# 127.0.01:5000/ubuntu latest d6533522acdd 7 days ago 26.9MB

到这里,仓库已经基本可用了,但是我们搭建的私有仓库不能光在本地玩,也不能直接将ECS IP暴露在公网,接下来还需要配置一个密码认证以及nginx代理。

密码认证

以下内容中 /home/username/service 路径为安装根目录,自行调整为对应路径。

1、使用htpasswd生成一份用户名跟密码。

sudo yum install httpd-tools -y
htpasswd -Bbn username password > /home/username/service/nginx/auth/nginx.htpasswd

后续可以用这个账户以及密码进行登陆,镜像推送以及拉取都需要使用这个账户进行鉴权。

使用nginx进行反向代理

1、配置nginx.conf

upstream docker-registry {
server 127.0.0.1:5000;
}

map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
'' 'registry/2.0';
}

server {
listen 443 ssl http2;
# 自行替换域名
server_name registry.domain.com;
root /usr/share/nginx/html;

client_max_body_size 0;
chunked_transfer_encoding on;

#
自行获取证书
ssl_certificate /home/username/service/nginx/ssl/registry.crt;
ssl_certificate_key /home/username/service/nginx/ssl/registry.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;

location /v2/ {
auth_basic "Registry realm";
auth_basic_user_file /home/username/service/nginx/auth/nginx.htpasswd;
add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
proxy_pass https://docker-registry;
}
}

2、完善docker-compose.yml

需要再完善认证以及ssl相关的配置。

version: '3'
services:
registry:
image: registry:2
container_name: registry
ports:
- 5000:5000
volumes:
- ./data:/var/lib/registry
- /home/username/service/nginx/auth:/auth
- /home/username/service/nginx/ssl:/ssl
environment:
- TZ=Asia/Shanghai
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/nginx.htpasswd
- REGISTRY_HTTP_TLS_CERTIFICATE=/ssl/registry.crt
- REGISTRY_HTTP_TLS_KEY=/ssl/registry.key
restart: always

3、启动nginx以及registry

docker-compose up -d
sudo systemctl restart nginx

4、测试一下

如果一切顺利,到这里也就完成了。

docker login -u root https://registry.domain.com
docker pull registry.domain.com/ubuntu

问题总结

按照以上配置,一般来说没有问题,这里说下我配置过程中遇到的几个问题。

nginx权限问题

nginx 错误信息如下

open() "/home/username/service/nginx/auth/nginx.htpasswd" failed (13: Permission denied)

信息很明确,nginx进程没有读取认证文件的读取权限,我这里简单处理,将nginx运行用户改成了root,当然不太建议使用root,不太安全,我就偷个懒了。

vi /etc/nginx/nginx.conf

#
user nginx; ---> user root;

registry协议问题

错误信息如下:

*2 upstream sent no valid HTTP/1.0 header while reading response header from upstream

这里是因为nginx发现代理的协议不对导致的,nginx config中的代理地址应该使用https而不是http。使用我提供的配置,应该不会出现这个问题。

proxy_pass https://docker-registry;

总结

到这里,基本就配置完成了,仓库可以正常运行。开发者可以在任何位置进行推送,部署服务时可以在内网拉取镜像进行应用部署。

关注公众号

欢迎关注作者公众号前端方程式


浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报