Skip to content

docker

安装二进制包

Ubuntu 不要安装系统仓库自带旧版本,会有各种问题。参考 docker 官网安装最新 https://docs.docker.com/engine/install/ubuntu/

macOS brew install --cask docker

macOS homebrew 安装可能提示因为安装过 Docker Desktop 残留文件导致失败 Error: It seems there is already a Binary at '/usr/local/bin/docker'. ,删除后重试即可 rm /usr/local/bin/docker

原理和使用场景

  • 镜像(Image) 类似 root 文件系统,分层存储,只读
  • 容器(Container)
  • 仓库(Repository)& tag
  • Docker Registry, https://hub.docker.com/

常用命令行 CLI

在 macOS 上命令行启动 docker 守护进程 killall Docker && open /Applications/Docker.app

list all Docker containers size docker ps --size

show CPU/MEM/NET usage

shell
docker stats

docker stats --no-stream

构建镜像(image)

根目录创建 Dockfile

构建 docker build -t <name>[:tag] .

name 允许字符 a-zA-Z/0-9docsmysite/docs 等; tag 可选,通常用版本号区别如 23.3.3

ex docker build -t docs:23.3.3 .

Build Go app image

build with binary with env CGO_ENABLED=0

TBD.

使用 NGINX 托管 node 生成静态站示例 Dockfile

docker
FROM node:alpine
WORKDIR /data/docs.mysite.com
COPY . /data/docs.mysite.com
RUN npm install && npm run docs:build

FROM flashspys/nginx-static
RUN apk update && apk upgrade
COPY --from=0 /data/docs.mysite.com/.vuepress/dist /static

根目录创建 .dockerignore 可指定忽略文件或文件夹, 如 node 类应用需要添加 node_modules/,否则里面 esbuild 模块在跨平台构建时会导致构建失败。

创建一个带 curl 包的 Ubuntu 镜像

bash
docker run -it ubuntu /bin/bash
sudo apt update && sudo apt install curl

docker commit -p cf7f49f3c4f6 os

启动实例使用

bash
docker container run -d --network host --name curl os tail -f /dev/null

docker exec -it curl /bin/bash

curl <hostLanIp:port>/some-path

注上面 --network host 参数,指示容器实例共享宿主机网络。

构建跨平台镜像

列出所有 builder docker buildx ls

创建 builder 实例

sh
docker buildx create --name mybuilder --driver docker-container
docker buildx use mybuilder

Dockerfile

docker
FROM --platform=$TARGETPLATFORM alpine
RUN uname -a > /os.txt
CMD cat /os.txt

构建 docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t somebody/hello . --push--push 是指 推送到 Docker Hub Register ,可选,默认是 hub.docker.com

查看镜像信息 docker buildx imagetools inspect somebody/hello

Manage image

sh
docker images
docker image ls

docker image rm --force <imgId>
docker image prune -a --force --filter "until=240h"

publish image

推送镜像到 hub.docker.com 公开仓库 docker push <image>[:tag],如 docker push mySite/docs:1.2.3

使用 Github action 推送到 ghcr.io 时,返回错误 GitHub: denied: permission_denied: write_package, 是由于 package settings 中权限设置不对,具体见 https://stackoverflow.com/a/72585915/913751

管理容器(container)

从镜像创建一个容器运行

sh
docker run --name docs -p 8080:80 docs:1.2.3

# -d detach 后台方式运行
docker run -d --name docs -p 8080:80 docs:1.2.3

容器启动后,进入容器执行命令 docker exec -it myCT /bin/bash-i 交互式操作 -t 进入终端

启动容器并进入可交互 shell docker run -it myCT /bin/sh

从容器复制文件到本地文件系统 docker cp <containerId>:<容器上文件路径> 本地文件路径 通过 docker ps 查询 containerId 得到 a34c82a27ab1docker cp a34c82a27ab1:/root/bak.sql ./

设置指定容器名称自动启动 docker run -d --restart unless-stopped redis

-d, --detach Run container in background and print container ID

设置当前已启动的容器全部自动重启 docker update --restart unless-stopped $(docker ps -q)

列出全部自动重启的容器

sh
docker container ls -q | \
    xargs docker container inspect --format \
            '{{ .Name }}: {{.HostConfig.RestartPolicy.Name}}'

停止容器 docker stop docs

删除容器 docker rm container --volumes d443b626bba1

查看运行中容器启动完整命令和参数

sh
apt install python3-pip
pip install runlike
runlike -p <container name or ID>

注:最后一行/一列输出为 Dockerfile 的 CMD,可忽略。

private registry

  • 生成自签名证书
  • 指定加载证书参数并重启 registry 服务
  • 将自签名中的域名配置硬编码 hosts

比如 registry.mySite.com

sh
docker tag myImg:1.2.3 registry.mySite.com/myImg:1.2.3
docker push registry.mySite.com/myImg:1.2.3

https://docs.docker.com/registry/deploying/#get-a-certificate

常见镜像使用

PostgreSQL 数据库

sh
sudo docker run -d \
--restart unless-stopped \
--name pg \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_HOST_AUTH_METHOD=md5 \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v /data/pg:/var/lib/postgresql/data \
-p 5432:5432 \
postgres

Redis 数据库

sh
sudo docker run -d \
--restart unless-stopped \
--name kv \
-v /data/rds:/data \
-p 6379:6379 \
redis redis-server \
--save 60 1 \
--loglevel warning

常见问题

Ubuntu VM 挂载目录容器实例无法写

删除系统自带,手动安装最新版本代替。 具体见 https://docs.docker.com/engine/install/ubuntu/

permission denied while trying to connect to the Docker daemon socket

sudo usermod -aG docker ubuntu

docker group membership error on Windows

解决 net localgroup docker-users "foo@bar.info" /ADD

foo@bar.info 是当前 Windows 登录用户关联 email 账号。

其他

sh
docker system df      Show docker disk usage
docker system prune   Remove unused data
docker system info    Display system-wide information

Released under the CC-BY-NC-4.0