Docker命令
容器运用比较广泛,微服务、CI。
基础: docker version 、docker info 、docker-compose version …
一、服务案例
1.启动实例
#创建并启动nginxTest实例,并在nginx运行
docker run -d -p 8090:80 --name nginxTest nginx
2.移除服务
#移除服务
docker rm -f nginxTest
3.停止服务
#停止服务
docker stop nginxTest
4.启动/重启服务
docker start nginxTest
docker restart nginxTest
5.查看正在运行的服务
#查看正在运行的服务
docker ps
#查看所有的服务
docker ps -a
二、镜像案例
1.获取本地镜像
#获取本地镜像
docker images
2.查询镜像信息
docker search xx
3.移除镜像
#移除镜像
命令:docker rmi imagename/image ID
强制移除: docker rmi -f imagename/image ID
4.创建镜像
#创建自己的镜像 --->通过Dockerfile 生成镜像 (进入Dockerfile目录)
docker build -t xxx(仓库地址) .
5.获取信息的Image
#如:centos 默认是最新的
docker pull centos
6.镜像迁移
内网环境如何打包迁移镜像文件
# 1.拉取指定版本文件预览服务
docker pull keking/kkfileview:4.1.0
# 2. 将镜像保存在本地
docker save -o kkfileview-4.1.0.tar 200d92888da0
#3. 将镜像通过fz 或者其他工具下载到windows本地桌面
#
# 4. 将文件上传到其他服务器
#
# 5. 将文件加载到镜像仓库中
docker load -i kkFileView-4.1.0.tar
# 6. 运行
docker run -it -p 8012:8012 keking/kkfileview:4.1.0
三、容器内部操作
1.进入Docker实例
#进入Docker实例
@ @ 未创建镜像以前,则可使用: docker run -it 镜像 /bin/bash
@ @ 未创建镜像以前,则可使用: docker run -it 镜像 /bin/sh
xushijiandeiMac:~ xushijian$ docker exec -it 服务名称 /bin/bash
root@d5a08d34f2db:/#
xushijiandeiMac:~ xushijian$ docker exec -it centos:latest
[root@e94d4fd27cc7 /]#
2.查看Docker容器信息
#查看Docker容器信息
docker inspect [containerName]
3.Docker -> 刷新配置(具体业务)
#Docker -> 刷新配置
#针对某一服务:
docker exec -it strength_strength_1 curl -d "" "http://127.0.0.1:31002/refresh"
#查看并调用内部服务:
#1.先进入内部服务: internal 的服务中<返回值异常、请求方法名称(RequestMapping)、多检查几次>
docker exec -it 服务名 bin/bash
#2.再调用接口(具体参数细化集合,多个参数)
如: curl -d "companyName=测试公司&companyId=100" "http://127.0.01:30301/internal//company/company/addMaterialCompany.json"
4.Docker日志维护
#Docker 日志维护(删除日志)
docker inspect [containerName] | grep LogPath | cut -d ':' -f 2 | cut -d ',' -f 1 | xargs echo | xargs truncate -s 0
#(1)如:(只能清除当前日志,如果包含多个日志文件,则其它文件不能删除)
docker inspect eureka_config_1 | grep LogPath | cut -d ':' -f 2 | cut -d ',' -f 1 | xargs echo | xargs truncate -s 0
#(2)实时查看docker容器日志
$ sudo docker logs -f -t --tail 行数 容器名
#例:实时查看docker容器名为eureka_config_1的最后10行日志
$ sudo docker logs -f -t --tail 10 eureka_config_1
5.shell脚本处理日志
shell 脚本删除 docker 日志文件 (==将eureka_config_1 修改成其它的容器名==)
#!/bin/bash
# set your containers base path
containersPath=/var/lib/docker/containers
# get container id by container name 需要调整名称 2022-02-23
containerName=eureka_config_1
# clear current log file
docker inspect ${containerName} | grep LogPath | cut -d ':' -f 2 | cut -d ',' -f 1 | xargs echo | xargs truncate -s 0
#get containerId
containerId=`docker inspect -f '' ${containerName} 2> /dev/null`
if [ ! ${containerId} ];then
echo "container doesn't exist."
exit 2
fi
echo ${containerId}
#clear current log file
#cat /dev/null > ${containersPath}/${containerId}/${containerId}-json.log*
# delete old log file
rm -rf ${containersPath}/${containerId}/${containerId}-json.log.*
备注:
(1) 添加权限 chmod 777 clearDockerLog.sh
(2) xargs 用法 https://www.cnblogs.com/wangqiguo/p/6464234.html
(3) cut 用法 http://blog.csdn.net/u011003120/article/details/52190187
四、Image 管理
通过部署Harbor搭建镜像的私有仓库,维护自己的镜像。(类比:maven 的仓库 nexus等)
image —> Dockerfile【推荐】
image —> container commit 生成新image 【不推荐,无image Layer生成过程】
# 以交互式方式运行官方基础镜像
# docker run -it vim-centos centos
# yum install vim
# vim-centos 启动时名称
docker commit my-centos vim-centos
五、container 管理
监控container工具: weavescope [也可container运行]
# 内存资源 100M, 共享CPU,10的配比 ,如果是20 ,则为 10 的两倍
docker run -d --name my-tomcat --mermory 100M --cpu-shares 10 -p 8080:8080 tomcat
# 查看内存、CPU使用
docker stat my-tomcat
六、 网络
- network
- namespace (创建自己的空间)
- veth-pair 技术(成对出现、网络互通)
-
iptables 技术
1. 单机网络容器
# 查看网路方式 (bridge、host、null)
docker network ls
# 查看网络 桥接方式及网段
docker network inspect bridge
# 创建自己的网络,并查看网段 docker network inspect tomcat-net
docker network create tomcat-net
# 启动容器,指定网络。 可查看IP,在tomcat-net ip 网段中。
docker run -d tomcat-net01 --network tomcat-net
# 查看网段或网络命令
docker exec -it tomcat-net01 ip a
如何让docker0中的服务能连接自定义网端的服务呢?(不同namespace空间,通过network(bridge)方式连接起来)
- bridge 桥接网络方式
- link 线上很少用
# 将tomcat01 加入 tomcat-net 自定义的网络中,自动添加域名解析
docker network connect tomcat-net tomcat01
自定义网络好处?
解决ip问题变化问题(每次重新运行容器)
可以使用网络名访问
# mysql集群实战
docker run -d --name mysql01 --network my-network msyql
docker run -d --name mysql02 --network my-network msyql
docker run -d --name mysql03 --network my-network msyql
# 可以通过网络名访问 my-netwrok:3306/dbName 访问
ping my-network
-
多级网络通信
2.1 多级网络通讯技术
overlay -> vxlan (主机之间不能使用相同的ip)
七、持久化
-
数据持久化
- 创建卷名称 docker volume create –name v1 mysql1 v2 mysql2 v3 mysql3
- 采用 -v 挂载方式,将数据保存在本地,避免数据丢失。
八、容器编排
同一个编排中包含多个容器启动配置
单机编排: docker-compose.yml —>启动: docker-compose up 关闭: docker-compose down
多机编排:docker-swarm、mesos、k8s
docker-swarm 基于 docker stack 多机编排
docker stack deploy -c xx.yml my-service
Ingress : 转发到可利用的服务中
Internal技术:负载均衡
参考文档
[一文搞懂 Linux network namespace](https://www.cnblogs.com/bakari/p/10443484.html)