Docker

0 环境搭建

  1. 卸载旧版本
1
2
3
4
5
6
7
8
yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  1. 配置docker的yum库
1
2
3
4
# 首先要安装一个yum工具
yum install -y yum-utils
# 配置Docker的yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装docker
1
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 启动与校验
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
  1. 配置镜像加速

以阿里云容器镜像服务为例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 创建目录
mkdir -p /etc/docker
# 修改镜像地址
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker

1 介绍

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。

镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub

image-20231211162805768

2 命令详解

案例:部署MySQL

1
2
3
4
5
6
docker run -d \
  --name mysql \
  -p 3306:3306 \ 
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql

docker run :创建并运行一个容器,-d 是让容器在后台运行

–name mysql :给容器起个名字,必须唯一

-p 3306:3306 :设置端口映射(宿主机端口映射到容器内端口)

-e KEY=VALUE :是设置环境变量

mysql :指定运行的镜像的名字,在没有指定tag时,默认是latest,代表最新版本的镜像

常见命令

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:docker官方文档

image-20231211163122288

数据卷

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

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

image-20231211163821618

在执行docker run命令时,使用 -v 本地目录 : 容器内目录 可以完成本地目录挂载

本地目录必须以“/”或 “./” 开头,如果直接以名称开头,会被识别为数据卷而非本地目录

  • -v mysql : /var/lib/mysql 会被识别为一个数据卷叫mysql
  • -v ./mysql : /var/lib/mysql 会被识别为当前目录下的mysql目录

镜像结构

image-20231211164628232

dockerfile

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

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

# 也可以基于DJK为基础镜像
# 基础镜像
FROM openjdk:11.0-jre-buster
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
1
docker build -t myImage:1.0 .

网络

image-20231211171115651

加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:

命令说明文档地址
docker network create创建一个网络docker network create
docker network ls查看所有网络docker network ls
docker network rm删除指定网络docker network rm
docker network prune清除未使用的网络docker network prune
docker network connect使指定容器连接加入某网络docker network connect
docker network disconnect使指定容器连接离开某网络docker network disconnect
docker network inspect查看网络详细信息docker network inspect

DockerCompose

Docker Compose通过一个单独的docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - new
  hmall:
    build:
       context: .
       dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - new
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/etc/nginx/html"
    depends_on:
      - hmall
    networks:
      - new
networks:
  new:
    name: hmall
1
docker compose [OPTIONS] [COMMAND]
参数或指令说明
-f指定compose文件的路径和名称
-p指定project名称
up创建并启动所有service容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令
updatedupdated2026-03-202026-03-20