为了账号安全,请及时绑定邮箱和手机立即绑定

Docker学习笔记 - 第四篇:镜像仓库

标签:
Docker

最近疫情闹的,在家温习之前在私塾在线买的cc老师的课程Docker,为了加深印象及鞭策一下自己换高薪工作,坚持做系列笔记,记录自己成长的点点滴滴。不过看到消息cc老师最新一期的高级架构师课程也要推出了,里面包含了现在主流的架构,以及最新的技术,据说从理论到运用全部带着做,像现在面试常用的 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”

1111.jpeg

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
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
3
获赞与收藏
2

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消