docker 使用

  • 其他命令
  • 容器相关命令
  • 镜像相关命令
  • volume相关
  • network相关

其他命令

  1. 启动docker服务:systemctl start docker(老版用service docker start
  2. 重启docker服务:systemctl restart docker(老版用service docker restart
  3. 停止docker服务:systemctl stop docker(老版用service docker stop
  4. 检查docker状态:systemctl status docker(老版用service docker status
  5. 设置docker开机自启:systemctl enable docker
  6. 取消docker开机自启:systemctl disenable docker
  7. 查看docker磁盘使用情况:docker system df [-v]
  8. 清理build缓存:docker builder prune
  9. 查看容器/镜像的详细信息:docker inspect [container_name|image_id]

容器相关命令

  1. 运行容器
sudo docker run --gpus all -it -d -rm \
                -p <host_port:container_port> \
                -v <host_path:container_path> \
                -e <var_name=val_value> \
                --net=host \
                --network <network_name> \
                --ip <custom_ip> \
                --shm-size=10gb \
                --name <container_name> <image_name:image_tag> [/bin/bash]
# --gpus all:允许容器使用所有gpu
# -it:交互模式
# -d:后台运行
# -rm:运行结束删除
# -p:端口映射(有-p就不能有--net=host)
# -v:数据卷映射
# -e:环境变量
# --net=host:容器直接使用宿主机的网络。(与-p、--network等字段是冲突)
# --network:采用哪个docker网络,允许同一个网络间的容器互相通信
# --ip:固定ip(必须跟--network配合使用)
# --shm-size=10gb:共享内存大小设置为10GB。适用于TensorFlow、PyTorch等需要大共享内存的深度学习任务,否则默认/dev/shm只有64MB,可能导致OOM(内存不足)。
# --name:容器名称

要使用--gpus all需要额外安装NVIDIA Container Toolkit

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update
sudo apt install -y nvidia-docker2
  1. 查看容器docker ps
    1. -a:所有容器:docker ps -a
    2. -q:容器id:docker ps -q
    3. -f:过滤条件:docker ps -f “name=
    4. -n:最近创建的n个:docker ps -n 3
  2. 停止容器docker stop [-f] [container_name|container_id]
    1. docker stop $(docker ps -q):停止所有容器
  3. 重启容器docker restart
  4. 删除容器docker rm [-f] [container_name|container_id]
  5. 暂停容器docker pause [container_name|container_id](短暂释放资源时使用)
  6. 取消暂停docker unpause [container_name|container_id]
  7. 查看正在运行的docker的日志(若有)docker logs --tail 10 -f
    1. --tail 10:查看最后10行
    2. -f:实时刷新
  8. 进入容器
    1. docker attach
    2. docker exec -it bash
    3. attach将连接到容器的主进程,可能会影响容器的运行(如使用 Ctrl+C 可能会停止容器)。
    4. exec启动一个新的进程,而不是连接到已有的主进程,不会影响容器的主进程,退出新进程不会停止容器。
    5. 也就是说,假如这个容器有启动命令,一直在前台运行某个服务,attach进去之后,其实没办法操作,只能Ctrl+C停止进程,而容器一般都使用-d -rm 之类的命令启动的,这么做就会使容器直接停止并删除。而使用exec进去之后是新开了一个进程,并不会影响主进程的运行,因此很适合进入有启动命令的容器查看相关信息。(总之推荐用exec!!!)
  9. 容器与宿主机文件传输
    1. 宿主机传输到容器:docker cp :
    2. 容器传输到宿主机:docker cp :
  10. 容器提交到镜像docker commit ,可以有以下参数:
docker commit -a "damonzheng" \
              -m "update base image with new configurations" \
              --change 'CMD ["bash", "start.sh"]' \
              --change "EXPOSE 80" \
              --change "ENV APP_ENV=production" \
              <container_id/container_name> <newimage_name:tag>

# -a, --author:指定作者
# -m, --message:添加注释
# --change:修改Docker配置
    # 修改CMD:--change 'CMD ["bash", "start.sh"]'
    # 修改ENTRYPOINT:--change 'ENTRYPOINT ["python", "app.py"]'
    # 修改环境变量ENV:--change "ENV APP_ENV=production"
    # 修改工作目录WORKDIR:--change "WORKDIR /data/code"
    # 修改暴露端口EXPOSE:--change "EXPOSE 8080"

镜像相关命令

  1. 从Dockerfile构建镜像docker build -t [-f ] .
    1. -t:指定tag,默认为latest
    2. -f:指定Dockerfile文件,没指定默认为当前路径
    3. .:决定了docker引擎在构建镜像时可以使用的文件和目录
  2. 保存镜像到本地文件docker save -o
  3. 加载本地保存的镜像docker load -i
  4. 查看镜像构建过程docker history

volume相关

  1. 创建命名volumedocker volume create
  2. 查看所有volumedocker volume ls
  3. 查看volume详细信息docker volume inspect
  4. 删除volumedocker volume rm (正在使用则无法删除)

volume 和 bind mount

特性 volume bind mount(挂载宿主机目录)
创建方式 docker volume create-v :/ -v :/
数据存储位置 Docker 自动管理,比如 /var/lib/docker/volumes/... 指定的宿主机路径
安全性 更安全,容器不会直接接触宿主机目录结构 容器可能访问敏感宿主机路径
性能 一般比 bind mount 更快(尤其是 Linux) 性能略低,受文件系统影响
便携性 高,可在不同主机间迁移(配合 volume inspect + tar) 低,依赖宿主机目录结构
典型用途 数据持久化、数据库卷、配置存储 本地开发时同步代码、调试数据

network相关

  1. 创建networkdocker network create
  2. 查看所有networkdocker network ls
  3. 查看network详细信息docker network inspect
  4. 将容器连接到networkdocker network connect
  5. 将容器从指定network断开docker network disconnect
  6. 删除networkdocker network rm

使用docker network的好处:

  1. 容器自动内网互通:同一个 network 下的容器,自动能用 容器名当域名互相访问,不用记 IP 地址
  2. 自定义IP段:自定义网络时可以指定 IP 段、子网掩码,方便跟现有基础设施融合
  3. 隔离性更强:不同的 network 之间 默认互相隔离,安全性高,防止容器乱串
  4. 支持多网卡容器:一个容器可以连到多个 network,相当于多块网卡,复杂应用(如代理服务器)必备
  5. 跨主机扩展:使用 Swarm / Kubernetes,可以把 network 跨宿主机打通,做跨机集群
  6. 内建负载均衡:多个容器用同一个名字(服务名)注册时,docker network 会自动轮询负载均衡请求(bridge overlay支持)

你可能感兴趣的:(docker,容器,运维)