Docker及Docker-compose常用命令总结

Docker及Docker-compose常用命令总结

本文记录了本人在工作过程中使用过的docker常用命令,希望能帮助到需要的人
本文的运行环境:Ubuntu18.04.1

一、概述

1.1 为什么使用Docker

  • 使用Docker可以通过定制应用镜像来实现持续集成,持续交付,部署。开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则可以在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署

1.2 使用Docker的好处

  • 更快速
  • 更好的保持一致的运行环境
  • 在持续交付和部署中可以更轻松地进行迁移
  • 更轻松维护和扩展

1.3 Linux设置Docker开机启动

  • 如果不设置的话每次需要输入service docker start命令来启动docker
  • 通过输入以下命令还设置docker开机启动
systemctl enable docker

二、Docker常用命令

2.1 操作Docker镜像

2.1.1 拉取镜像
2.1.1.1 连接互联网
  • 直接通过docker pull命令把镜像拉下即可
  • 命令形式:docker pull 镜像名:版本
  • 示例如下:
sudo docker pull mysql:5.6.48
2.1.1.2 离线环境
  1. 在互联网电脑通过docker pull命令把拉下镜像
    示例如下:
sudo docker pull mysql:5.6.48
  1. 通过docker save命令存出镜像文件
    命令形式:docker save -o 保存的镜像压缩包路径 镜像名:版本号
    示例如下:
sudo docker save -o /home/mysql_5.6.48.tar mysql:5.6.48
  1. 通过光驱或其他物理隔离载体复制到离线环境电脑,再通过docker load命令载入镜像
    命令形式:docker load -i 镜像压缩包
    示例如下:
sudo docker load -i mysql_5.6.48.tar
  1. 载入完后,查看并删除镜像文件
    查看命令形式:docker images
    删除镜像命令形式:docker rmi 镜像名:镜像编号
    示例如下:
sudo docker images
sudo docker rmi mysql:5.6.48
2.1.2 重命名镜像
  • 以prometheus镜像举例,我们要拉取下来的镜像名称太长,我们要重命名镜像名
    在这里插入图片描述
  • 通过docker tag命令来标签来实现重命名镜像名称
    命令形式:docker tag 原有的镜像名称 重命名后的镜像名称:重命名后的镜像版本号
docker tag docker.io/prom/prometheus prometheus:v1
  • 最后要通过docker rmi命令把原有的镜像删除掉
    命令形式:docker rmi 原有的镜像名称:原有的镜像版本号
docker rmi docker.io/prom/prometheus:latest
  • 最终重命名后的镜像如下所示,重命名完成
    在这里插入图片描述

2.2 操作Docker容器

2.2.1 创建容器
2.2.1.1 创建容器-方法1
  1. 先通过docker create命令创建容器
    命令形式:docker create 参数 镜像名/镜像id 命令
    示例如下:
sudo docker create -it python:3.6.5
  1. 再通过docker start命令启动容器
    命令形式:docker start 容器名/容器id
    示例如下:
sudo docker start 36f9696c942e
2.2.1.2 创建容器-方法2(推荐)
  • 首选方法,创建并运行容器
  • 通过docker run命令创建并运行容器
  • 常用参数意义
# docker run 参数 镜像名:镜像编号 命令
# --name表示容器名称 -i表示输入输出 -t表示伪终端 -d表示后台运行
# -p表示映射端口"宿主机端口:容器端口"
# -v表示数据卷"宿主机目录:容器目录"
# /bin/bash是容器内shell(如果没有/bin/bash可换成/bin/sh),也可以不要
  • 示例如下:
sudo docker run --name my_test -itd -p 5000:5000 -v /home/nikolas/webapp/my_test:/home/my_test python:3.6.5 /bin/bash

# 快速创建并启动,系统自动设定名称,没有-d容器退出后,容器停止
sudo docker run -it python:3.6.5 /bin/bash
2.2.2 容器常用操作命令
2.2.2.1 进入、退出
# 进入容器
sudo docker exec -it my_test /bin/bash

# 退出容器
# 进入容器后,在容器内部使用exit或ctrl+D即可
2.2.2.2 重启、停止、删除
# 重启容器
sudo docker restart my_test

# 停止容器
sudo docker stop my_test

# 删除容器
sudo docker rm my_test

# 停止并删除容器
sudo docker stop my_test && sudo docker rm my_test
2.2.2.3 查看
# 查看所有容器
sudo docker ps -a

# 查看容器内详情
sudo docker inspect my_test

# 查看容器内进程
sudo docker top my_test

