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
docker stats
docker stats --no-stream构建镜像(image)
根目录创建 Dockfile
构建 docker build -t <name>[:tag] .
name 允许字符 a-zA-Z/0-9 如 docs 、mysite/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
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 镜像
docker run -it ubuntu /bin/bash
sudo apt update && sudo apt install curl
docker commit -p cf7f49f3c4f6 os启动实例使用
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 实例
docker buildx create --name mybuilder --driver docker-container
docker buildx use mybuilderDockerfile
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
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)
从镜像创建一个容器运行
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 得到 a34c82a27ab1 , docker 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)
列出全部自动重启的容器
docker container ls -q | \
xargs docker container inspect --format \
'{{ .Name }}: {{.HostConfig.RestartPolicy.Name}}'停止容器 docker stop docs
删除容器 docker rm container --volumes d443b626bba1
查看运行中容器启动完整命令和参数
apt install python3-pip
pip install runlike
runlike -p <container name or ID>注:最后一行/一列输出为 Dockerfile 的 CMD,可忽略。
private registry
- 生成自签名证书
- 指定加载证书参数并重启 registry 服务
- 将自签名中的域名配置硬编码 hosts
比如 registry.mySite.com
docker tag myImg:1.2.3 registry.mySite.com/myImg:1.2.3
docker push registry.mySite.com/myImg:1.2.3https://docs.docker.com/registry/deploying/#get-a-certificate
常见镜像使用
PostgreSQL 数据库
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 \
postgresRedis 数据库
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 账号。
其他
docker system df Show docker disk usage
docker system prune Remove unused data
docker system info Display system-wide information