Docker 笔记


Docker 笔记

原创 已于 2025-03-28 12:07:49 修改 · 粉丝可见 · 863 阅读 · 25 · 9 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/142525696

目录

[TOC]

初始入门

例子:docker 安装Mysql

1
2
3
4
5
6
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456
mysql
  • docker run : 创建并运行一个容器

  • -d : 是让容器在后台运行

  • --name ___ : 给容器起别名,必须唯一,方便区分不同容器

  • -p (外部系统端口):(容器暴露端口) :  设置外部系统与容器端口之间的映射

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

  • 最后结尾非关键字字符串 mysql : 指定运行的镜像名字

镜像命名规范

镜像名称一般分两部分组成 :  [repository] :  [tag]。例如:mysql:5.7

  • 其中repository就是镜像名

  • tag是镜像的版本

在没有指定tag时,默认是latest,代表最新版本的镜像。

常用dockers命令

docker ps : 查看当前运行的 docker 容器

docker ps - a: 查看所有的 docker 容器

docker ps -q:查看所有正在运行的 docker 容器ID

docker stop [容器名称或者容器ID]:停止对应的容器

docker stop $(docker ps -q):停止所有正在运行的容器 ID

docker start [容器名称或者容器ID]:启动对应的容器

docker logs [容器名称或者容器ID]:查看当前容器的运行日志

docker logs [容器名称或者容器ID] - f :查看并跟踪当前容器的运行日志

docker exec -it [容器名称或者容器ID] bash:进入对应的docker容器

  • -it                 表示 交互的意思

  • bash            表示 使用 bash 命令进行交互

docker exec -it [容器名称或者容器ID] [进入容器后执行的命令]:进入对应的docker容器并执行相应的命令

  • 例如:docker exec -it mysql mysql -uroot -p:进入mysql命名的容器,并执行mysql -uroot -p命令

docker rm [容器名称或者容器ID]:删除对应的容器

docker rm [容器名称或者容器ID] -f:强制删除容器

docker inspect [容器名称或者容器ID]:查看容器详情

Linux系统自定义运行命令

在Linux系统中,自定义运行命令可以通过多种方式实现。

在这里我简单的介绍一个简易的自定义命令。

进入并编写自定义命令配置

1
vim ~/.bashrc

成功进入自定义命令配置,我们可以发现平时曾用到的常用命令 ls,实际上也是内部系统自定义的一个命令。

使用 别名 alias 自定义命令

在底部加上 自己的自定义的命令

保存并退出     :wq

注意重载我们的配置,使其生效

执行重载我们配置的命令

1
source ~/.bashrc

测试我们自定义命令是否成功

1
dis

结果执行命令成功,说明我们自定义的命令生效了。

数据卷

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

数据卷命令语法:docker volume  [数据卷相关命令]

  • create:创建数据卷

  • ls: 查看所有数据卷

  • rm:删除指定数据卷

  • inspect [挂载数据卷的别名] :查看某个数据卷的详情

  • prune:清除数据卷

  • --help:docker volume 命令的帮助文档

提示

  • 在执行docker run命令时,使用参数-v [数据卷]:[容器内目录]可以完成数据卷挂载

  • 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

  • 注意!!!数据挂载只能在创建容器时进行挂载,如果容器已经创建了,无法再进行挂载

入门应用例子

使用nginx挂载,修改 nginx中的 index.html,并添加一些文件,映射到docker容器中。

通过官方文档可以得知 nginx容器中 index.html的路径在

1
/usr/share/nginx/html

创建 nginx 容器 并挂载 index_html

1
docker run -d --name nginx -p 8081:80 -v index_html:/usr/share/nginx/html nginx

通过 数据卷命令 ls 查看是否成功挂载我们的 index_html

1
docker volume ls

最后显示结果:

出现了我们的挂载卷的别名说明挂载成功。

通过 数据卷命令 inspect 查看我们挂载的数据卷详细情况

1
docker volume inspect index_html

最后运行结果

