【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. ...
相关推荐
_板栗_21 分钟前
livenessProbe 和 readinessProbe 最佳实践
云原生·容器·kubernetes
我叫珂蛋儿吖43 分钟前
[redis进阶六]详解redis作为缓存&&分布式锁
运维·c语言·数据库·c++·redis·分布式·缓存
Kaede61 小时前
如何选择合适的服务器操作系统
运维·服务器
无名3871 小时前
用 openssl 测试 tls 连接
运维·服务器
.生产的驴2 小时前
Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库
java·运维·数据库·spring·docker·容器·maven
知行022 小时前
MySQL的Docker版本,部署在ubantu系统
数据库·mysql·docker
cwywsx2 小时前
Linux:进程控制2
linux·运维·算法
南棱笑笑生2 小时前
20250512给NanoPi NEO core开发板在Ubuntu core20.04系统下重新编译boot.img
linux·运维·ubuntu
搬砖的工人3 小时前
Docker环境下的Apache NiFi安装实践踩坑记录
docker·容器·apache
luck_me53 小时前
K8s 图形界面管理kubesphere
云原生·容器·kubernetes