最近疫情闹的,在家温习之前在私塾在线买的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”
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
共同学习,写下你的评论
评论加载中...
作者其他优质文章