【Docker】常见命令与常见案例

一、初识 Docker

长话短说,你可以将一个软件开发完成后,连同其本身与其所依赖的一切东西(包括操作系统的函数,各种操作系统环境),看成一个整体,称为一个镜像

理论上有了这一个整体,镜像就可以运行了,并且不依赖于操作系统,而 Docker 就可以实现这一操作,Docker 可以创建一个运行环境,称为一个容器

这个容器依然可以理解为一个整体,在容器外来看,它就是一个运行中的程序,而在容器内部,它可以是另一套操作系统(可以理解为一个操作系统,但只是操作系统的必备的函数和文件),必须指定外部端口与内部端口的映射(Docker 代理),外部程序才能访问内部端口

举个简单的例子:一个 Linux 服务器通过 Docker 部署三个 Redis,在三个容器内部,Redis 的端口都是 6379,但外部端口可以指定 6379、6380、6381(不重复)

只需要安装 Docker,其实在一台服务器就可以安装很多软件了,避免麻烦的手动安装,以及环境、版本的影响

这也只是简单的了解,以下是 Docker 的常见命令与常见案例!(期间一定要借助 --help 帮助手册)

二、Docker 安装

Docker 安装其实网上能找到的基本都能行,但是为了不让我们的心态爆炸,这里有一些需要提到的:

  1. 一些端口的防火墙一定需要打开
  2. 不要遗漏镜像内部的多个程序(有些镜像内部是由多个程序,多个端口的、例如 SpringBoot 项目集成了 XXL-JOB 框架,可能会有执行器的端口)
  3. 国内源,一些镜像死活拉不下来,哪怕用其他的版本号,一定要尽量配置一些方便的,以下是我目前用起来不错的配置:

其中阿里的可以在 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 看到

CentOS 文件上传和压缩:

shell 复制代码
yum install lrzsz
shell 复制代码
yum install unzip

三、使用 Docker

(1)Docker 镜像命令

命令 说明 文档地址
docker pull 拉取镜像 docker pull
docker push 推送镜像到DockerRegistry docker push
docker images 查看本地镜像 docker images
docker rmi 删除本地镜像,不能删除创建了容器的镜像,因为容器是引用了镜像(但是镜像在各自容器运行环境独立) docker rmi
docker run 创建并运行容器(不能重复创建) docker run
docker stop 停止指定容器 docker stop
docker start 启动指定容器 docker start
docker restart 重新启动容器 docker restart
docker rm 删除指定容器, docs.docker.com
docker ps 查看容器 docker ps
docker logs 查看容器运行日志 docker logs
docker exec 进入容器(常见格式:docker exec -it container bash) docker exec
docker save 保存镜像到本地压缩文件 docker save
docker load 加载本地压缩文件到镜像 docker load
docker inspect 查看容器详细信息 docker inspect

(2)数据卷命令

命令 说明 文档地址
docker volume create 创建数据卷 docker volume create
docker volume ls 查看所有数据卷 docs.docker.com
docker volume rm 删除指定数据卷 docs.docker.com
docker volume inspect 查看某个数据卷的详情 docs.docker.com
docker volume prune 清除数据卷 docker volume prune

(3)Dockersfile 自定义镜像

docker build -t image:tag .

指定目录进行构建(一个目录最多有一个 Dockerfile 文件,所以不会有冲突,而且只指定目录不需要每次都指定固定的 Dockerfile 文件名)

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./xx.jar /tmp/app.jar
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

(4)DockerCompose 多容器部署

docker-compose.yml 文件示例:

yaml 复制代码
version: "3.2"

services:
  nacos:
    image: nacos/nacos-server
    environment:
      MODE: standalone
    ports:
      - "8848:8848"
  mysql:
    image: mysql:5.7.25
    environment:
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "$PWD/mysql/data:/var/lib/mysql"
      - "$PWD/mysql/conf:/etc/mysql/conf.d/"
  userservice:
    build: ./user-service
  orderservice:
    build: ./order-service
  gateway:
    build: ./gateway
    ports:
      - "10010:10010"

服务与服务之间,通过 docker compose 的作用,可以通过服务名进行访问,这样单个服务无需暴露端口,每个服务还是隔离的,但是可以相互访问

但是服务不能通过 localhost 或者不同 docker compose 的服务访问

基本语法如下:

Bash 复制代码
docker-compose [OPTIONS] [COMMAND]

OPTIONS:

参数或指令 说明
-f 指定compose文件的路径和名称
-p 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念
-d 后台执行

COMMAND:

参数或指令 说明
up 创建并启动所有service容器
down 停止并移除所有容器、网络
ps 列出所有启动的容器
logs 查看指定容器的日志
stop 停止容器
start 启动容器
restart 重启容器
top 查看运行的进程
exec 在指定的运行中容器中执行命令

四、常见案例

Explore Docker's Container Image Repository

一定要搜索!!!

(1)MySQL

hmy.cnf:

