乐趣区

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

cc 老师最新一期的高级架构师课程终于确定日期了,7 月 6 号正式开课,现在 618 活动,三天限时折扣中 6800 一人不限时免费更新课程是最大的卖点,里面包含了现在主流的架构,以及最新的技术,据说从理论到运用全部带着做,像现在面试常用的 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/hype…
默认的只是浏览仓库中的镜像,如果要删除的话:

  • 要创建一个给 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”

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
退出移动版