# 查看容器打印的日志
sudo docker logs -f my_test
2.2.2.4 复制
  1. 宿主机向容器复制文件
    命令形式:docker cp 宿主机路径 容器名:容器路径
    示例如下:
sudo docker cp /home/nikolas/data/hello.txt  my_test:/home 
  1. 容器向宿主机复制文件(反转路径即可)
    命令形式:docker cp 容器名:容器路径 宿主机路径
    示例如下:
sudo docker cp my_test:/home/hello.txt /home/nikolas/data
2.2.2.5 导入、导出
  1. 导出容器为.tar文件
    命令形式:docker export -o 容器压缩包路径 容器名:版本号
    示例如下:
sudo docker export -o /home/my_test.tar my_test:v1
  1. 导入.tar文件为容器
    命令形式:docker import 容器压缩包路径
    示例如下:
sudo docker import /home/my_test.tar
2.2.2.6 导出容器为镜像
  1. “export -o"和"save -o” 的区别
    使用export导出的镜像只能用import导入(会丢失镜像历史)
    而使用save导出的镜像只能有load导入(数据保存完整)

  2. 导出方法

  • 先通过docker commit 命令实现容器和镜像的转换
# docker commit 容器名 镜像名:版本号
# -m 说明信息
# -a 用户信息
sudo docker commit -m "my test " -a "yyp" my_test my_test:v1
  • 然后通过docker save -o 命令导出转换后的镜像即可
2.2.3 容器互联
  1. 先创建两个容器
# mysql容器
sudo docker run --name test_mysql -itd -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.48 /bin/bash

# python容器
sudo docker run --name test_python -itd -p 5000:5000 python:3.6.5 /bin/bash
  1. 创建web服务器,通过docker link命令链接两个容器
# --link表示连接容器
# name:alias(链接的容器名:别名,name和alias可以相同),也可仅仅跟要链接的容器名

# 简单创建链接
sudo docker run -it --link test_mysql:mysql python:3.6.5 /bin/bash

# 完整创建链接
sudo docker run --name test_python -itd -p 5000:5000 --link test_mysql python:3.6.5
  1. 通过docker exec -it命令查看容器是否连通
    命令形式:docker exec -it 容器名 ping 容器名
    示例如下:
sudo docker exec -it test_python ping test_mysql

2.3 配置Dokcer网络

2.3.1 配置网络
# --subnet表示网段是192.168.18.0/255.255.255.0,如果24变为16表示255.255.0.0
# --driver表示设置网络模式为bridge
# --gateway表示设置网关为192.168.18.1
# dev_network表示自己创建的网络名
sudo docker network create --driver bridge --subnet=192.168.18.0/24 --gateway=192.168.18.1 test_network
2.3.2 使用配置的网络创建容器
2.3.2.1 直接创建
# --net指定在test_network网络中
# --ip表示设置ip地址为192.168.18.11
sudo docker run --name my_test --hostname www.test.com --net test_network --ip 192.168.18.11 -d --restart always --privileged=true python:3.6.5
2.3.2.2 把创建好的容器连接到配置的网络

命令形式:docker network connect 网络名 容器名
示例如下:

# 连接的话使用connect,断开的话使用disconnect
sudo docker network connect test_network my_test
2.3.2.3 查看、删除
# 查看docker网络模式,Docker默认网络模式是bridge网络
sudo docker network ls

# 删除网络
sudo docker network rm test_network

三、Docker-Compose

3.1 为什么使用Docker-Compose

3.1.1 概念
DockerDocker-Compose
概念是一个供开发和运维人员开发、测试、部署和运行应用程序的容器平台(docker是一个容器平台)是一个用于创建和管理多容器应用程序的工具
创建容器数量1个多个
是否容易编辑每个容器需要单独去修改直接修改一个yaml文件即可
是否是服务一个由多个容器组成的服务,依赖于docker之上
3.1.2 总结
  • 如果项目中需要创建部署的容器较多,使用Docker-Compose是个非常不错的选择

3.2 使用

3.2.1 设置Web服务开机自启动
  • 首先进行Web服务开机自启动设置方法的说明
  • 创建Web项目时,往往都需要让服务进行开机自启动。然而docker run创建的容器无法直接做到这一点,因此下面我将介绍如何设置python及java服务的开机自启
3.2.1.1 创建开机自启动文件start_app.sh
  • 建议直接在服务工程文件中建立,不然的话还需要复制文件到容器中
  • 示例中都假设我把start_app.sh放置在服务工程文件的根目录下,并通过docker network create创建了my_net网络
  1. 基于python的服务
export PATH=$PATH:/usr/local/python3/bin

