docker 使用指南

 

docker官方仓库:https://hub.docker.com  /  https://docker.fxxk.dedyn.io

 

ubuntu 26.04 安装 docker

  • 安装依赖: sudo apt  install apt-transport-https ca-certificates curl software-properties-common -y
  • 安装GPG证书: curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  • 导入下载源:echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 更新下载源:sudo apt update
  • 安装 docker:  sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
  • 配置容器镜像

 

ubuntu 18.04.6 安装 docker

  • 安装依赖: sudo apt -y install apt-transport-https ca-certificates curl software-properties-common
  • 安装GPG证书: curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    • 查看:sudo apt-key list
    • 删除:sudo apt-key del 0EBFCD88 //  0EBFCD88 是 list 列表里 pub 的最后几位
  • 写入软件源信息:sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    • 也就是会把 "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" 这个信息写到 /etc/apt/sources.list 里面 , 要删除的话直接找到这一行删除就好了
  • 更新源缓存:sudo apt update
  • 安装 docker:  sudo apt -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin // 其实安装 docker-ce 会自动安装后面的, 安装了之后 默认就是启动的:systemctl status docker
  • 通过阿里云配置镜像加速器:容器镜像服务  // 用自己的账号登录进去
    • sudo mkdir -p /etc/docker
      
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
        "registry-mirrors": ["https://f115qraw.mirror.aliyuncs.com"]
      }
      EOF
      
      
      # 后面我自己还加了其它的镜像:
      {
        "registry-mirrors": [
          "https://f115qraw.mirror.aliyuncs.com",
          "https://docker.m.daocloud.io",
          "https://docker.1panel.live",
          "https://docker.mirrors.ustc.edu.cn",
          "https://hub-mirror.c.163.com"
        ]
      }
    • sudo systemctl daemon-reload 、 sudo systemctl restart docker
  • 当前用户也可以使用docker: sudo usermod -aG docker $USER  // 然后 newgrp docker 或者 重启终端 或者系统
  • 开机自启:sudo systemctl enable --now docker

  

常用命令,使用场景示例

  • 查看版本: docker version
  • 查看当前的镜像:docker images 或者 docker  image ls
  • 删除镜像:docker rmi <镜像ID>  // 如果提示无法删除,一般是因为存在容器,先删除依赖该镜像的容器,再删除镜像。
  • 一个基于 ubuntu 18.04 镜像的容器全过程 :
    • 下载镜像:docker pull ubuntu:18.04
    • 查看所有镜像:docker images
    • 创建并启动一个全新的容器: docker run -dit --name hisi -u 1000:1000 -v /home/fxw:/home/fxw ubuntu:18.04  // 这里的 1000 用 id 可以看 表示是 fxw 用户
      • 进入容器:docker exec -it hisi bash  // 此时默认就是 1000 登录,已经可以工作了,但是无法识别1000对应的用户名,所以需要这样:
        • exit
        • docker exec -it -u root hisi bash // root 用户进入
        • groupadd -g 1000 fxw
        • useradd -u 1000 -g 1000 -m -s /bin/bash fxw
          • -u 1000  指定用户 UID=1000
          • -g 1000 把这个用户加入上面刚创建的 fxw 组
          • -m 自动创建用户家目录 /home/fxw 
          • -s /bin/bash 指定登录 Shell 为 bash
        • usermod -aG sudo fxw
        • passwd fxw // 输入密码
        • newgrp sudo
        • apt update && apt install -y sudo
        • exit
        • docker exec -it hisi bash 重进之后:newgrp sudo
      • 新的建议:docker run -dit --name fxw_hisi -v /home/fxw/work:/home/fxw/work:rslave ubuntu:18.04 // :rslave 主机挂载到work 可以识别到
        • docker exec -it -u root fxw_hisi bash
        • groupadd -g 1000 fxw
        • usermod -aG sudo fxw
        • passwd fxw // 输入密码
        • useradd -u 1000 -g 1000 -m -s /bin/bash fxw
          • -m 自动创建用户家目录的逻辑:如果 /home/fxw 不存在,就创建并复制 /etc/skel但目录已经存在,所以不会复制模板文件,也不会自动改目录归属,最终文件夹还是 root
          • 如果 /home/fxw 已存在:cp -r /etc/skel/. /home/fxw/
          • 如果 /home/fxw 已存在:chown -R 1000:1000 /home/fxw
        • apt update && apt install -y sudo iproute2 iputils-ping vim curl wget
        • echo "fxw ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers  // sudo 免密 这样不需要  重进之后:newgrp sudo
        • exit
        • 重进 docker exec -it -u 1000:1000 fxw_hisi bash  // 不加 -u 进入 root 这是正确的设计
      • 创建的时候没有使用 -u 那后面登录的时候就: docker exec -it -u 1000:1000 hi_ss927 bash
      • 退出容器:exit
      • 停止容器:docker stop hisi
      • 运行容器:docker start hisi
      • 查看所有容器:docker ps -a
      • 删除容器:docker rm -f hisi
      • 删除镜像:docker rmi <镜像ID>  
      • 改容器名:docker rename hisi hisi2
    • 怎么修改 -v 挂载参数:
      • exit
      • docker stop fxw_hisi
      • 导出为镜像:docker commit fxw_hisi fxw_hisi_backup
        •  docker images 的时候可以看到:有个 fxw_hisi_backup:latest
        • 如果给其它机器用:
          •  导出镜像为压缩包:docker save fxw_hisi_backup -o fxw_hisi_backup.tar
          • 其它机器导入:docker load -i fxw_hisi_backup.tar
      • 重新打包:docker run -dit --name fxw_hisi2 -v /home/fxw/work:/home/fxw/work:rslave fxw_hisi_backup
      • 用打包好的镜像,重新创建 : sudo docker run -dit --name aaa  -v /home/fxw:/home/fxw hisi_img