shell 复制代码
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
shell 复制代码
mkdir /root/mysql
mkdir /root/mysql/data
mkdir /root/mysql/conf
cd /root/mysql/conf

docker pull mysql:5.7

docker run \
--name mysql-server \
-p 3306:3306 \
-v /root/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /root/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=xxx \
-e TZ=Asia/Shanghai \
-d mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

docker exec -it mysql-server mysql -u root -p

(2)Redis

redis.conf 要根据对应版本去找!

shell 复制代码
mkdir /root/redis
mkdir /root/redis/data
mkdir /root/redis/conf
cd /root/redis/conf

docker pull redis:6.2.6

docker run \
--name redis-server \
-p 6379:6379 \
-v /root/redis/conf:/usr/local/etc/redis \
-v /root/redis/data:/data \
-d redis:6.2.6 redis-server /usr/local/etc/redis/redis.conf

docker exec -it redis-server redis-cli

(3)RabbitMQ

shell 复制代码
mkdir /root/mq
cd /root/mq

docker rm mq-server -f
docker rmi rabbitmq:3.8-management -f
docker volume rm mq-plugins -f

docker pull rabbitmq:3.8-management

# 插件数据卷最好还是直接挂载 volume,而不是挂载我们的目录
docker run \
--name mq-server \
-e RABBITMQ_DEFAULT_USER=mms \
-e RABBITMQ_DEFAULT_PASS=bitter-macaron \
--hostname mq1 \
-v mq-plugins:/plugins \
-p 15672:15672 \
-p 5672:5672 \
-d rabbitmq:3.8-management

# 添加延迟交换机的插件:
docker volume inspect mq-plugins

cd /var/lib/docker/volumes/mq-plugins/_data

docker exec -it mq-server bash

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

(4)Minio

shell 复制代码
mkdir /root/minio
cd /root/minio

docker pull bitnami/minio:latest

docker run \
--name minio-server \
-p 9005:9000 \
-p 9001:9001 \
-v /root/minio/data:/bitnami/minio/data  \
--env MINIO_ROOT_USER="mms" \
--env MINIO_ROOT_PASSWORD="bitter-macaron" \
-d bitnami/minio:latest

(5)自定义(XXL-JOB)

Dockerfile:

shell 复制代码
FROM openjdk:17-jdk-slim

COPY ./xxl-job-admin-3.0.0-SNAPSHOT.jar /root/app.jar

ENV PARAMS=""

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

EXPOSE 1718

ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /root/app.jar $PARAMS"]
shell 复制代码
mkdir /root/xxljob
cd /root/xxljob

XXLJOB_IMAGE_NAME=xxljob:3.0.0
XXLJOB_CONTAINER_NAME=xxljob-server

docker rm -f ${XXLJOB_CONTAINER_NAME}
docker rmi -f ${XXLJOB_IMAGE_NAME}
docker build -t ${XXLJOB_IMAGE_NAME} .

docker run \
--name ${XXLJOB_CONTAINER_NAME} \
-p 1718:1718 \
-d ${XXLJOB_IMAGE_NAME}

文章到这里就戛然而止了,虽然不细致,但是大部分日常开发用到的也不多,需要的可以继续深入了解:

  1. 一键化部署,流水线之类的
  2. 项目中需要通过 docker api 创建镜像和容器(在线 oj)
  3. 微服务部署
  4. Docker 镜像仓库
  5. ...
相关推荐
吴声子夜歌6 小时前
Linux命令——归档与备份
linux·运维·备份·归档
HackTwoHub6 小时前
BurpSuite2026.8专业(稳定版)下载Windows/Linux/Mac支持Java21以上(新增Burp AT智能体)
linux·运维·服务器·安全·macos·网络安全·自动化
大牧师7 小时前
MySQL 学习教程
数据库·sql·mysql·docker·node·全栈·后端数据
Elastic 中国社区官方博客7 小时前
如何通过一条 ES|QL 查询为 Elasticsearch 中的每个指标构建指标图表
大数据·运维·数据库·elasticsearch·搜索引擎·全文检索·kibana
CET中电技术7 小时前
工业园区源网荷储一体化怎么建?CET中电技术x中信重工洛阳伊滨厂区项目技术拆解
运维
数据库小学妹7 小时前
MySQL redo刷盘实测:innodb_flush_log_at_trx_commit与故障矩阵
运维·数据库·mysql
充电zcx7 小时前
Linux:2:Linux下的基本指令
linux·运维·服务器
数安旭说8 小时前
从“人治”到“平台化”:迪康端点安全一体化管理平台的任务协同实战
运维·数据安全·软件需求·企业管理·终端管理·终端安全·终端运维
handler018 小时前
【Linux】虚拟地址空间解析
linux·运维·c++·线程·进程·虚拟地址空间·虚拟地址
MC丶科8 小时前
软考架构师90天冲刺|DAY44·Redis高级应用
数据库·数据仓库·redis·缓存·oracle·容器·规格说明书