双十一薅了一个ECS该怎么玩
have one say one,双十一某宝的东西便不便宜不说,双十一新用户的ECS确实比较便宜,2核4G3M的ECS买三年只要500来块,算是比较便宜的了。
做为一个程序员,对服务器这种东西总是有种不一样的情感,会不会玩、需不需要不要紧,先买一个再说。东西是到手了,但是要怎么玩呢?今天介绍一下在ECS上搭建私有Docker仓库的玩法。
Docker
Docker 是一个开源的应用容器引擎,基于Go 语言并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
Docker 私有仓库
docker 官方开放了公有仓库Docker Hub,用户可以将自己的镜像发布到Docker Hub,发布的镜像对所有人可见。但是很多时候我们会将自己的应用服务打包成镜像进行部署,这时候发布到公有仓库显然不合适。
开发者也可以自己搭建私有仓库,搭建私有仓库可以有以下优点:
- 不对外开放,可以发布包含敏感信息的应用镜像。
- 镜像加速,可以内网部署,下载速度提升。
私有仓库的搭建
搭建私有仓库开发者可以使用官方提供的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;
总结
到这里,基本就配置完成了,仓库可以正常运行。开发者可以在任何位置进行推送,部署服务时可以在内网拉取镜像进行应用部署。
关注公众号
欢迎关注作者公众号前端方程式
。