Docker-构建镜像-仓库配置 04
一、Docker 镜像介绍
Docker镜像构建分为两种:
1) 手动构建
2) Dockerfile(自动构建)
二、手动构建过程
基于 centos 镜像进行构建,制作 nginx镜像
1)创建镜像,并安装nginx
[root@localhost opt]# docker run --name qiuyuetao -it centos
# 在centos上装个nginx
# 阿里云找到epel源
[root@0fa09f7a0afe /]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
[root@0fa09f7a0afe /]# yum install nginx -y #安装nginx
2)修改nginx配置文件,让它运行在前台
[root@0fa09f7a0afe /]# head /etc/nginx/nginx.conf
daemon off; ## 取消后台运行,在user 上面添加这一行
user nginx;
#修改完之后 exit 退出
3) 查询Container ID
[root@localhost opt]# docker ps -a #找到刚才创建容器的CONTAINER ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fa09f7a0afe centos "/bin/bash" 20 minutes ago Up 4 minutes qiuyuetao
4)将现有容器保存为镜像,命名为qiuyuetao/qiuyuetao
[root@localhost opt]# docker commit -m "Mynginx" 0fa09f7a0afe qiuyuetao/qiuyuetao:v1
[root@localhost opt]# docker images #查看镜像是否生成
REPOSITORY TAG IMAGE ID CREATED SIZE
qiuyuetao/qiuyuetao v1 14ea0f79983d 24 seconds ago 406 MB
#注释
#-m 描述
#容器ID
第一个qiuyuetaor是仓库的名称
第二个qiuyuetao是镜像的名称
#v1 标签,如果是最后一个版本我们可以打latest
5) 使用刚制作好的nginx镜像
[root@localhost opt]# docker run -d -p 82:80 qiuyuetao/qiuyuetao:v1 nginx
3f78858078c2aa4805dbf255a654cd2c136d3ee6f814527ebb7eb93d4edfb657
## -d 后台运行
## -p 指定端口
## qiuyuetao/qiuyuetao:v1 版本库及版本号
## nginx 执行的命令,例如/bin/bash ,如果nginx没有环境变量,需要数据全路径
6)nginx展示页
[root@localhost opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f78858078c2 qiuyuetao/qiuyuetao:v1 "nginx" 4 minutes ago Up 4 minutes 0.0.0.0:82->80/tcp wizardly_lumiere
7)日志查询
[root@localhost opt]# docker exec -it 3f78858078c2 tail /var/log/nginx/access.log
192.168.56.1 - - [16/Aug/2018:17:27:25 +0000] "GET / HTTP/1.1" 200 3700 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"
192.168.56.1 - - [16/Aug/2018:17:27:25 +0000] "GET /robots.txt HTTP/1.1" 404 3650 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"
192.168.56.1 - - [16/Aug/2018:17:27:25 +0000] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://192.168.56.11:82/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"
192.168.56.1 - - [16/Aug/2018:17:27:25 +0000] "GET /poweredby.png HTTP/1.1" 200 2811 "http://192.168.56.11:82/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"
192.168.56.1 - - [16/Aug/2018:17:27:26 +0000] "GET /favicon.ico HTTP/1.1" 404 3650 "http://192.168.56.11:82/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"
8)手动构建总结:
三、Dockerfile 快速构建过程
1)创建dockerfile 统一存放目录
[root@localhost ~]# mkdir /opt/dockerfile/nginx -p
[root@localhost ~]# cd /opt/dockerfile/nginx/
#将index.html上传到目录
2) 创建dockerfile
[root@localhost nginx]# cat /opt/dockerfile/nginx/Dockerfile
## This Dockerfile
## My Name is Jack Qiu
## Base image
FROM centos
## Maintainer
MAINTAINER qiuyuetao [email protected]
##Commands
RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx && yum clean all
RUN echo "daemon off;" >>/etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]
##文件和dokerfile要在一个目录下
##井号代表注释
##Base image 除了注释的第一行,必须是FROM,意思就是我们需要告诉dockerfile基础镜像是什么
##Maintainer 维护信息
##Commands 命令
##ADD index.html 这个文件需要我们在当前目录下有才可以,我们配置我们可以准备好,然后使用ADD命令进行添加或修改
##EXPOSE 对外端口号
##CMD [“nginx”] 它要启动的命令是nginx (就算是nginx服务)
3) Dockerfile 参数解释
FROM 指定基础镜像 【它的妈妈是谁】
MAINTAINER 指定维护者信息 【他的爸爸是谁,谁创造了它】
RUN 在命令前面加上RUN 【你想让它干点啥】
ADD COPY文件,会自动解压 【往它肚子里放点东西】
WORKDIR 设置当前工作目录,类似于cd
VOLUME 设置卷,挂载主机目录 【给我一个存放行李的地方】
EXPOSE 指定对外的端口 【我要打开的们是啥】
CMD 指定容器启动后要干的事情 【要运行什么】
3)构建容器并启动:
[root@localhost nginx]# docker build -t qiuyuetao/nginx01:v1 /opt/dockerfile/nginx/
# -t 打个标签
#如果构建出错,会跳过已构建的步骤,原因是记录状态
[root@localhost nginx]# docker run -d -p 83:80 qiuyuetao/nginx01:v1 ##启动容器
d82cedc7a10e2d10094da69b54ccbc2cecb30d751cd7b61ceddb7f26d013f209
4) 浏览器验证效果
访问地址:http://192.168.56.11:83/
更多素材传送门:百度JS素材
四、Docker仓库
Docker的仓库是DockerHub,类似于github,github有一个开源的软件叫gitlab。Docker也有一个开源软件docker registry
1)我们先查看镜像,找到registry
[root@localhost nginx]# docker search docker|grep registry
然后使用docker pull 拉取
[root@localhost nginx]# docker pull registry
查看镜像
[root@localhost nginx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest b2b03e9146e1 5 weeks ago 33.3 MB
启动前需要确认端口是否被占用 【默认端口5000】
[root@localhost nginx]# netstat -lntup|grep 5000
输出为空代表,可以正常启动
2)启动容器
[root@localhost nginx]# docker run -d -p 5000:5000 registry
440157a8bc730061aff5dad0150d250f45a59e0a65552c30e253dff72ff1a501
提示:docker比较老的版本运行起来就可以运行,1.7之后都不可以
3)我们新打一个标签
[root@localhost ~]# docker tag qiuyuetao/mynginx:v3 192.168.56.11:5000/qiuyuetao/mynginx:latest
#我们将以前的mynginx打一个标签到5000端口
4)然后push 这个镜像,出现下面的报错
[root@localhost ~]# docker push 192.168.56.11:5000/qiuyuetao/mynginx:latest
The push refers to a repository [192.168.56.11:5000/qiuyuetao/mynginx]
Get https://192.168.56.11:5000/v1/_ping: http: server gave HTTP response to HTTPS client
#缺少https 协议
提示:解决方法有2种,一种是申请免费ssl证书,或者我们本地修改配置文件
五、修改文件配置文件,解决https证书问题
解决办法是:在docker server启动的时候,增加启动参数,默认使用HTTP访问:
1)添加启动参数
vim /usr/lib/systemd/system/docker.service
在12行后面增加 --insecure-registry ip:5000 #ip就是仓库服务器IP
2) 修改好后重启docker 服务
systemctl daemon-reload
systemctl restart docker
3)打包上传到仓库
[root@localhost nginx]# docker tag qiuyuetao/nginx01:v1 192.168.56.11:5000/qiuyuetao/mynginx:latest
[root@localhost nginx]# docker push 192.168.56.11:5000/qiuyuetao/mynginx:latest
六、申请Https证书解决问题并添加认证
1)安装nginx
[root@linux-node1 ~]# yum install nginx -y
[root@linux-node1 ~]# vim /etc/nginx/nginx.conf
…
include /etc/nginx/conf.d/*.conf;
…
#因为在配置文件中已经指定了目录,只有放在/etc/nginx/conf.d/*下面才会识别到
2)配置文件见下文:
[root@linux-node1 conf.d]# cat docker.conf
upstream docker-registry {
server 127.0.0.1:5000;
}
server {
listen 443;
server_name registry.yilongzc.com; ##缺少个分号,nginx居然不报错,坑爹了,之前https死活不行
ssl on;
ssl_certificate /etc/ssl/nginx.crt; #设置你自己的ssl证书位置
ssl_certificate_key /etc/ssl/nginx.key;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 0;
chunked_transfer_encoding on;
location / {
auth_basic "Docker";
auth_basic_user_file /etc/nginx/conf.d/docker-registry.htpasswd;
proxy_pass http://docker-registry;
}
location /_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
location /v1/_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
}
[root@linux-node1 conf.d]#
3) 阿里云生成免费证书
4)创建nginx页面登陆认证
[root@localhost ssl]# cat /etc/nginx/conf.d/docker-registry.conf |grep auth
#查找密码文件路径
4.1 创建密码
[root@localhost ssl]# yum -y install httpd-tools #如果没有htpasswd 请安装
[root@localhost ssl]# htpasswd -c /etc/nginx/conf.d/docker-registry.htpasswd qiuyuetao
New password:
Re-type new password:
Adding password for user qiuyuetao
4.2 启动nginx
[root@localhost ssl]# systemctl start nginx
4.3 修改本地hosts
5) 修改配置文件
[root@linux-node1 ~]# vim /etc/sysconfig/docker
# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled --insecure-registry 192.168.56.11:5000'
6)web页面访问 https://registry.yilongzc.com/
7 ) centos 7 添加防护墙配置 开启443
[root@localhost nginx]# firewall-cmd --add-port=443/tcp --permanent
success #开启443端口
[root@localhost nginx]# firewall-cmd --reload
success # 重新加载配置
[root@localhost nginx]# firewall-cmd --query-port=443/tcp
yes #查看端口使用开启 yes 是 no 不是
7) 构建镜像,并上传至仓库
[root@registry cert]# docker tag qiuyuetao/mynginx:v3 192.168.56.11:5000/qiuyuetao/mynginx:latest
[root@registry cert]# docker push 192.168.56.11:5000/qiuyuetao/mynginx:latest
小结:申请ssl证书后,docker基本上只需要三步
1)修改/etc/sysconfig/docker 配置文件,设置域名
2)构建镜像
docker tag qiuyuetao/mynginx:v3 192.168.56.11:5000/qiuyuetao/mynginx:latest
3) 上传到仓库
docker push 192.168.56.11:5000/qiuyuetao/mynginx:latest
七 Docker 仓库测试
1) 启用一台新的虚拟机:
IP:192.168.56.12
Hostname: node02
Docker版本:1.13.1
#安装并启动docker
[root@node02 ~]# systemctl start docker
[root@node02 ~]# docker images #查看镜像目前为空
REPOSITORY TAG IMAGE ID CREATED SIZE
2)修改配置文件,因为不是https,所以要修改配置文件,跟服务端修改的一样
[root@registry cert]# cat /etc/sysconfig/docker
OPTIONS='--selinux-enabled --insecure-registry 192.168.56.11:5000'
3) 设置hosts解析
[root@registry cert]# cat /etc/hosts
192.168.56.11 registry.yilongzc.com
4) 重启Docker
[root@node02 ~]# systemctl restart docker
5) Docker pull 拉去56.11仓库镜像
[root@node02 ~]# docker pull 192.168.56.11:5000/qiuyuetao/mynginx:latest
6)创建容器并启动
[root@node02 ~]# docker run -d -it --name nginx-node02 -p 81:80 192.168.56.11:5000/qiuyuetao/mynginx
6ad0f0bb104ffa497ac158263ad1d83a92052464dbee0455632111b83885ac24
[root@node02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6ad0f0bb104f 192.168.56.11:5000/qiuyuetao/mynginx "nginx" 8 seconds ago Up 7 seconds 0.0.0.0:81->80/tcp nginx-nod
7)web验证 node02
8 )照上面方法,制作一个nginx镜像并上传到docker仓库中,并运行容器启动nginx服务
八、Docker仓库含义
我们制作好镜像后,默认存放在本地,只可以我们本机使用,其他服务器无法使用,这时候就需要我们一个docker仓库,其他服务器使用的时候只需要进行pull下来即可
Docker默认提供了一个仓库叫docker registry
Docker registry需要使用https进行验证
官方手册 https://docs.docker.com/registry/
Docker registry私有仓库搭建基本几步流程(采用nginx+认证的方式)
1. 申请免费的ssl证书 https://dns.console.aliyun.com/#/dns/domainList
2. 设置nginx ssl证书
3. 设置验证
4. proxy_pass 5000
5. docker run -d -p 5000:5000 –name registry registry:2
九、Harbor简介
harbor是由VMware写的一款针对企业级的开源软件 ,相当于企业级的Registry服务器,与之相比优点如下:
更安全
更快捷
用户管理
访问控制
活动审计
下载链接:https://github.com/vmware/harbor
中文文档:http://vmware.github.io/harbor/index_cn.html