# 进入容器内app.py所在路径(假设app.py放置在/home/my_python/路径下)
cd /home/my_python/

# 杀死gunicorn
pkill -9 gunicorn

# 启动服务
gunicorn -w 4 -b 0.0.0.0:5000 app:app  --timeout 6000
  1. 基于java的服务
# 进入容器内app-1.0.0.jar所在路径(假设app-1.0.0.jar放置在/home/my_java/路径下)
cd /home/my_java/

# 启动服务
java -jar app-1.0.0.jar
3.2.1.2 用docker run命令创建包含服务工程文件的容器
  1. 基于python的服务
# /home/nikolas/webapp/my_python为linux系统中放置服务工程文件的路径
# /home/my_python为容器内放置服务工程文件的路径
sudo docker run --name my_python -itd --restart=always --net my_net -p 5000:5000 -v /home/nikolas/webapp/my_python:/home/my_python python:3.6.5 /bin/bash
  1. 基于java的服务
# /home/nikolas/webapp/my_java为linux系统中放置服务工程文件的路径
# /home/my_java为容器内放置服务工程文件的路径
sudo docker run -itd --name my_java --restart=always --net my_net -p 8088:8088 -v /home/nikolas/webapp/my_java:/home/my_java jdk:1.0.0 
3.2.1.3 创建DockerFile文件
# touch命令创建
touch DockerFile

# 或者用vim命令创建
vim DockerFile
  1. 基于python的服务
# 设置镜像(原始镜像:原始镜像版本号)
FROM python:3.6.5

# 设置作者
MAINTAINER nikolas

# 开放5000端口
EXPOSE 5000

# 执行命令
CMD ["sh", "/home/my_python/start_app.sh"]
  1. 基于java的服务
# 设置镜像(原始镜像:原始镜像版本号)
FROM jdk:1.0.0

# 设置作者
MAINTAINER nikolas

# 开放8088端口
EXPOSE 8088

# 执行命令
CMD ["sh", "/home/my_java/start_app.sh"]
3.2.1.4 用docker build命令打包成开机自启动的镜像
# docker build -f DockerFile文件所在路径 -t 开机自启动镜像名称:开机自启动镜像版本号
# 这里以python服务为例
sudo docker build -f ./Dockerfile -t new-python:3.6.5 .
3.2.1.5 查看镜像是否创建成功,成功后删除3.2.1.2中创建的容器
  • 若系统部署的容器的端口号,与3.2.1.2中创建的容器一样的话会报错,因此建议删除
# 查看镜像是否创建成功
sudo docker images

# 创建成功后删除容器
sudo docker stop my_python && sudo docker rm my_python
sudo docker stop my_java && sudo docker rm my_java
3.2.2 创建及使用yaml文件部署测试系统的容器
3.2.2.1 所需容器
  • 假设我们需要的容器如下:
容器名称镜像名称版本号
test_pythonnew_python3.6.5
test_javanew_jdk1.0.0
test_mysqlmysql5.7.34
test_redisredis6.2
test_nginxnginx1.20.0
  • 其中new_python 和 new_jdk 为3.2.1中创建好的开机自启动服务镜像
3.2.2.2 创建yaml文件
  • 根据3.2.2.1中需要的容器,创建所需的yaml文件
  1. 创建
# 直接用vim命令创建
vim test_system.yaml
  1. 编写yaml文件内容
# 搭建测试系统环境

# yaml文件版本号
version: '3.7'

# yaml文件包含的容器
services:
  
  # python容器
  test-python:
    tty: true
    image: new-python:3.6.5
    container_name: test-python
    # 设置端口
    ports:
      - 5000:5000
    # 设置开机启动
    restart: always
    volumes:
      - /home/nikolas/webapp/my_python:/home/my_python
    logging:
      driver: "json-file"
      options:
        max-size: "5g"
  
  # java容器
  test-java:
    tty: true
    image: new-jdk:1.0.0
    container_name: test-java
    # 设置端口
    ports:
      - 8088:8088
    # 设置开机启动
    restart: always
    volumes:
      - /home/nikolas/webapp/my_java:/home/my_java
    logging:
      driver: "json-file"
      options:
        max-size: "5g"

  # mysql容器
  test-mysql:
    tty: true
    image: mysql:5.7.34
    container_name: test-mysql
    # 设置端口
    ports:
      - 3306:3306
    # 设置开机启动
    restart: always
    volumes:
      - /home/nikolas/db_data/mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456

  # redis容器
  test-redis:
    tty: true
    image: redis:6.2
    container_name: test-redis
    # 设置端口
    ports:
      - 6379:6379
    # 设置开机启动
    restart: always
    command: --requirepass 123456

  # nginx容器
  test-nginx:
    tty: true
    image: nginx:1.20.0
    container_name: test-nginx
    # 设置端口
    ports:
      - 81:81
      - 446:446
    # 设置开机启动
    restart: always
    volumes:
      - /var/log/nginx:/var/log/nginx

