Docker仓库及Docker Compose

什么是Docker 仓库?

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

1.Docker 官方已经把仓库封装为镜像,直接通过启动容器就可以部署完成仓库

[root@foundation40 ~]# docker load -i registry.tar 
[root@foundation40 ~]# docker run -d -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2    #目录 /var/lib/registry 是仓库存放镜像的位置
[root@foundation40 ~]# docker ps

这里写图片描述
2.给Docker 镜像命名

[root@foundation40 ~]# vim /etc/hosts
添加解析:  172.25.40.250  westos.org
[root@foundation40 ~]# ping westos.org

[root@foundation40 ~]# docker tag nginx localhost:5000/nginx  
#localhost:5000 表示 Registry 的地址和端口

3.推送镜像到 localhost:5000 仓库

[root@foundation40 ~]# docker push localhost:5000/nginx
[root@foundation40 ~]# cd /opt/registry/
[root@foundation40 registry]# docker pull localhost:5000/nginx

4.删除本地 nginx 镜像的 TAG

[root@foundation40 registry]# docker rmi localhost:5000/nginx

5.拉取镜像到本地

[root@foundation40 registry]# docker pull localhost:5000/nginx
[root@foundation40 registry]# docker rmi localhost:5000/nginx
[root@foundation40 registry]# docker rmi nginx
[root@foundation40 registry]# docker pull localhost:5000/nginx
[root@foundation40 registry]# docker tag localhost:5000/nginx nginx

创建证书

1.创建服务端key以及证书

[root@foundation40 registry]# ls
docker
[root@foundation40 registry]# rm -fr *
[root@foundation40 registry]# cd /tmp/
[root@foundation40 tmp]# cd docker/
[root@foundation40 docker]# ls
Dockerfile  ssh  supervisord.conf  test  web  yum.repo
[root@foundation40 docker]# mkdir certs
[root@foundation40 docker]# cd certs/
[root@foundation40 certs]# cd ..
[root@foundation40 docker]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt   
#-x509一般用于根证书,在生成服务端证书时不需要此参数

这里写图片描述
2.创建仓库
启动注册表,指示它使用TLS证书。这个命令将/certs/目录绑定到容器中/certs/,并设置环境变量来告诉容器在哪里找到/certs/domain.crt 和/certs/domain.key文件。注册表在端口443(默认的HTTPS端口)上运行。

[root@foundation40 docker]# docker run -d \
>  --restart=always \
>  --name registry \
>  -v `pwd`/certs:/certs \
>  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
>  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
>  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
>  -p 443:443 \
>  registry:2
[root@foundation40 docker]# docker ps
[root@foundation40 docker]# docker rm -f 623640a0ba36   #删除5000端口
[root@foundation40 docker]# docker ps

这里写图片描述
3.查看端口

[root@foundation40 registry]# netstat -antlp |grep :443

这里写图片描述
4.复制证书

[root@foundation40 registry]# cd /etc/docker
[root@foundation40 docker]# ls
[root@foundation40 docker]# mkdir certs.d
[root@foundation40 docker]# cd certs.d/
[root@foundation40 certs.d]# mkdir westos.org
[root@foundation40 certs.d]# cd westos.org/
[root@foundation40 westos.org]# cp /tmp/docker/certs/domain.crt ./ca.crt
[root@foundation40 westos.org]# ls
[root@foundation40 westos.org]# docker tag nginx westos.org/rhel7
[root@foundation40 westos.org]# docker push westos.org/rhel7

这里写图片描述

证书密码

[root@foundation40 ~]# cd /tmp/docker/
[root@foundation40 docker]# mkdir auth
[root@foundation40 docker]# docker ps
[root@foundation40 docker]# docker rm -f  vm1
[root@foundation40 docker]# docker volume ls
[root@foundation40 docker]# docker volume rm `docker volume ls -q`

1.配置用户权限
如果想要控制registry的使用权限,使其只有在登录用户名和密码之后才能使用的话,还需要做额外的设置。registry的用户名密码文件可以通过htpasswd来生成

[root@foundation40 docker]# docker run --entrypoint htpasswd registry:2 -Bbn haha westos > auth/htpasswd
[root@foundation40 docker]# cat auth/htpasswd

[root@foundation40 docker]# docker run --entrypoint htpasswd registry:2 -Bbn admin admin >> auth/htpasswd
[root@foundation40 docker]# cat auth/htpasswd

这里写图片描述
2.设置用户密码并查看

[root@foundation40 docker]# htpasswd -cm htpaswd haha
[root@foundation40 docker]# cat htpaswd

[root@foundation40 docker]# htpasswd -m htpaswd admin    #用-m添加密码不会将前面用户的密码覆盖
[root@foundation40 docker]# cat htpaswd

这里写图片描述

[root@foundation40 docker]# rm -f htpaswd 
[root@foundation40 docker]# cd auth/
[root@foundation40 auth]# cd ..
[root@foundation40 docker]# docker container prune

这里写图片描述
3.创建仓库

[root@foundation40 docker]# docker run -d \
--restart=always \
--name registry \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-v `pwd`/auth:/auth -e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-p 443:443 \
registry:2

[root@foundation40 docker]# docker ps

这里写图片描述
4.输入用户名和密码