1
2
3
4
5
6
7
8
9
10
11
[
{
"CreatedAt": "2024-10-20T00:22:53+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/index_html/_data",
"Name": "index_html",
"Options": null,
"Scope": "local"
}
]
  • CreatedAt :这个字段表示卷被创建的时间。

  • Driver :这个字段表示用于创建和管理这个卷的驱动程序。在这个例子中,驱动程序是 “local”,这是 Docker 默认的卷驱动程序,用于本地文件系统。

  • Labels :这个字段包含了与卷关联的键值对标签。在这个例子中, Labelsnull ,表示没有设置任何标签。

  • Mountpoint :这个字段提供了卷在宿主机上的挂载点路径。 在这个例子中,卷被挂载在 /var/lib/docker/volumes/index_html/_data

  • Name :这个字段表示卷的名称。在这个例子中,卷的名称是 “index_html”。

  • Options :这个字段包含了创建卷时指定的额外选项。在这个例子中, Optionsnull ,表示没有指定任何额外选项。

  • Scope :这个字段表示卷的作用域。”local” 表示这个卷仅在创建它的 Docker 守护进程上可用。

运行成功,查看到我们挂载卷的详细结果,通过 Mountpoint 我们可以得知在宿主机中映射到docker容器中的文件路径。

我们运行以下命令去查看我们映射文件是否存在

1
cd /var/lib/docker/volumes/index_html/_data && ll

运行结果:

说明我们映射成功,通过查看index.html发现文件内容与我们的nginx默认的index文件内容是一致的。

通过修改index文件,我们可以发现

通过映射发生了变化。

同时我们添加的文件也可以成功映射添加上去访问成功。

匿名卷

在Docker中,匿名卷是一种特殊类型的卷,它在运行容器时自动创建,并且没有与之关联的命名卷。

正如我们初始入门中使用 docker run 中并没有指定挂载卷,我们创建的容器会根据容器内容所需要指定挂载卷时,自动创建并分配映射指定容器需求的卷。

我们可以通过 docker inspect [容器名称或者容器ID] 进行查看详细的信息

例如,我们运行以下命令查看mysql容器详情

1
docker inspect mysql
  • NetworkSettings:关于网络设置,我们可以看到宿主机之前的端口映射

  • Mounts:关于挂载卷的设置,我们可以看到映射的卷名特别长,这就是创建容器时自动生成匿名映射卷

-v 容器数据卷挂载

在运行Docker容器时,可以使用 -v 参数 来挂载一个卷。

语法:docker run -d -v [宿主机目录]:[容器内目录]  [容器名称或者容器ID]

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

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

    • -v mysql:/var/lib/mysql        会被识别为一个数据卷叫mysql

    • -v ./mysql:/var/lib/mysql      会被识别为当前目录下的mysql目录

应用例子

根据官方镜像文档说明,总结并按照一下要求完成下面任务

  1. 挂载/home/angindem/mysql/data到容器内的/var/lib/mysql目录

  2. 挂载/home/angindem/mysql/init到容器内的/docker-entrypoint-initdb.d目录

  3. 挂载/home/angindem/mysql/conf到容器内的/etc/mysql/conf.d目录

在这里我们根据内容要求对应 -v 操作就可以了,下面是该任务的答案

第一步:创建对应的本地挂载目录
1
cd /home/angindem && mkdir mysql && cd mysql && mkdir data conf init
第二步:将配置文件以及初始化sql脚本放到我们对应的挂载目录中

配置 angindem.cnf 文件命令:

1
echo -e "[client]\ndefault_character_set=utf8mb4\n\n[mysql]\ndefault_character_set=utf8mb4\n\n[mysqld]\nbind-address = 0.0.0.0\ncharacter_set_server=utf8mb4\ncollation_server=utf8mb4_unicode_ci\ninit_connect='SET NAMES utf8mb4'" > angindem.cnf

初始化的 sql 脚本,根据自己的具体情况来放置到 init 目录中,这里我放置我自己的。

第三步:创建并运行指定挂载docker命令
1
docker run -d  --name mysql3  -p 3318:3306   -e TZ=Asia/Shanghai  -e MYSQL_ROOT_PASSWORD=123456 -v /home/angindem/mysql/data:/var/lib/mysql -v /home/angindem/mysql/init:/docker-entrypoint-initdb.d -v /home/angindem/mysql/conf:/etc/mysql/conf.d  mysql

运行创建成功后,我们查看data目录可以发现,docker容器成功映射,并且初始化脚本blog也存在

1
cd /home/angindem/mysql/data && ls

自定义镜像

Docker 自定义镜像是容器化应用的关键。通过本文,你应该大概的了解了如何创建、构建、运行和分享 Docker 镜像。

在这里自定义镜像不仅可以帮助你在不同环境之间轻松迁移应用,还可以确保应用的一致性和可重复性。

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

根据构建 Java 镜像,我们可以了解到 关于 docker 的三种结构。

