什么是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