# yaml文件所用的网络
networks:
  default:
    external:
      name: my_net
3.2.2.3 使用docker-compose命令部署测试系统
  • 一键创建yaml文件包含的所有容器
# docker-compose -f yaml文件所在路径
sudo docker-compose -f /home/nikolas/yaml/test_system.yaml up -d
  • 一键删除yaml文件包含的所有容器
# docker-compose -f yaml文件所在路径
sudo docker-compose -f /home/nikolas/yaml/test_system.yaml down

三、Docker wsl2磁盘空间不释放问题

当Windows系统使用Docker容器时,会出现当容器或镜像卸载时ext4.vhdx容量不释放的问题,下面是解决办法

3.1 问题原因

  • 由于WSL2本质上是虚拟机,所以 Windows 会自动创建 vhdx 后缀的虚拟磁盘文件作为存储。这个 vhdx 后缀的虚拟磁盘文件特点是可以自动扩容,但是一般不会自动缩容。一旦有很多文件把它“撑大”,即使把这些文件删除它也不会自动“缩小”。所以删除文件后还需要我们手动进行压缩才能释放磁盘空间。

3.2 解决办法

3.2.1 手动运行
  • 清理没用的空间
进入wsl
wsl

查看docker 占用的空间
wsl:~$ docker system df

一键清理没用的空间
wsl:~$docker system prune

停止wsl服务
wsl --shutdown
  • 压缩文件
进入磁盘管理
diskpart

选择虚拟磁盘文件
select vdisk file="C:\Users\zyc\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx"

将虚拟磁盘以只读模式挂载到虚拟机
attach vdisk readonly

压缩文件
compact vdisk

压缩完成后卸载磁盘
detach vdisk

退出磁盘管理
exit
3.2.2 脚本自动运行

编写db_run.txt和vhdx_slim.sh文件,两个文件放在同一目录下,然后运行vhdx_slim.sh即可
dp_run.txt文件

select vdisk file="E:\Documents\Docker Files\DockerDesktopWSL\data\ext4.vhdx"    # ext4.vhdx文件路径
attach vdisk readonly
compact vdisk
detach vdisk
exit

vhdx_slim.sh

@echo off
wsl cd
wsl docker system df
wsl docker system prune
wsl exit

wsl --shutdown
diskpart /s .\dp_run.txt

pause

至此本文的所有内容已介绍完毕,因为还使用了nginx容器,所以还涉及到一些nginx的配置文件需要去编写。但因为nginx的相关知识不在本文所述范围内,因此本文暂不做讨论,感谢浏览本文的朋友。

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Docker是一种容器化技术,可以在不同的操作系统上运行应用程序。Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。 以下是一些常用的DockerDocker Compose命令: ### Docker - `docker run`: 运行一个Docker容器。 - `docker ps`: 列出正在运行的Docker容器。 - `docker images`: 列出所有本地镜像。 - `docker build`: 使用Dockerfile构建一个Docker镜像。 - `docker push`: 将本地镜像上传到Docker Hub或其他Docker镜像仓库。 - `docker pull`: 从Docker Hub或其他Docker镜像仓库中下载一个镜像。 - `docker rm`: 删除一个或多个Docker容器。 - `docker rmi`: 删除一个或多个本地Docker镜像。 ### Docker Compose - `docker-compose up`: 构建并启动一个Docker Compose应用。 - `docker-compose down`: 停止并删除一个Docker Compose应用。 - `docker-compose ps`: 列出正在运行的Docker Compose服务。 - `docker-compose logs`: 查看一个Docker Compose服务的日志。 - `docker-compose exec`: 在一个Docker Compose服务中执行一个命令。 - `docker-compose build`: 构建一个Docker Compose服务的镜像。 - `docker-compose pull`: 下载一个Docker Compose服务的镜像。 ### Docker Compose配置文件 Docker Compose使用YAML格式的配置文件来定义多容器Docker应用程序。以下是一个示例配置文件: ``` version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine" ``` - `version`: 定义配置文件使用的Docker Compose版本。 - `services`: 包含一个或多个Docker容器服务的列表。 - `build`: 构建一个Docker镜像。 - `image`: 使用现有的Docker镜像。 - `ports`: 映射容器端口到主机端口。在此示例中,容器的5000端口将映射到主机的5000端口。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nikolas06

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值