想学习更全面的docker知识可以点击右侧: Docker的概念及基本指令学习(全)
Docker管理
(1)核心概念:
仓库, 注册服务器、镜像,标签,容器,Dockerfile,compose file (容器编排)
注意:
- 注册服务器可以包含若干个仓库,默认使用docker hub(官方的仓库
hub.docker.com),国内的注册服务器主要包括阿里云、腾讯云、网易云等。没有特殊要求的场景下默认使用官网的仓库最好。 - 仓库是一批镜像的合集。仓库的命名通常为 (注册服务器)/(仓库名) 例如:private-docker.com/centeros
可以理解为 private-docker.com这个服务器下有一个centeros仓库,这个仓库中可以包含若干个版本的centOS的镜像 - 镜像是一个模版,能够启动多个容器,在市场用,通常会存在有两大种类的镜像官方镜像以及第三方镜像,建议使用的时候需要注意,最好使用官方的镜像。
- 仓库 + 标签能确定唯一一个镜像
- 容器是通过镜像启动的一个虚拟环境
- Dockerfile是一个文件,其中规定了制作一个镜像的流程,能够打包镜像
- compose file是一个编排文件,里面编排了一个或多个镜像的启动参数,启动后会产生一个或多个容器
(2)Docker镜像管理(使用官方仓库)
- 在官方市场中查看相关的镜像有两种方式:第一可以采用网页方式登录 hub.docker.com然后在页面进行搜索
- 使用docker cli 提供的命令来完成相关操作。
docker search [镜像的名字]
例如:docker search mysql 查看当前仓库中mysql镜像的相关信息。但是需要注意的是,使用docker命令无法查看版本,需要看tag的话要到官方站点来查询
docker pull [镜像名称]:[tag]
例如:docker pull mysql:5.7 docker pull mysql 如果不使用tag 则默认采用最后一个版本
docker images
或 docker image ls
查看当前本地docker中已经下载的镜像信息
docker rmi 镜像:tag
删除一个镜像(需要注意镜像如果有容器正在运行,需要先删除容器后在删除镜像)
docker tag 原镜像名 新镜像名
拷贝镜像 原镜像不需要后可以删除掉
(3)Docker容器管理
- 查询目前系统中的容器信息
查看启动了的
docker ps
查看全部
docker ps -a
- 使用镜像启动容器
例如:docker run nginx
使用nginx镜像启用一个容器(这种启用方式默认会占用当前终端,用户无法进行后续操作),为了解决此类问题我们可以附加参数更好地控制容器:
参数名称 | 说明 |
---|---|
-d | 让docker 容器在后台运行 |
-P | 使用随机的宿主机端口映射容器端口 |
-p | 使用指定端口映射内容端口 -p 宿主机端口:docker 端口 |
-e 参数名=参数值 | 向容器传递参数 |
-v | 挂载数据目录 |
- 容器日志查看
代码 | 说明 |
---|---|
docker logs 容器名 | 展示容器日志 |
docker logs -f 容器名 | 跟踪容器日志 |
docker logs --tail 10 或者 docker logs -n 10 | 从日志的末尾显示日志 |
docker logs -t | 显示日志时间戳 |
docker logs -t --since=“2021-06-02T13:03:00Z” abc | 显示指定时间之后的日志 |
docker logs -t --until=“2021-06-02T13:03:00Z” abc | 显示指定时间之前的日志 |
docker logs abc | greap Chrome |
- 容器控制
代码 | 说明 |
---|---|
docker stop 容器名 | 停止容器 |
docker start 容器名 | 启动容器 |
docker pause 容器名 | 暂停一个容器运行 |
docker unpause 容器名 | 恢复一个容器运行 |
docker restart 容器名 | 重启一个容器 |
docker rm 容器名 | 删除一个容器 |
(4)Docker网络管理
使用docker network ls
查看docker目前支持的网络。当安装完docker后,默认会创建三个网络:bridge网络,host网络和none网络。可以使用:
docker inspect 网络id
查看每一个网络的相关配置netstat -lnpt
查看目前系统开放的端口firewall-cmd --list-ports
查看防火墙开放的端口
docker的四种网络模式
1.host模式
- 例如使用创建一个host模式的mysql容器
docker run -d -e MYSQL_ROOT_PASSWORD='mysql' --net='host' --name='cslcp_mysql' mysql
在容器外连接mysql使用的ip是linux的ip,端口同样是linux的端口3306 - 使用
docker ps -a
的场景下,无法显示目前正在使用的端口。在这种情况下可以使用docker inspect
镜像名来查看该镜像开放的端口号。或者使用docker logs 容器名
查看容器启动日志来查看启动占用的端口,或者通过docker inspect 容器名
来查看容器占用的端口号 - 另外需要注意的问题是,以host模式启动的容器,需要确保容器使用的端口在宿主机的防火墙中配置过开放策略,否则其他机器无法访问对应服务。
firewall-cmd --permanent --zone=public --add-port=80/tcp
- 最后,在使用host模式的场景下,可以开启多个容器,虽然有时候能够启动成功,但是当容器运行一段时间后,会发现只有一个能够运行,其他的都异常关闭了,这是因为端口冲突的原因。至于最后能保留哪一个容器,这个运行的效果不一定。
2.bridge模式(网桥模式,这是docker的默认网络模式)
- 使用
docker network ls
查看当前的docker开放的网络 - 使用
docker inspect 网络id
查看网桥的配置,通常docker的桥模式会在宿主机上创建一个叫做docker0的宿主机网络作为网 桥。可以在宿主机上使用ip addr
查看相关的ip。如果不想使用宿主机上默认的ip可以在 /etc/docker/ 目录中添加 daemon.json 配置文件,在文件中添加{"bip":"192.168.100.1/24"}
配置来修改对应的ip配置。足以在修改上述配置的时候,需要先停止dokcer服务systemctl stop docker
修改完成后再次启动docker服务 - 重新启动docker服务器,再次开启容器,可以查看容器的ip按照新配置的方案进行ip设置
- 如果不希望使用docker分配的ip地址,可以在启动的过程中使用
–ip参数来指定容器需要使用的ip地址(需要注意的是默认的桥接模式不允许用户自定义ip)例如:docker run -itd --name='c6' --network=bridge --ip=192.168.100.7 centos
该命令在指定后会报出异常。
当我们需要使容器与容器进行通信时。可以使用以下策略
静态配置策略
第一步:创建自定义网络
docker network create --subnet=192.168.90.0/24 cslcp_network
第二步:动容器并加入网络
docker run -it --name=cslcp_1 --network=csclp_network --ip=192.168.90.5 centos
使用link配置策略
docker run -itd --name=c1 centos
docker run -itd --name=c2 --link=c1:cnet1 centos
进入到centos输入ping cnet1
查看是否连通
docker exec -it c2 bash
这种配置的优势是可以不使用静态ip,只是使用容器别名就可以直接访问目标容器,避免了在宿主机中出现ip冲突的问题,缺点是容器有依赖关系,所以被依赖的容器一定需要先启动,在一个复杂的网络模型中使用起来比较麻烦。
使用自定义网络+网络别名方案(推荐)
第一步:创建自定义网络
docker network create --subnet=192.168.90.0/24 cslcp_network
第二步:启动容器
docker run -itd --name=c1 --network=cslcp_network --network-alias=c1_net centos
第三步:通过网络别名访问目标容器(进入到centos输入ping c1_net
查看是否连通)
3.container模式
使用该模式可以让多个容器共享同一个ip地址。
docker run -itd --name c1 centos
docker run -itd --name nginx --net container:c1 nginx
4.none模式(全部手工配置,在生产环境下一般不使用该种模式,老师就没讲,有想了解的可以去其他帖子看看)
制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!