docker的三种结构:

  • 入口(Entrypoint):镜像运行入口,一般是程序启动的脚本和参数

  • 层(Layer):添加安装包、依赖、配置等,每次操作都形成新的一层。

  • 基础镜像(Baselmage):应用依赖的系统函数库、环境、配置、文件等

创建 Dockerfile

创建自定义镜像的第一步是编写 Dockerfile。Dockerfile 是一个包含用于构建镜像的指令的文本文件。其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:

指令 说明 示例
FROM 指定基础镜像
FROM ubuntu:20.04
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

更新详细语法说明,参考官网文档: Dockerfile reference | Docker Docs

我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#指定基础镜像
FROM ubuntu:20.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=SPATH:SJAVA HOME/bin

#入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]

也可以直接基于JDK为基础镜像,省略前面的步骤:

1
2
3
4
5
6
7
8
9
10
11
12
# 基础镜像
FROM openjdk:11.0-jre-buster

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

# 拷贝jar包
COPY docker-demo,jar /app.jar

#入口
ENTRYPOINT ["java","-jar","/app.jar"]

构建镜像

当编写好了Dockerfile,可以利用下面命令来构建镜像:

1
docker build -t myImages:1.0 .
  • -t:是给镜像起名

  • 格式依然是 repository:tag  的格式,不指定tag时,默认为 latest

  • ( . ) :是指定Dockerfile所在目录,如果就在当前目录则指定为 “./“

例子

这里引用我们之前 Java文件上传删除相关模块(上传到物理存储)-CSDN博客 文件上传模块案例。

Dockerfile文件

1
2
3
4
5
6
7
8
9
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY angindem.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

构建命令

1
docker build -t angindem .

效果:

无报错情况。查看镜像发现自定义镜像构建成功。

运行容器。

1
docker run -d --name angindem -p 9898:9898 -v ./images:/images angindem

测试访问。

部署成功!!!!

docker网络

我们创建docker容器的时候,未指定docker网络设置,默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上,这个虚拟网络名为 docker0 ,使用虚拟网桥分配的IP,当我们重新创建的时候,IP发生变动,我们负责服务docker容器互联相关指定IP的容器就会有可能产生故障。

所以这里我们引用到了 docker自定义网络。

自定义docker网络

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

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

使用示例:

创建一个自定义网络 angindemNet

1
docker network create angindemNet

创建容器同时指定自定义 docker 网络

1
docker run -d --name angindem -p 9898:9898 -v ./images:/images --network angindemNet angindem

查看创建的容器网桥

1
docker inspect angindem 

当我们创建容器同时指定自定义网络,创建的容器不会连接默认的网桥网络。

应用实例:

尝试前后端分离部署,还是引用我们之前 Java文件上传删除相关模块 文件上传模块案例。

后端部署:

1
docker run -d --name angindemBack -p 9898:9898 -v ./images:/images --network angindemNet angindemback

后端服务启动成功。

前端部署:

这里通过官网 https://hub.docker.com/_/nginx ,查看nginx容器部署说明可以知道。

1
$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
1
$ docker run --name my-custom-nginx-container -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx

nginx.conf 和 前端html 的挂载目录位置在哪里。

运行一下命令部署我们的前端:

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

访问部署成功!!!

测试项目运行

前后端分别部署成功!!!

DockerCompose

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

docker-compose编写语法

通过对比我们创建的容器以及 docker-compose.yml 的语法部署容器可以查找对应的规律。

创建mysql容器语法

1
2
3
4
5
6
7
8
9
10
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
--network angindem
mysql

docker-compose.yml 相对应的语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/data:/var/lib/mysql"
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- angindem

按照这样的规律相对应即可根据我们的需求进行设置快速部署项目

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
45
46
47
48
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: # 这里表示容器使用哪一个 docker 容器网络
- angindem-net
angindem:
# build: 这段语法表示 寻找 Dockerfile 文件随后进行创建容器镜像
build:
context: .
dockerfile: Dockerfile
container_name: angindem
ports:
- "8080:8080"
networks:
- angindem-net
# depends_on: 这段语法表示 依赖于哪一个服务,随后会先创建依赖的服务容器在创建自身服务容器
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- angindem
networks:
- angindem-net

networks:
# networks: 这段语法表示 创建 docker 容器网络
angindem-net:
name: angindem

docker-compose 命令

格式:

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

觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭

微信二维码

wechat pay

支付宝二维码

ali pay

Docker 笔记
http://blog.angindem.cn/2025/03/28/Angindem-CSDN博客/167_167/
作者
Angindem
发布于
2025年3月28日
许可协议