Skip to content

Docker简记

一句话

出场即巅峰的流行了12年的linux虚拟机
docker

安全风险

高封装 = 高风险
如何安全地使用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. 日志、数据卷和构建缓存占用磁盘空间过大

  1. 日志
shell
# 编辑Docker配置文件
vim /etc/docker/daemon.json
# 添加以下内容
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m",
        "max-file": "3"
    }
}
# 重启Docker服务
systemctl restart docker
  1. 数据卷
shell
# 查看docker数据卷大小
docker system df
# 清理docker数据卷
docker volume prune
  1. 构建缓存
shell
# 查看docker缓存大小
docker system df
# 清理docker缓存
docker builder prune

2. Docker下载镜像速度过慢

注册阿里云账号,在控制台中搜索”容器镜像服务“,找到镜像加速器,获取URL地址。 docker

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是你必须掌握的技能。