cc老师2020年高级架构师系统培训课程7月6号正式开课,现在618活动,限时折扣6800元独享。至少300学时录播课程,60小时直播课,内容包含最新架构体系,现主流的架构,以及即时更新最新的技术,从理论到实践,以及如何解决问题。面试常用的 Netty, Redis, Kafka,Zookeeper, Dubbo, Nginx + openResty + kong + Lua, ElasticSearch等技术都深入源码层级,轻松掌握这些技术,从容应对面试。对于有想跟我一样有着像提高自身技术的同学,课程的详情都在私塾的首页详细说明了,感兴趣的小伙伴,可以一起去 【私塾在线 】 学习

1 Docker仓库

1.1 简介

官方Docker Hub地址:https://hub.docker.com/

1.2 搭建私有仓库

1:下载镜像:docker pull registry

2:启动Docker Registry容器

   docker run -d -p 5000:5000 -v /ccuse/myregistry/:/tmp/registry --privileged=true registry

3:查看Docker Registry进程:docker ps

1.3 私有仓库基本操作

1:查看Registry仓库中现有的镜像

   curl -XGET http://192.168.1.111:5000/v2/_catalog

2:将Docker镜像推到Registry中

  • 给本地镜像打Tag

     docker tag cctomcat9 192.168.1.111:5000/cctomcat9test
  • 推送镜像到Registry中

    docker push 192.168.1.111:5000/cctomcat9test

    会出现错误,因为client与Registry交互默认将采用https访问,但我们在安装Registry时并未配置指定相关的key和crt文件,https将无法访问

  • 在/etc/sysconfig/docker中做配置:

    ADD_REGISTRY='--add-registry 192.168.1.111:5000’

    INSECURE_REGISTRY=‘--insecure-registry 192.168.1.111:5000’

    然后重启docker服务:

    service docker restart

    然后重新推送镜像到仓库中。

1.4 配置Docker Registry管理界面

Docker官方只提供了REST API,并没有给我们一个界面。 可以下载镜像“hyper/docker-registry-web”来进行镜像的管理。
具体的运行和使用,请参见官方文档:https://hub.docker.com/r/hyper/docker-registry-web/
默认的只是浏览仓库中的镜像,如果要删除的话:

  • 要创建一个给registry用的config.yml,在里面设置可以delete,形如:

    version: 0.1
    log:
    level: info
    formatter: text
    fields:
    service: registry-srv
    environment: production
    storage:
    cache:
    layerinfo: inmemory
    filesystem:
    rootdirectory: /tmp/registry
    delete:
    # 要在 ui 上能够删除镜像,enable 的值必须是 true
    enabled: true
    http:
    addr: :5000
  • 创建一个给registry-web用的config.yml,这个官方网站上有

  • 重新启动registry,如:

    docker run -d -p 5000:5000 --name registry-srv -v /ccuse/myregistry/registryconf/:/etc/docker/registry:ro -v /ccuse/myregistry/:/tmp/registry --privileged=true registry

  • 重新启动registry-web,形如:

    docker run -it -d -p 8080:8080 --name registry-web --link registry-srv -v /ccuse/myregistry/forwebconf/config.yml:/conf/config.yml --privileged=true hyper/docker-registry-web

#2 使用MySql镜像

docker pull mysql
docker run --name mysql -p 12345:3306 -v /ccuse/programes/mysqldata:/var/lib/mysql --privileged=true  -e MYSQL_ROOT_PASSWORD=cc -d mysql

这里指定了使用自己的mysql数据文件

  • 使用自定义配置文件,在mysqlconf下放着my.cnf文件:

    docker run --name mysql -p 12345:3306 -v /ccuse/programes/mysqldata:/var/lib/mysql -v /ccuse/programes/mysqlconf:/etc/mysql/conf.d --privileged=true -e MYSQL_ROOT_PASSWORD=cc -d mysql

  • 使用自定义日志目录

    -v /ccuse/programes/mysqllogs:/var/log/mysql
    如果日志开启不成功,可能是因为 mysql用户没有对日志文件夹的操作权限,进入到容器里面,设置一下,示例如下:

    chown -R mysql:mysql /var/log/mysql

  • 数据表备份

    docker exec 容器id sh -c 'exec mysqldump --all-databases -uroot -p"cc"' > /ccuse/all-databases.sql

3 使用Redis镜像

docker pull redis
docker run --name myredis -d redis,默认暴露6379端口
  • 如果想使用自己的配置文件启动redis,一种方法是在其基础上写一个dockerfile,例如:

    FROM redis
    COPY redis.conf /usr/local/etc/redis/redis.conf
    CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

    另外一种方式是在启动命令中修改配置,如:

    docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf

4:数据默认存储在VOLUME /data目录下,使用-v来指定挂载,如:

 docker run --name myreis -d -p 6379:6379 -v /redisdocker/data:/data -v /redisconf/redis.conf:/usr/local/etc/redis/redis.conf --privileged=true  redis redis-server /usr/local/etc/redis/redis.conf  

注意:自己写的conf文件里面,不要配置bind的ip,也不要daemonize的配置,直接注释掉

5:如果需要开启aof的持久化方式,默认是rdb的,可以在配置文件里面设置,也可通过命令行指定:

docker run --name some-redis -d redis redis-server --appendonly yes

6:如果应用需要连接redis:

docker run --name some-app --link some-redis:redis -d application-that-uses-redis

4 容器连接

4.1 简介

前面学习到的端口映射,并不是唯一把docker连接到另一个容器的方法。docker有一个连接系统允许将多个容器连接在一起,共享连接信息。docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。
有时出于安全原因,可以强制docker只允许有连接的容器之间互相通信,可以在启动docker守护进程的时候,加上--icc=false,关闭没有连接的容器间通信。
在docker run的时候, 指定--link :标志创建了两个容器间的父子连接,这样容器就不用暴露端口了,大大增加安全性。

##4.2 基本使用

基本语法:--link 要连接的容器的名字:这个连接的别名

  • 执行连接需要依靠容器的名字,因此创建每一个容器的时候,请使用--name来命名。

    注意:容器的名称必须是唯一的。如果想使用重复的名称来命名容器,需要使用docker rm命令删除以前的容器。

  • 被连接的容器必须运行在同一个Docker宿主机上

  • 示例:

    docker run --name db -e MYSQL_ROOT_PASSWORD=cc -d mysql
    docker run -d -p 9080:8080 --name web --link db:dblink cctomcat:9.0

  • 可以通过docker inspect查看里面的Links,如: "/db:/web/dblink"

Docker学习笔记 - 第四篇:镜像仓库_第1张图片

##4.3 启动常见错误解决方案

如果启动的时候,出现类似如下的错误:

COMMAND_FAILED: '/usr/sbin/iptables -w2 -t nat -A DOCKER -p tcp -d 0/0 --dport 9080 -j DNAT --to-destination 172.17.0.4:8080 ! -i docker0' failed:

这可能是网络问题造成,解决方法如下:

  • 首先先验证docker容器内部网络是否能ping通宿主机

    如果能ping通,即可通过重建docker0网络恢复

  • 先停掉宿主机上运行的docker容器,然后执行以下命令

    iptables -t nat -F
    ifconfig docker0 down
    brctl delbr docker0

  • 重启docker服务

如何使用容器连接来通信
最简单的方法就是在子容器里面,也就是web里面,直接使用link的别名来代替具体的host或者是ip地址,比如:

 jdbc:mysql://dblink:3306/mydb