Docker Command
实际使用中,docker的命令还是很多的,这里单列出来方便查询。
- 安装路径:/usr/local/bin/docker (Mac)
常用命令
# 停止所有运行的containers
docker stop $(docker ps -q)
# 删除所有容器
docker rm $(docker ps -a -q)
# 显示所有exited的容器ID
docker ps -a -q -f status=exited
# 显示标准输出日志
docker logs --follow <container>
# 复制文件
docker cp foo.txt <container>:/
docker cp <container>:/foo.txt /
# 查看镜像生成命令
docker history <image name>
docker run
docker run 选项详解
# --rm 容器关闭时自动删除容器, 通常用于运行一次性命令
# -d, —detach 在后台运行(detached模式)并打印容器ID, 如果不指定,容器运行日志会打印到终端
# -p <hostPort>:<containerPort> 建立宿主机到容器的端口映射
# -v <hostDirectory/volume>:<containerDirectory> 建立宿主机到容器的文件目录映射, 如果不指定,则不能持久化保存变更
上面的docker volume如果不存在会自动创建, 也可以手动创建: docker volume create my-container-data
# 指定网络
docker run --net mynet123 --ip 172.18.0.22 -it ubuntu bash
从Host传递环境变量到Container
方式1: 使用-e 参数
export LOCUST_MODE="master";printenv |grep LOADS_MODE; docker run -e LOCUST_MODE ...
方式2: 使用 –env-file参数
# 指定环境变量文件
docker run --env-file=runtime_env
排查/调试
# 查看容器日志, 包含已Exited
docker logs -f <container id/name>
# 或者直接登录容器
docker run xxx -ti bash
# inspect 查看状态/LogPath
docker inspect xxx
docker network
常用的网络模拟是:
- host:使用宿主机的ip和端口
- bridge:默认的模式,为每个容器分配ip,通过docker0网桥和iptables nat与宿主机通讯
docker port <CONTAINER>
docker network ls
# 创建新的bridge 网络
docker network create net-demo
docker network create --subnet=172.18.0.0/16 mynet123
docker network rm f01 # 删除指定network
docker network prune # 删除所有未使用
docker network inspect net-demo
brctl show
docker network connect net-demo nginx
说明: 避免和docker/docker-compose创建的172.17、172.18等网段冲突。
change docker default 172.17, 172.18 subnet:
sudo vi /etc/docker/daemon.json
{
"bip": "10.200.0.1/24",
"default-address-pools":
[
{"base":"10.201.0.0/16","size":24},
{"base":"10.202.0.0/16","size":24}
]
}
docker volume/数据卷
- docker volume ls
docker system
- docker system prune : 删除不用的数据
- -a, –all : 删除所有不用镜像而不仅仅悬挂的
- -f, –force
- –volumes : 不用的卷也删除
- –filter “key=value”
- docker system info : 系统信息
- docker system df : 磁盘占用
docker system prune -a
# This will remove:
# - all stopped containers
# - all networks not used by at least one container
# - all images without at least one container associated to them
# - all build cache
制作镜像
注:docker构建的镜像是平台相关的,即Mac(arm64)构建的镜像在Linux(amd64)平台不能运行,需要借助于buildx构建跨平台镜像。 参考文章:构建多平台Docker镜像
Dockerfile
例子
# 基础镜像
FROM python:3
# 对外暴露端口
EXPOSE 5000
# 执行命令
CMD: ["python",".app.py"]
# 其他
# 运行命令
RUN apt -yqq update
# 把应用添加到容器卷
ADD flask-app /opt/flask-app
# 设置工作目录
WORKDIR /opt/flask-app
docker build
- -t <版本标签>
- PATH/URL/. : 通常使用的最后的.代表当前路径
# 构建及运行示例
docker build -t my-app .
docker run -it --rm -p 5000:5000 --name my-running-app my-app
# 强制构建/不使用缓存
docker build --no-cache -t my-app -f Dockerfile .
# 如果遇到域名不能解析问题 “Temporary failure resolving 'deb.debian.org'”
# 解决: 增加 --network host
docker build --network host -t my-app -f Dockerfile .
# 重用已有镜像缓存
docker build --cache-from <image name>
# 构建跨平台
docker buildx version
docker buildx ls
# 从M1 Mac创建
docker buildx create --use --name mybuilder
docker buildx build --platform=linux/amd64 -t myapp .
RUN/ENTRYPOINT/CMD的区别
- RUN: 构建新镜像层
- ENTRYPOINT: 总是需要执行命令时使用,使容器可执行
- CMD: 需要提供默认命令,参数可以被覆盖
两种形式:shell和exec
- shell形式 : 会调用/bin/sh -c 并执行shell处理
- exce形式 [“executable”,“param1”]
- 直接调用executable,例如 /bin/bash写作 ENTRYPOINT ["/bin/bash","-c",“echo Hello, $name”]
- 更多用于 CMD和 ENTRYPOINT
传递参数
# 通常组合为
ENTRYPOINT ["/bin/bash","-c","param1"]
CMD ["param2","param3"]
调试
# 对于直接EXITED的容器,可修改入口为
ENTRYPOINT ["/bin/bash","-c","sleep 1800"]
# 容器启动后,再登录容器shell查看日志
镜像导出/导入
适用于不同的场景:
- export/import: 通常用于制作基础镜像(从容器生成镜像快照)
- save/load: 跨机器部署
注:不能混用.
export/import
# 查看所有容器
docker ps -a
docker export abcd > my-ap-server.tar
# 导入,import 可以指定新名称
docker import - new-app-server < my-ap-server.tar
save/load
# 查看已有镜像
docker images
# 保存镜像
# 格式:
docker save -o <path for generated tar file> <image name>
# 压缩
docker save <docker image name> | gzip > <docker image name>.tar.gz
# 导入镜像
docker load < my-image.tar.gz
# 注: 对于gzip, bzip2, xz的压缩文件,导入时会自动解压
docker-compose
定义及运行多个容器应用,Python写的一个工具
PS. 原来docker-compose最初也是收购来的
# 停止服务
docker-compose stop
# 停止并删除container及数据卷
docker-compose down -v
# 创建,启动并在后台运行container
docker-compose up -d
# 在启动容器前构建镜像
docker-compose up -d --build
docker-compose.yml
version:
services:
<service_name>:
image:
command:
ports:
volumes:
技巧
- 所有命令的Container ID可以仅使用前2/4位