docker 命令:

  • 查看你容器信息:docker inspect 1-hi_ss927  // 比如看挂载目录 关注 Mounts 就好了
  • docker pull docker.io/library/nginx:latest
    • docker.io 是docker仓库的注册表地址,docker.io 表示这是docker hub的官方仓库,如果是官方仓库 可以省略不写
    • library 是命名空间(namespace/命名空间/作者名),因为docker hub是公共空间。每个人都可以上传自己的镜像,所以上传镜像的时候要在镜像前面加上作者的名字,也就是命名空间,library 是docker官方仓库的官方命名空间,这个空间下的所有镜像都是官方管理的,如果一个镜像属于官方的命名空间也可以省略
    • :latest 是镜像的版本号,比如 :1.28.0, 也可以省略不写,默认就是 latest 最新版本
    •  --platfoem=xxx : 指定某个CPU架构如 linux/arm64 ,但默认会根据你的设备自动选择最合适的, 但镜像不一定有你的这个cpu的架构
  • docker run nginx 使用镜像创建一个容器,如果发现本地不存在镜像,会自动拉取,并运行 
    • --name xxx 指定名字, 名字必须唯一和id 等价
    • -v /home/fxw/sdk:/home/fxw/sdk:挂载目录,双向同步
    • -d 后台运行
    • -p 80:80(宿主机:容器) 端口映射,每个容器都运行在独立的环境里面,网络也是,所以容器里的端口要映射到宿主机上查看效果
    • 绑定挂载:-v /website/html:/usr/share/nginx/html (宿主机目录:容器内目录) 这样删除容器了但是绑定的宿主机的目录里的数据还在,数据持久化, 宿主机的目录会覆盖容器内目录
    • 创建docker的挂载卷(存储空间) 挂载:
      • docker volume create nginx_html
      • 这样 -v nginx_html//usr/share/nginx/html 使用挂载卷挂载
      • 挂载卷在宿主机的真实目录是:docker volume inspect nginx_html
      • 查看所有创建过的卷:docker volume list
      • 删除挂载卷:docker rm nginx_html
    • -e AAA=aa 传递环境变量
    • -it : 直接进入到容器, 交互式终端
    • --restart always: 容器停止了,立即重启
    • --network network1 // 指定加入子网1
    • --network host // 使用宿主机网络,不需要端口映射
  • 启停容器:docker stop <容器id>  / docker start a9953f743fd 这样会保留 run 的时候指定的参数的,不需要重新天run 参数
  • 如果run 的时候加的参数忘记了,这个时候可以 sudo docker inspect <id> ,这样得到很多信息,然后可以把信息给ai
  • docker create 和 run 参数一样,只是它只创建容器 不运行, 要运行的话 要使用 docket start 
  • 查看容器日志:docker logs <id> -f
  • 改容器名:docker rename hi_ss927 hi_ss928
  • 在容器内部执行命令:docker exec <id> ps -ef // 在容器里支持 ps -ef
    • docker exec <id> /bin/sh  //这样就相当于进入了容器内部 

 

  • Dockerfile 描述怎么制作镜像
    •   
      FROM python:3.13-slim  // 第1行,选择基础镜像
      WORKDIR /app   // 类似cd, 切换到镜像内的一个目录,作为工作目录, 后面的目录都是基于这个执行的
      COPY . . //把当前目录的文件 拷贝到 工作目录 也就是 /app
      RUN pip install -r req.txt // 在镜像里面执行 pip install -r req.txt 
      EXPOSE 8000 // 声明镜像提供服务的端口是什么,这是作为一个提示,实际还是运行时以 -p  为准
      
      // 一个 dockerfile 只能有一个 CMD , 或者写成 ENTRYPOINT 它比CMD优先级更高,不容易被覆盖
      CMD ["python3", "main.py"] // CMD 是容易运行时的默认启动命令,容器启动的时候,容器内部会自动执行 "python3", "main.py" 这个命令
          
    •   构建镜像: docker build -t myDcoker:1.0 .
      • -t 取名
    • 镜像推送到 docker hub:
      • 先注册账号,用githup 注册就可以了,然后取一个用户名fxw,也就是自己的命名空间
      • docker login  -> 打开出现的网站然后填写验证码
      • docker build -t fxw/myDcoker:1.0 .
      • docker push fxw/myDcoker:1.0 
    • 把容器打包,这样可以随意复制:
      •  容器叫 aa, docker commit aa my-aa-image -> docker save -o my-aa.tar my-aa-image 复制 my-aa.tar  就可以了,别人可以导入:docker load -i my-aa.tar  -> docker run -d --name aa my-aa-image
    • # 容器内执行,列出手动装过的包 apt list --installed 2>/dev/null | grep -v "automatic"

 

  • docker 网络
    • 查看所有网络模式:docker network list
    • 创建子网:
      • docker network create -d macvlan --subnet=192.168.101.0/24 --gateway=192.168.101.1 -o parent=ens33 my_macvlan_net1
      • 加入:docker network connect --ip 192.168.101.100 my_macvlan_net1 1-hi_ss927 // 这样就有 101 的网段了,但是用不了
    • 删除:
      • docker network disconnect -f mynet1 1-hi_ss92
      • docker network rm mynet1

 

  • docker compse 使用 yml 管理多个容器,容器自动在一个子网里面
  • docker compose up -d 运行 docker-compose.yml 文件 ,如果文件名是其它的就 -f  ./aa.yaml 也可以
  • docker compose down  停止并删除容器 docker compose stop 就只停止  start 就是开启

 

posted @ 2026-04-16 14:43  封兴旺  阅读(45)  评论(0)    收藏  举报

联系方式: 18274305123(微信同号)