docker notes
文章目录
教程
包括初级、中级、高级教程: 🏗️ Getting Started with Docker | dockerlabs
- linux 内核能力: Capabilities | dockerlabs
docker compose 功能速查
python 调用 docker
docker 命令速查手册 cheat sheet
container
快捷创建 container
- docker run
创建后台 container
- docker run -d
后台运行,detach container
- Ctr + P Ctrl + Q
前台运行 container
- docker attach
执行命令,开启的 container
- docker exec <container> <your-command>
运行状态查询 container
- docker ps -a
列出 container
- docker ps
- docker container ls
重命名 container
- docker rename
删除 container
- docker rm -f <container>
删除所有终止的容器
- docker container prune
我的命令
1docker ps -a -f status=exited --format "{{.Names}}"|xargs docker container rm
输入 输出 logs
- docker logs
检查信息
- docker inspect
端口
制作端口映射
docker run
- -p
- -P
查看端口映射
- docker port <container>
启动,停止,暂停
- docker start
- docker stop
- docker pause
导入 导出,持久化
- 以镜像的形式
导出
- docker export <container>
导入
- docker import
镜像 image
拉取镜像
- docker pull <image-name>
镜像列表
- docker images
- docker image ls
删除镜像
- docker rmi
创建镜像
更新法
- docker commit
构建法
- docker build
命令镜像
- docker tag
网络
- docker network
创建
- docker network create -d bridge <network-name>
已有网络列表
- docker network ls
指定 dns
- docker run –dns=8.8.8.8
指定 hostname
- docker run -h <hostname>
- docker run –hostname=<hostname>
指定网络
- docker run –network <network-name>
docker hub 仓库
登录
- docker login
登出
- docker logout
拉取
- docker pull
上传
- docker push
attach Vs detach
detach
创建时
1docker run -i -t -d ubuntu /bin/bash在启动的命令行中
使用快捷键
- Ctr + p Ctrl + q
docker run -d
- 作用:后台运行 container
attach
docker attach 命令
1docker attach <your-container>
docker exec
作用
- 使用已经启动的 container
- 执行命令
container 导入 Vs 导出
作用
- 把容器快照以镜像的形式保存
导出
docker export
1docker export <container> > ubuntu.tar
导入
docker import
参数解说
1docker import [options] [<file> or <http>] [- <respository[:tag]>]输入内容
- 文件
- 或 http
设置导入后的名称
- '-' 符号不可缺少
image 导出导出
docker save Vs docker load
docker run
选项 options
-i
- interactive
-t
- terminal
-d
- detach
–rm
- 完成后自动删除,生成的 container
-P
- container “所有” 内部网络端口,“随机” 映射到 host
-p <host-port>: <internal-port>
- https://docs.docker.com/config/containers/container-networking/
手动映射端口
1 2docker run -d -p 8080:80 training/webapp python app.py docker run -d -p 192.168.1.127:8080:80 training/webapp python app.py- ip 地址可以省略,默认是 0.0.0.0
–name
- 指定创建的 container 的名字
-v <host-path>:<container-path>
- –volume
1docker run -v /home/my_host_data:/data/container_path ubuntu echo hello匿名卷
- 不指定主机目录
- docker run -v <container-path>
作用
- 防止容器停止时,数据丢失
–entrypoint
参考:
- 用来覆盖 dockerfile 中的 ENTRYPOINT 设定
eg:
1 2 3 4 5docker run -it --entrypoint /bin/bash example/redis -c ls -l docker run -it --entrypoint /usr/bin/redis-cli example/redis --help # reset docker run -it --entrypoint="" mysql bash
docker port
- https://docs.docker.com/engine/reference/commandline/port/
查看所有端口 映射情况
1docker port <containter>查看特定端口
1 2 3 4 5docker port my-ubuntu 7890 docker port my-ubuntu 7890/tcp docker port my-ubuntu 7890/udp
镜像 images
名称
组成部份
Repository 仓库源
- 格式,可以包含‘/’
eg:
- ubuntu
- trainning/webapp
- Tag 标签
例子
- trainning/webapp:latest
拉取
docker pull
1docker pull ubuntu:18.04
查找
网站:docker hub
命令
docker search
1 2 3docker search <keyword> docker search ubuntu
删除
- docker rmi
创建
两种方式
更新镜像
- 运行镜像,变成 container,执行一些命令,完成修改
- 再保存成镜像
- 命令:docker commit
构建镜像
- 使用 dockerfile 创建,从零开始创建
- 命令:docker build
更新法 docker commit
| |
-m
- message
-a
- 制定作者
构建法 dockerfile
dockerfile 编写
例子
1 2 3 4 5 6 7 8 9 10FROM centos:6.7 MAINTAINER Fisher "fisher@sudops.com" RUN /bin/echo 'root:123456' |chpasswd RUN useradd runoob RUN /bin/echo 'runoob:123456' |chpasswd RUN /bin/echo -e "LANG="en_US.UTF-8"" >/etc/default/local EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd -D
构建 docker build
1docker build -t <tag-name> <context-path>-t
- 指定名称标签
-f
- 指定 Dockerfile 路径
命令和标签
docker tag
1docker tag 860c279d2fec runoob/centos:dev
Exec 模式 Vs Shell 模式
参考
出现位置
- dockerfile
Exec
使用 CMD ["command", "options"]
- eg: CMD ["top"]
Shell
使用 CMD command options
- eg: CMD top
Exec 模式
| |
作用
- 把 CMD 指定的命令,设置 PID 为 1
效果
- 因为是一号进程,其它环境还不存在
- 因此,获取不到环境变量,如:$HOME
注意:
- 这里使用的时双引号"", eg: ["top"]
Shell 模式
| |
作用
- 把 CMD 指定的命令,传递给 shell -c " your-command options"
效果
- 一号进程不是指定命令
- 而是,bash 命令
- 这样,执行 CMD 指定命令时,环境已经构建
- 因此,可以获取 环境变量,如:$HOME
CMD Vs ENTRYPOINT
CMD
作用
- 指定命令,或给 ENTRYPOINT 补充提供命令的默认可选参数
ENTRYPOINT
使用模式
- Exec 模式
- Shell 模式
什么时可选参数
1 2 3FROM ubuntu ENTRYPOINT ["top", "-b"]运行命令
1 2 3 4 5# 构建 docker build -t my-test . # 运行 docker run my-test -c解说
注意这里的 选项 "-c"
- 它会被添加到 ENTRYPOINT 指定的命令
- 命令变成:["top", "-b", "-c"]
- 然后被执行
如何设置默认参数
1 2 3FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"]解说
如果在 docker run 时, 没有指定可选参数
- ENTRYPOINT 自动变成 ["top", "-b", "-c"]
相当于 python: dict.get("-c", "-c")
- 没设定,给出默认值
如果在 docker run 时,指定了可选参数
- CMD ["-c"] 就被丢弃,无用了
- 而是,使用用户给出的参数
eg:
用户给定命令
1docker run my-test -n 1解说
- 这里 可选参数是 ["-n", "1"]
- 这样 CMD 指定的 ["-c"] 就无效了
- 最终变成,ENTRYPOINT ["top", "-b", "-n", "1"]
可选参数 Vs 必需参数
ENTRYPOINT 指定必需参数
- eg: ENTRYPOINT ["top"]
CMD 指定可选参数
- eg: CMD ["-c"]
网络,容器互联
- docker network
和 host (宿主机) 共享 ip :
--network=hostdocker run --network=host
创建网络
| |
网络列表
- docker network ls
指定容器网络
- docker run –netowrk <network-name>
配置容器的 dns
配置使用 容器
配置文件 /etc/docker/daemon.json
1 2 3 4 5 6{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }- 重启 docker 生效
配置指定容器的 dns
docker run
-h hostname
- –hostname=given-hostname
- 指定容器的 hostname
实现
- 修改/etc/hostname 和 /etc/hosts
–dns=8.8.8.8
- dns 服务器
实现
- 修改 /etc/resolv.conf 实现
–dns-search=test.com
对于一个 hostname
- 不仅搜索 hostname
- 还要搜索 hostname.test.com
仓库
- docker hub
登录
- docker login
登出
- docker logout
搜索镜像
- docker search <pattern>
拉取镜像
- docker pull <image-name>
推送镜像,上传
- docker push <image-name>
相关命令 docker tag
| |
Dockerfile
| |
注意
- RUN 命令,不能修改 /etc/hostname
指令
FROM
- 指定上一层镜像
MAINTAINER
- 作者
RUN
- 再镜像内执行命令,如:安装软件,配置参数
- 作用时间:docker build 下
EXPOSE
- 暴露端口
CMD
- 默认启动执行的命令
- 作用时间:docker run 下
- 注意:docker run 有指定命令,会覆盖 CMD 指定的命令
- 还可以指定 可选参数,与 ENTRYPOINT 连用
ENTRYPOINT
类似 CMD
- 但是,使用指定命令的 1)入口命令 2) 必须参数
COPY
- 复制指令
[–chown=<user>:<group>]
- 可选参数,改变文件的拥有者和组
- 支持通配符
ADD
类似 COPY
- 但是,对于 tar(gzip, bzip2, xz 压缩),可以自动解压缩到目标文件夹
- 注意:想要保持 tar 文件原样不被解压复制,是不可以的
ENV
- 设置环境变量
格式
1 2ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...
ARG
类似 ENV
- 但是,作用域只在 Dockerfile
- 使用 docker build –build-arg <key>=<value> 覆盖
格式
1 2ARG key # 没有初始化 ARG <key>=<value> # 默认值形式
VOLUME
- 创建共享卷
格式
1 2VOLUME /demo01 VOLUME ["/demo02", "/demo03"]
WORKDIR
- 为 RUN,CMD 指定工作目录
- 类似 linux, cd 命令
USER <user>[:<group>]
- 指定 RUN, CMD, ENTRYPOINT 操作的 所属用户
LABLE
- 为 image 添加 metadata
more than one from directive
docker 的 卷 volume
参考
作用
挂载主机目录到容器
1docker run -v /home/host_path:/container_path ubuntu echo hello共享卷
- 在容器之间共享数据
共享卷
创建方法
docker run
1docker run -v /container_path ubuntu bash- 注意: 只给出了 容器中的目录
Dockerfile VOLUME 指令
1 2 3FROM ubuntu VOLUME /demo01 VOLUME ["/demo02", "/demo03"]独立卷
1docker volume create <volume-name>
挂载到别的 container
1docker run --volume-from <other-container> ubuntu bash- 自动挂载给定 container 上的所有共享卷
docker ps
- docker ps -a
- docker ps
- docker ps -a -f
格式化输出
参考
https://docs.docker.com/engine/reference/commandline/ps/#formatting
1docker ps --format '{{.State}},{{.Name}}'
参数
- –filter
过滤输出
参考
https://docs.docker.com/engine/reference/commandline/ps/#filtering
1docker ps -f name=hello -f status=exited
参数
- -f, –filter
删除所有终止的容器
| |
docker registry 源
教程
步骤
打上标签 docker tag
1docker tag [my_image:latest] [my_registry:port/my_image:latest]- 给我们的镜像打上标签: regestry_site/image_name
推送 docker push
1docker push [my_registry:port/my_image:latest]
获取 registry 上的镜像列表
镜像列表
curl -X GET http://localhost:5000/v2/_catalog
获取给定 docker image TAGs 列表
curl -X GET http://localhost:5000/v2/gpu_test/tags/list
加速镜像
制作网站
修改配置 /etc/docker/daemon.json
1 2 3 4 5 6 7 8sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://o8npla25.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
设置时区 timezone
| |
如何覆盖 ENTRYPOINT 命令
在 Dockerfile 中
1 2 3FROM prev_image ENTRYPOINT []在 docker run 时
1docker run -it --entrypoint /bin/bash GivenImage
docker build 代理问题
| |
docker run 代理问题
| |
复制文件到外部
docker container cp image-name:/path/in/container /path/in/local
1 2docker container create --name extract alexellis2/href-counter:build docker container cp extract:/go/src/github.com/alexellis/href-counter/app ./app
docker pull 使用代理问题
- 官方参考
- 步骤
配置方法—-一般安装(root 安装)
创建配置文件
1 2sudo mkdir -p /etc/systemd/system/docker.service.d sudo emacs /etc/systemd/system/docker.service.d/http-proxy.conf修改内容
1 2 3 4[Service] Environment="HTTP_PROXY=http://192.168.102.1:7890" Environment="HTTPS_PROXY=http://192.168.102.1:7890" Environment="NO_PROXY=localhost,127.0.0.1"
绕开 docker pull 命令下载镜像
使用 moby download-frozen-image-v2.sh
- 使用脚本https 下载docker镜像方法
脚本下载路径
使用步骤:
| |
国内镜像加速
1 2 3 4 5 6 7 8sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart dockerfish shell
1 2 3 4 5 6 7sudo mkdir -p /etc/docker echo ' { "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] }' | sudo tee /etc/docker/daemon.json sudo systemctl daemon-reload sudo systemctl restart docker
- 参考
解决 TLS index.docker.com 错误
修改 /etc/hosts
添加 index.docker.com
154.84.81.66 index.docker.io
私有镜像仓库搭建 Registry 使用
registry:2 镜像 用法
Volume
创建
1docker volume create共享 volume
使用 driver
- vieux/sshfs
- nfs
- Amazon S3
- …
用于 docker host
1docker run --rm -v sshfs-volume:/tmp/share nginxdocker
swarm1 2 3docker service create --replicas=3 --publish 8080:80 \ --name nginx \ --mount type=volume,volume-driver=vieux/sshfs,src=ssh-volume,target=/tmp/share,volume-opt=sshcmd=sawyer@192.168.99.1:/home/sawyer/temp/ssh-volume,volume-opt=password=<PASSWORD> nginx注意
- driver 非 local 时,需要特别指定它
- volume-driver=vieux/sshfs
sshcmd 指定
- volume-opt=sshcmd=<User>@<Host>:/Path/To/Your/Folder
- 这个路径一定要存在,否则引发错误
docker Swarm 注意
创建 Service 时
- 自带 docker service 错误提示功能太弱
- 最好使用 docker run 自行测试
信号接收问题
- 参考:Why Your Dockerized Application Isn’t Receiving Signals
python images
1CMD exec /program/venv/bin/python -m flask run -p 8000 -h 0.0.0.0
压缩 镜像
- 分布编译
pip
1pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r /tmp/requirements.txt --no-cache && /make_venv/venv/bin/cde data download--no-cache选项
apt
1&& apt-get install -y openjdk-11-jre-headless --no-install-recommends --no-install-suggests
安装
without sudo 配置
命令
1 2 3 4sudo groupadd docker sudo gpasswd -a $USER docker sudo systemctl restart docker.service sudo chmod a+rw /var/run/docker.sock
gpu 支持
参考:
- GitHub - NVIDIA/nvidia-container-toolkit: Build and run containers leveraging…
- How to Use GPUs from a Docker Container | Saturn Cloud Blog
nvidia 制作好的 gpu docker images:
安装和配置
安装 nvidia-container-toolkit 包
- 注意:先要安装 nvidia driver, 即显卡驱动
设置 docker 运行时
- docker, podman 或者 containerd 等
即,把
/etc/docker/daemon.json中添加下述内容:1 2 3 4 5 6 7 8 9{ "runtimes": { "nvidia": { "args": [], "path": "nvidia-container-runtime" } }, "default-runtime": "nvidia" }default-runtime字段设置可选
运行 docker gpu 容器
注意:如果没有设置 default-runtime, 需要添加参数 --runtime=nvidia
测试可以使用 GPU
1 2docker run --gpus all nvidia/cuda:11.0-base nvidia-smi docker run --runtime=nvidia --gpus all nvidia/cuda:11.0-base nvidia-smi使用所有 GPU
1 2docker run --gpus all --rm -it tensorflow/tensorflow:latest-gpu docker run --runtime=nvidia --gpus all --rm -it tensorflow/tensorflow:latest-gpu使用指定 device gpu
1 2docker run -it --rm --gpus '"device=0,2"' tensorflow/tensorflow:latest-gpu nvidia-smi docker run --runtime=nvidia -it --rm --gpus '"device=0,2"' tensorflow/tensorflow:latest-gpu nvidia-smi
docker gpu + compose
| |
docker build 设置缓存(pip, apt 等)
参考:
- python - Using a pip cache directory in docker builds - Stack Overflow
- Dockerfile reference | Docker Docs
注意:
- 不可忽略文件开头的
# syntax=docker/dockerfile:1声明信息
例子:
| |
paddle + docker
参考:
paddlepadle + cuda + docker 镜像:
查看镜像中的 CUDA 版本方法:
- 切换到
layerTab 页 - 搜索环境变量
CUDA_VERSION
- 切换到
buildkit
如何显示中间步骤输出
参考:
方法:
- 使用
--progress=plain
| |
history
作用:
- build 过程的记录,可以查看镜像的 Dockerfile 内容和每一层的 size
| |
docker compose
辨析 start Vs up 和 stop Vs down
- start/stop 操作的是服务 service
- up/down 创建销毁的是容器 container
service 依赖关系 depends_on
| |
docker gpu
| |
网络
container 之间连接
使用 service 名称连接
- 注意:不是 container 名或者镜像名
默认的网络
docker compose 会自动创建一个网络:
- 名称:default
- driver 类型:bridge
手动创建网络
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16services: db: ... networks: - my_net backend: ... environment: - DB_URL: http://db:5432/path/to/db networks: - my_net networks: my_net: - driver: bridge
entrypoint 复写 override
docker run –entrypoint
参考:
使用模式:
| |
使用两个命令:
docker run --entrypoint '/usr/bin/bash' --rm -it pyencrypter:centos7.9 -c 'ls / && /root/miniconda3/envs/env/bin/python -m http.server'
使用 docker compose 复写
| |
- 测试通过
docker 内部程序接收 SIGTERM 信号
信号传递
docker stop,docker compose stop,docker compose restart等命令,会传递SIGTERM信号给内部的pid=1的进程- 先传递 SIGTER, 再传递 SIGKILL
参考:docker container stop | Docker Docs
- 传递信号给
main process
- 传递信号给
Dockerfile 编写注意事项
- 需要使用
CMD ["/usr/bin/python", "app.py"]类似的形式 无效方式 :
CMD ["sh", "start.sh"]- 即使在 start.sh 启动了 app.py 服务,app.py 也不能接收到 SIGTERM 信号
- 需要使用
国内镜像
https://docker.1ms.run
国内有gitee 为什么没有 dockerhub
可用的国内 DockerHub 镜像加速源
DaoCloud 镜像加速器
地址:https://docker.m.daocloud.io。
南京大学镜像站
地址:https://ghcr.nju.edu.cn。
毫秒镜像加速
地址:https://docker.1ms.run。
AtomHub 可信镜像仓库平台
地址:https://atomhub.openatom.cn。
其他加速源
https://docker.1panel.dev
https://dockerpull.org
https://hub.geekery.cn
https://docker.linkedbus.com
配置 Docker 使用加速源
要使用上述加速源,可以通过以下步骤配置 Docker:
创建或修改 /etc/docker/daemon.json 文件:
JSON复制
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://ghcr.nju.edu.cn"
]
}
重启 Docker 服务:
bash复制
sudo systemctl daemon-reload
sudo systemctl restart docker
注意事项
部分加速源可能仅支持基础镜像或白名单镜像,如果某个加速地址无法拉取到所需的镜像,可以尝试切换到其他地址。
由于网络环境的变化,某些加速源可能会失效,建议定期检查可用性。
通过以上方法,国内用户可以更高效地使用 DockerHub 镜像资源。
docker container unhealthy 重启
unhealthy 检查
| |
unhealthy 重启
docker 和 docker compose 不会实现 unhealthy 的 container 自动重启
通过 docker swarm 实现 unhealthy 自动重启
通过 unhealty + 脚本检查 unhealthy container 定期检测重启
步骤:
- docker inspect 获取 container 是否 unhealthy 状态
- docker restart container-name 实现重启
弊端:
- 需要手动输入 container-name
| |
unhealthy + docker label + autoheal 实现自动重启
参考:
- GitHub - willfarrell/docker-autoheal: Monitor and restart unhealthy docker co…
- Configuring HealthCheck in docker-compose
| |
Dockerfile RUN –mount
参考:
例子:
RUN --mount=type=cache,target=/root/.npm npm installRUN --mount=type=bind,target=./build_data/.npm npm install
使用 --mount=type=cache,target=/your/cache/dir 可以在多次 docker build 之间共享缓存数据
文章作者
上次更新 2025-09-24 (360d44c)