基础
初学 Docker 技术时参考 Docker 最新超详细版教程通俗易懂 以及 Docker 快速入门总结笔记,后续更多知识点参考官方文档。
常用命令
docker version # 详细版本信息
docker -v # 简略版本信息
docker info # 系统信息,包括镜像和容器数量
docker images # 查看所有镜像,可选项 -a/--all 显示所有(默认不含中间映像层),-q/--quiet 只显示 id
docker search mysql # 搜索 mysql 镜像,其他镜像类似
docker pull mysql:5.7 # 下载 mysql 版本镜像,不指定 5.7 时默认为 latest
docker rmi $(docker images -aq) # 删除所有镜像,可使用单个镜像 id 删除对应单个镜像,可选项 -f 为强制删除
docker ps # 列出正在运行的容器,可选项 -a 显示所有容器(包含未运行容器)
docker start 843f98910778
docker stop 843f98910778
docker restart 843f98910778
docker rm 843f98910778 # 删除容器,rm 后为对应容器 id。关于容器的操作命令,容器 id 和容器名基本通用
docker rm $(docker ps -aq)
# 运行 MySQL,-d 表示后台运行;可添加 -v 主机目录:容器目录 添加容器数据卷信息
# MySQL
docker run -d --name mysql_server -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql
# 进入运行中的容器,-it 表示交互式进入容器内
docker exec -it f90ba583db6d /bin/bash
docker inspect f90ba583db6d # 查看容器元数据信息
docker cp 容器id:容器内路径 主机路径 # 拷贝
进阶命令
# 三种挂载方式 容器内路径后可添加 :ro 表示容器内只读,:rw 表示容器内可读写
-v 容器内路径
-v 卷名:容器内路径
-v 宿主机路径:容器内路径
docker volume ls # 列出所有数据卷信息
docker volume inspect 数据卷名 # 列出指定数据卷详细信息
# --volumes-from 实现“数据卷容器” 共享数据
docker run -it --name mysql02 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql
# DockerFile -> DockerImage -> DockerContainer
# 自定义 centos DockerFile
FROM scratch # 指定基础镜像,多数基础镜像为 scratch
MAINTAINER # 指定维护者信息
RUN # 镜像构建(build)时运行的命令
ADD
WORKDIR # 设置工作目录,直接进入容器时的目录
VOLUME # 设置卷
EXPOSE # 暴露端口
CMD # 指定启动时运行的命令(只有最后一个生效)
ENTRYPOINT # 类 CMD,可以追加,都会生效,追加内容可以是下一行接 CMD 或 ENTRYPOINT
# 注:CMD 与 ENTRYPOINT 的追加都包括 docker run 命令最后跟的参数(如 /bin/bash)
ONBUILD
COPY # 将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
# 实例:构建 centos Dockerfile,命名 mydockerfile
FROM centos
MAINTAINER george<george@example.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD ["ls", "-a"]
CMD /bin/bash # 运行容器时只有本行 CMD 生效
# 实例:使用构建的 Dockerfile 生成镜像,最后的 . 表示当前目录
# 如果命名为 Dockerfile,同级文件夹下可以省略 -f 参数,系统会自动寻找
docker build -f mydockerfile -t mycentos:0.1 .
# 查看镜像制作过程
docker history 镜像id
网络
# 同宿主机上容器可以互相 ping 通 ip
# 不能通过默认的 bridge(即docker0)ping 通容器名
# 如下 --link 参数,tomcat02 可以直接 ping tomcat01,但 tomcat01 不能 ping tomcat02(单向),本质是修改了 hosts 文件
docker run -d -P --name tomcat02 --link tomcat01 tomcat
# 查看所有 docker 网络
docker network ls
# 创建网络,使用自定义网络创建容器,则容器间可以直接使用容器名 ping 通
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker run -d -P --name tomcat02 --net mynet tomcat
# 不同网络连通,本质是直接将容器加入对应网络,该容器则拥有了两/多个 ip
docker network connect mynet tomcat01
docker network inspect mynet
Docker compose
docker-compose -h # 查看帮助
docker-compose up # 启动所有docker-compose服务
docker-compose up -d # 启动所有docker-compose服务并后台运行
docker-compose down # 停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps # 展示当前docker-compose编排过的运行的所有容器
docker-compose top # 展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id # 查看容器输出日志
docker-compose config # 检查配置
docker-compose config -q # 检查配置,有问题才有输出
docker-compose restart # 重启服务
docker-compose start # 启动服务
docker-compose stop # 停止服务
实用经验
日志清理
某日发现容器运行所在服务器磁盘空间不足,查看后发现是 /var/lib/docker/containers/f2a8646430bd5c5bb09cd67240e9363c28fa8498097db047287425ad56ab53301
目录下的日志文件过大导致(目录最后一级会根据容器不同发生变化)。参考经验资料,使用 cat /dev/null > *-json.log
命令清空日志内容,并设置 crontab 任务定时清理日志。
相关命令:
sudo vim /opt/scripts/del_docker_log.sh 编辑脚本
sudo crontab -e -u root 设置定时任务
sudo crontab -l -u root 检查定时任务
添加定时任务内容为:
1 * * * * /bin/bash /opt/scripts/del_docker_log.sh
del_docker_log.sh 中内容为:
rate=`df -h | awk '{print $5,$NF}' | grep "/$" | awk '{print $1}' | awk -F% '{print $1}'`
if [ ${rate} -lt 85 ];then
exit 0;
else
log=`find /var/lib/docker/volumes -name "*.log*" -size +80M -mmin +600 -exec ls -lh {} \;| awk '{print $NF}'`
for f in $log;
do
echo > $f
done
log=`find /var/lib/docker/containers -name "*.log*" -size +80M -mmin +600 -exec ls -lh {} \;| awk '{print $NF}'`
for f in $log;
do
echo > $f
done
find /var/lib/docker/volumes/*/_data/core_* -mmin +600 | xargs rm -f
fi
文档信息
- 本文作者:unigeorge
- 本文链接:https://unigeorge.github.io//notes/docker/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)