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位

扩展阅读