Docker-构建镜像-仓库配置 04

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第1张图片

一、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

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第2张图片

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

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第3张图片

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)手动构建总结:

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第4张图片

三、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

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第5张图片

4) 浏览器验证效果

访问地址:http://192.168.56.11:83/

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第6张图片

更多素材传送门:百度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

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第7张图片

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

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第8张图片

六、申请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) 阿里云生成免费证书

  1. 申请免费的ssl证书 https://dns.console.aliyun.com/#/dns/domainList
    Docker-容器服务 Container Service04(构建镜像+仓库配置)_第9张图片
    Docker-容器服务 Container Service04(构建镜像+仓库配置)

    2.然后按照上面的操作 ,配置ssl证书到nginx(如果是其它的自行选择)

    Docker-容器服务 Container Service04(构建镜像+仓库配置)_第10张图片

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
Docker-容器服务 Container Service04(构建镜像+仓库配置)

4.3 修改本地hosts

Docker-容器服务 Container Service04(构建镜像+仓库配置)

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/

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第11张图片

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

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第12张图片

小结:申请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

Docker-容器服务 Container Service04(构建镜像+仓库配置)_第13张图片

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

http://192.168.56.12:81/
Docker-容器服务 Container Service04(构建镜像+仓库配置)_第14张图片

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