[root@foundation40 ~]# rm -fr .docker/    #以防万一所以先删除所有再执行一次
[root@foundation40 ~]# docker tag nginx westos.org/nginx
[root@foundation40 ~]# docker push westos.org/nginx
[root@foundation40 ~]# docker login -u haha -p westos westos.org

这里写图片描述
5.可以查看到登陆的信息

[root@foundation40 ~]# cd .docker/
[root@foundation40 .docker]# cat config.json 

这里写图片描述

[root@foundation40 .docker]#docker push westos.org/nginx

这里写图片描述


Docker Compose

这里写图片描述

Docker Compose 将所管理的容器分为三层,工程(project),服务(service)以及容器
(contaienr)。Docker Compose 运行的目录下的所有文件(docker-compose.yml, extends 文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker Compose 并没有解决负载均衡的问题,因此需要借助其他工具实现服务发现及负载均衡。
Docker Compose 是一个用来创建和运行多容器应用的工具。使用 Compose 首先需要编写Compose
文件来描述多个容器服务以及之间的关联,然后通过命令根据配置启动所有的容器。 Dockerfile 可以定义一个容器,而一个 Compose
的模板文件(YAML 格式)可以定义一个 包含多个相互关联容器的应用。

封装一个web镜像

1.封装一个网页的镜像

[root@foundation40 ~]# cd /tmp/docker/
[root@foundation40 docker]# cp web/index.html test/
[root@foundation40 docker]# cd test/
[root@foundation40 test]# mkdir nginx/html -p
[root@foundation40 test]# mv index.html nginx/html/
[root@foundation40 test]# tar cf html.tar nginx/
[root@foundation40 test]# ls
[root@foundation40 test]# tar tf html.tar 

这里写图片描述
2.编写Dockerfile文件

[root@foundation40 docker]# cd certs/
[root@foundation40 test]# vim Dockerfile 
FROM rhel7
ADD html.tar /usr/share
VOLUME ["/usr/share/nginx/html"]
[root@foundation40 test]# docker build -t rhel7:v4 .

这里写图片描述
3.创建 volume 容器

[root@foundation40 test]# docker create --name vol rhel7:v4 bash
bdbd4680ebb9a07740b05f3f1babb7230b960c7baf600a56b61435d80a5bd179

4.在容器中添加并挂载该数据卷

[root@foundation40 test]# docker run -d --name vm1 --volumes-from vol nginx
48f723801e4c981d44bb70689b1a622a91e8674b90f23f3eed558bdbe51e9d32
[root@foundation40 test]# curl 172.17.0.2

这里写图片描述
5.查看文件路径来源:

[root@foundation40 test]# cd /tmp/docker/
[root@foundation40 docker]# cd test/
[root@foundation40 test]# ls
[root@foundation40 test]# cd nginx/
[root@foundation40 nginx]# ls
[root@foundation40 nginx]# cd html/
[root@foundation40 html]# ls
[root@foundation40 html]# cat index.html

这里写图片描述


管理多容器,实现负载均衡

1.编写compose配置文件
编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。内容指定 2个 web 容器,以及 1 个 haproxy 容器

[root@foundation40 ~]# mkdir /tmp/docker/compose
[root@foundation40 ~]# cd /tmp/docker/compose
[root@foundation40 compose]# vim docker-compose.yml
apache:
    image: rhel7:v1
    expose:
        - 80    
    volumes:
        - ./web:/var/www/html

nginx:
    image: nginx
    expose:
        - 80

haproxy:
    image: haproxy
    volumes:
        - ./haproxy:/usr/local/etc/haproxy
    links:
        - apache
        - nginx
    ports:
        - "8080:80"   
    expose:
        - 80

这里写图片描述
2.建立haproxy 目录,生成一个 haproxy.cfg 文件

[root@foundation40 compose]# cd ..
[root@foundation40 docker]# cp -r web/ compose/
[root@foundation40 docker]# cd compose/
[root@foundation40 compose]# ls
docker-compose.yml  web
[root@foundation40 compose]# ls web/
index.html
[root@foundation40 compose]# mkdir haproxy
[root@foundation40 compose]# cd haproxy/
[root@foundation40 haproxy]# vim haproxy.cfg
global
    log 127.0.0.1 local0
    log 127.0.0.1 local1 notice
defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    stats uri /status
frontend balancer
    bind 0.0.0.0:80
    default_backend web_backends
backend web_backends
    balance roundrobin
    server web1 apache:80 check
    server web2 nginx:80 check
将docker-compose-Linux-x86_64-1.22.0放到/usr/local/bin/
[root@foundation40 ~]# cd /usr/local/bin/
[root@foundation40 bin]# chmod +x docker-compose-Linux-x86_64-1.22.0 
[root@foundation40 bin]# ln -s docker-compose-Linux-x86_64-1.22.0 docker-compose
[root@foundation40 bin]# cd /tmp/docker/compose/
[root@foundation40 compose]# ls
docker-compose.yml  haproxy  web
[root@foundation40 compose]# docker-compose up

这里写图片描述
在网页访问主机http://172.25.40.250:8080/实现了负载均衡
这里写图片描述
这里写图片描述
在网页访问主机http://172.25.40.250:8080/status查看状态
这里写图片描述
可以看到多了很多进程

[root@foundation40 compose]# docker-compose up

这里写图片描述

猜你喜欢

转载自blog.csdn.net/Argued_D/article/details/81913069