Docker简记
一句话
出场即巅峰的流行了12年的linux虚拟机
安全风险
高封装 = 高风险
如何安全地使用Docker?
https://www.cnblogs.com/wintersun/p/18013713
官网安全提示
https://docs.docker.com/engine/security/
可信Docker来源
https://hub.atomgit.com/
安装
官网安装脚本:https://docs.docker.com/engine/install/ubuntu/
清华安装脚本:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
常用命令
Docker Engine
shell
# 启动 关闭 重启 开机启动 查看状态
systemctl start/stop/restart/enable/status docker
# 查看版本
docker version
# 查看全量信息
docker info
# 查看各容器资源占用情况
docker stats
# 查看Docker整体磁盘占用
docker system df
镜像 Image
shell
# 查看本机所有镜像
docker images
# 查找线上镜像
docker search [名称]
# 拉取镜像
docker pull [名称:版本]
# 删除镜像
docker rmi [名称:版本]
# 查看镜像详细信息
docker inspect [名称:版本]
# 保存镜像为tar包
docker save [名称:版本] > [文件名].tar
docker save [名称:版本] -o [文件名].tar
# 加载tar包为镜像
docker load < [名称:版本].tar
docker load -i [名称:版本].tar
容器 Container
shell
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 容器停止/启动/重启/删除
docker stop/start/restart/rm [名称/ID]
# 进入容器
docker exec -it [名称/ID] /bin/bash
# 查看容器详细信息
docker inspect [名称/ID]
# 当前日志
docker logs [名称/ID]
docker logs -f [名称/ID] # 滚动日志
# 退出容器
exit
网络
shell
# 查看所有网络
docker network ls
# 查看网络详细信息
docker network inspect [名称/ID]
# 创建网络
docker network create [名称]
# 删除网络
docker network rm [名称/ID]
# 容器连接网络
docker network connect [名称/ID] [容器名称/ID]
# 容器断开网络
docker network disconnect [名称/ID] [容器名称/ID]
数据卷
shell
# 查看数据卷
docker volume ls
# 查看数据卷详细信息
DockerFile
镜像构建脚本
命令
shell
# 构建
docker build -t [名称:版本] [路径]
配置文件
yml
# 基础镜像
FROM [名称:版本]
# 维护者
MAINTAINER [名称]
# 环境变量
ENV [名称] [值]
# 工作目录
WORKDIR [路径]
# 复制文件
COPY [源路径] [目标路径]
# 复制文件
ADD [源路径] [目标路径]
# 暴露端口
EXPOSE [端口]
# 启动命令
CMD [命令]
# 启动命令
ENTRYPOINT [命令]
最小例子:java开发springboot最后生成的jar包
yml
FROM openjdk:8-jre
WORKDIR /root
COPY./ruoyi-modules-abc.jar /root/ruoyi-modules-abc.jar
CMD ["java","-jar","/root/ruoyi-modules-abc.jar"]
Docker Compose
基础的编排工具
通过编写docker-compose.yml实现只要执行一个命令即可按顺序启动一组容器
命令
shell
# 启动
docker compose up -d
# 关闭
docker compose down
# 单独构建一个容器
docker compose up -d --build [名称]
配置文件
yml
# 版本
version: [版本号]
# 服务
services:
# 服务名称
[名称]:
# 镜像
image: [名称:版本]
# 镜像构建
build:
# 路径
context: [路径]
# 文件名
dockerfile: [文件名]
# 容器名称
container_name: [名称]
# 端口映射
ports:
- [宿主机端口]:[容器端口]
# 环境变量
environment:
- [名称]=[值]
# 数据卷
volumes:
- [宿主机路径]:[容器路径]
# 依赖服务
depends_on:
- [名称]
# 链接服务(过时的)
links:
- [名称]
# 启动命令
command: [命令]
# 重启策略
restart: always
# 网络
networks:
- [名称]
# 健康检查
healthcheck:
test: [命令]
interval: [时间间隔]
timeout: [超时时间]
retries: [重试次数]
# 构建
# 网络
networks:
[名称]:
driver: [网络模式]
例子
yml
version: "3.9"
services:
my-server:
container_name: my-server
build:
context: ./server-folder
dockerfile: dockerfile
ports:
- "9200:9200"
environment:
- TZ=Asia/Shanghai
entrypoint: ["java","-jar","my-server.jar"]
depends_on:
mysql:
condition: service_healthy
links:
- mysql
networks:
my_network:
ipv4_address: 172.22.0.102
mysql:
container_name: mysql
image: mysql:5.7.44
env_file:
- ./mysql/env/mysql.env
volumes:
- ./mysql/data:/var/lib/mysql
ports:
- "3306:3306"
environment:
- TZ=Asia/Shanghai
networks:
my_network:
ipv4_address: 172.22.0.113
healthcheck:
test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
interval: 5s
timeout: 10s
retries: 10
networks:
my_network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.22.0.0/16
常见问题
1. 日志、数据卷和构建缓存占用磁盘空间过大
- 日志
shell
# 编辑Docker配置文件
vim /etc/docker/daemon.json
# 添加以下内容
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
# 重启Docker服务
systemctl restart docker
- 数据卷
shell
# 查看docker数据卷大小
docker system df
# 清理docker数据卷
docker volume prune
- 构建缓存
shell
# 查看docker缓存大小
docker system df
# 清理docker缓存
docker builder prune
2. Docker下载镜像速度过慢
注册阿里云账号,在控制台中搜索”容器镜像服务“,找到镜像加速器,获取URL地址。
shell
# 编辑Docker配置文件
vim /etc/docker/daemon.json
# 添加以下内容
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
# 重启Docker服务
systemctl restart docker
3. Docker默认安装到系统盘,导致系统盘空间不足
shell
# 关闭Docker服务
systemctl stop docker.socket
systemctl stop docker
# 创建Docker目录
mkdir /data/docker
# 编辑Docker配置文件
vim /etc/docker/daemon.json
# 添加以下内容
{
"data-root": "/data/docker"
}
# 拷贝Docker目录下的文件到新目录
cp -r /var/lib/docker/* /data/docker
# 启动Docker服务
systemctl start docker.socket
systemctl start docker
结语
Docker让软件部署变得简单,让运维岗与开发岗的边界更加清晰。
如果你是一名全栈工程师,那么Docker是你必须掌握的技能。