Docker起步

Docker安装

如果系统中存在旧的Docker,先进行卸载:

1
2
3
4
5
6
7
8
9
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux

然后重新安装Docker:

1
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完毕,开启服务:

1
2
3
4
# 开启服务
systemctl start docker
# 设置开机自启
systemctl enable docker

配置镜像加速:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建目录
rm -f /etc/docker/daemon.json

# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

镜像可能失效,可以访问Docker国内镜像源加速列表(7月24日更新)-腾讯云开发者社区-腾讯云获取最新镜像

创建MySQL容器

运行如下命令,MYSQL_ROOT_PASSWORD为数据库用户密码

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

注意:对外暴露的端口是3307,3306表示容器内部mysql的端口,相当于使用3307映射了内部的3306

镜像和容器

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

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

Snipaste_2025-08-24_23-04-20

Docker核心

⭐Docker命令⭐

首先剖析之前创建MySQL容器的命令:

1
2
3
4
5
6
docker run -d \
--name test_mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:8
  • docker run:创建并运行一个容器,-d是让容器在后台运行
  • --name mysql:给容器起个名称,并且该名称必须在Docker容器中是唯一的
  • -p 3307:3306:设置端口映射(外部端口:内部端口)
  • -e KEY=VALUE:设置环境变量
  • mysql:8:指定运行的镜像的名字,版本(镜像名:版本号)

常见命令

Snipaste_2025-08-24_23-16-36

docker ps -a可以查看全部的容器,包括未启动的

docker image ls可以查看当前存在的镜像

docker exec -it 容器名称 bash表示进入容器内部并通过bash终端进行操作

docker inspect 容器名称查看容器的详细名称

Docker数据卷挂载

数据卷(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

注意:在执行docker run命令时,使用-v数据卷:容器内目录形式可以完成数据卷挂载(数据卷不存在,会自动创建

示例:

1
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html -v nginx_conf:/etc/nginx/nginx.conf nginx

创建后的nginx容器,它的静态资源目录和配置目录都分别使用了html数据卷、nginx_conf这两个数据卷进行映射

本地目录挂载

命令:

1
docker run -d --name 容器名 -p 宿主机端口:容器端口 -v 宿主机目录或文件:容器内目录或文件 镜像名

注意:

  • 本地目录必须以 / 或 ./开头,如果直接以名称开头,会被识别为数据卷而非本地目录
    • -v mysql:/var/lib/mysql会被识别为一个数据卷,数据卷叫mysql
    • -v ./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录

自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程

镜像的结构:

Snipaste_2025-08-25_00-30-27

Dockerfile

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像

指令 说明 示例
FROM 指定基础镜像 FROM centos:7
ENV 设置环境变量,可在后面指令使用 ENV key=value
COPY 拷贝本地文件到镜像的指定目录 COPY ./jdk17.tar.gz /tmp
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN tar -zxvf /tmp/jdk17.tar.gz
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
# 使用 CentOS 7 作为基础镜像
FROM centos:7
# 添加 JDK 到镜像中
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ && rm /usr/local/jdk17.tar.gz
# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH
# 创建应用目录
RUN mkdir -p /app
WORKDIR /app
# 复制应用 JAR 文件到容器
COPY app.jar app.jar
# 暴露端口
EXPOSE 8080
# 运行命令
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

编写好了Dockerfile之后,可以利用如下命令创建镜像:

1
docker build -t myImage:1.0 .
  • -t :给镜像起名,格式镜像名:版本号(不指定版本号默认为latest)
  • . :是指Dockerfile所在目录,如果就在当前目录则指定为”.”

网络

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:

docker network

Docker的网络操作命令如下:

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

默认的bridge网桥不支持容器名解析IP地址,需要自己创建网络(测试方式:进入容器,ping 容器名)

Docker项目部署

后端部署

  • 需求:将Tlias系统打包为镜像并部署
  • 步骤:
    1. 准备MySQL容器,并创建Tlias数据库以及表结构
    2. 准备java应用(Tlias项目)镜像,部署Docker容器,运行测试
      • 修改Tlias项目的配置文件,修改数据库服务地址以及logback日志存放地址,打jar包
      • 编写Dockerfile文件
      • 构建Docker镜像
      • 部署Docker容器

DockerCompose

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

格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
services: 
containerA:
image: A
container_name: A
ports:
- "11:11"
containerB:
image: B
container_name: B
ports:
- "22:22"
containerC:
image: C
container_name: C
ports:
- "33:33"

Snipaste_2025-08-25_12-09-27

可以看出,虽然内容似乎比直接部署更多了,但是结构更加清晰、可读性也更强

针对之前项目部署的所有容器、镜像构建操作,都可以编写在一个docker-compose.yml文件中:

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
services:
mysql:
image: mysql:8
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 1234
volumes:
- "/usr/local/app/mysql/conf:/etc/mysql/conf.d"
- "/usr/local/app/mysql/data:/var/lib/mysql"
- "/usr/local/app/mysql/init:/docker-entrypoint-initdb.d"
networks:
- tlias-net
tlias:
build:
context: .
dockerfile: Dockerfile
container_name: tlias-server
ports:
- "8080:8080"
networks:
- tlias-net
depends_on:
- mysql
nginx:
image: nginx:1.20.2
container_name: nginx-tlias
ports:
- "80:80"
volumes:
- "/usr/local/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "/usr/local/app/nginx/html:/usr/share/nginx/html"
depends_on:
- tlias
networks:
- tlias-net
networks:
tlias-net:
name: itheima

DockerCompose目录

  • Docker Compose的命令格式:docker compose [OPTIONS] [COMMAND]

  • 参数说明:

类型 参数或指令 说明
Options -f 指定compose文件的路径和名称
-p 指定project名称
Commands up 创建并启动所有service容器
down 停止并移除所有容器、网络
ps 列出所有启动的容器
logs 查看指定容器的日志
stop 停止容器
start 启动容器
restart 重启容器
top 查看运行的进程