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