Docker

2022-04-07

Docker 是目前最流行的容器化平台,可以方便地管理容器化应用。

安装

[[Ubuntu]] 可以直接通过 [[apt]] 安装 Docker,这个方式是没有带 [[compose]] 的版本:

Terminal window
# 方式一
sudo apt install docker.io

如果希望安装包含带 compose 命令的版本,可以用以下方式安装:

Terminal window
# 方法二
# 安装必要工具(一般都有安装)
sudo apt install ca-certificates curl -y
# 添加 Docker GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
# 添加 Docker 官方 apt 源
sudo echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable" \
> /etc/apt/sources.list.d/docker.list
# 更新源并安装
sudo apt update
sudo apt install docker-ce -y

无论是哪种方式,等安装完成后把当前用户加入 docker 用户组,就不需要每次都加 [[sudo]] 执行了:

Terminal window
sudo usermod -aG docker $USER

上面命令需要退出当前终端才能生效,可以先用 [[newgrp]] 命令切换到 docker 组:

Terminal window
newgrp docker

使用

容器自启

  • 运行前: docker run —restart=always
  • 运行时:docker update --restart=always <CONTAINER ID>

运行后修改容器配置

先切到 root 账号:

Terminal window
sudo su

查看要修改的容器 ID 后,停止所有容器和 Docker 服务:

Terminal window
# 查看容器 ID
docker ps
# 停止容器和 docker 服务
docker stop $(docker ps -aq)
systemctl stop docker.socket
systemctl stop docker.service

之后再修改对应容器配置: vim /var/lib/docker/containers/container-ID/config.v2.json

"MountPoints":{"/home":{"Source":"/docker","Destination":"/home","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"//docker/","Target":"/home"}}}
  • MountPoints 是挂载配置

导入导出镜像

Terminal window
# 导出镜像到 tar 文件
docker save -o <image_name>.tar <image>
# 导入镜像
docker load -i <image_name>.tar
# 设置名称和版本
docker tag <imported_image_id> python:3.12-slim

同步时间

Terminal window
# 登录容器后
docker exec -it <containerid> /bin/sh
# 在里面执行
ln -sf /usr/share/zoneinfo/Asia/Singapore /etc/localtime

问题

报错 permission denied

[[Ubuntu]] 执行 Docker run 报错:docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

  1. [[gpasswd]] 命令把当前用户加入 docker 组
  2. 退出重新登录即可,如果无效可先重启试试

无法停止或删除

报错:cannot stop container - signaling init process caused “permission denied”

sudo aa-remove-unknown

镜像

参考