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
- 进入容器:docker exec -it hisi bash // 此时默认就是 1000 登录,已经可以工作了,但是无法识别1000对应的用户名,所以需要这样:
- 怎么修改 -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 就是开启
本文来自博客园,作者:封兴旺,转载请注明原文链接:https://www.cnblogs.com/fxw1/p/19877028

浙公网安备 33010602011771号