没有理想的人不伤心

Docker 从入门到上天

2025/05/15
2
0

image.png

Docker 快捷命令

镜像:相当于类

容器:相当于对象,即镜像的实例

  1. 创建并运行一个新容器:docker run

docker run -it container_name /bin/bash 运行容器,并进入容器的终端交互界面

  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
  • -d:不进入容器的交互界面,只在后台运行

使用exitCTRL D退出容器交互界面

  1. 查看容器状态:

docker ps查看正在运行的容器

docker ps -a查看所有容器的状态

  1. 停止容器:docker stop
  2. 开启停止的容器:docker start container_ID
  3. 重启容器:docker restart container_ID
  4. 进入启动了的容器:docker attach container_ID

使用这个命令进入容器,退出容器后会使容器关机,而使用 docker exec 不会

  1. docker exec -it container_ID /bin/bash

Docker 命令

Docker 服务相关

Linux 中,与 docker daemon 有关(守护进程)

1731314782591-ae29c5ed-6d8f-474c-a832-e6d8ab8c31a6.png

Docker 镜像相关

与本地相关:

查看本地镜像:docker images

-q 参数查看所有本地镜像的 ID

删除本地镜像:docker rmi 镜像 ID/镜像名:版本号

删除所有本地镜像的快捷操作:docker rmidocker image -q``

与远程相关:

搜索远程仓库是否有对应镜像:docker search 镜像名

从远程仓库拉取镜像:docker pull 镜像名:版本号

版本号到官方 docker 网站上找hub.docker.com

1731315671577-7bf18daa-868c-4501-b1bc-36c2a06758e6.png

Docker 容器相关

  • 创建并运行容器

docker run -it --name=容器名 镜像名 /bin/bash

-i :保持容器一直运行

-t :给容器分配终端,exit 直接会关闭容器

-d :使容器后台运行,且 exit 操作也不会关闭容器,需要用docker exec进入容器执行命令

-it 创建的容器称为交互式容器,-id 创建的容器称为守护式容器

  • (当容器运行在后台时)进入容器:

docker exec -it 容器名 /bin/bash

  • 查看容器

docker ps:正在运行的容器

-a 参数,所有容器

  • 关闭(停止)容器

docker stop 容器名/ID

  • 启动(已有)容器

docker start 容器名/ID

  • 移除容器

docker rm 容器名/ID

移除所有容器:docker rmdocker ps -aq``

正在运行的容器不能被移除

  • 查看容器信息

docker inspect 容器名/ID

1731322169734-6b768788-22bb-45a4-bed6-9858a5a39897.png

容器的数据卷

数据卷:是宿主机中的一个文件或目录。当挂载到容器中的目录后,数据卷中的内容和容器该目录下的内容相同,且两者同时变化

一个数据卷可以被多个容器同时挂载

一个容器也可以挂载多个数据卷

数据卷的作用:

  1. 容器数据持久化
  2. 宿主机与容器的间接通信
  3. 容器之间的数据交换

数据卷的配置

在创建启动容器时,可以通过-v 参数设置挂载数据卷

docker run ... -v 宿主机目录/文件:容器内目录或文件 [-v...]...

必须写绝对路径

目录不存在则会自动创建

可以挂载多个数据卷

数据卷容器

要实现多容器之间的数据交换,可以通过以下方式:

  1. 多个容器挂载同一个目录
  2. 使用数据卷容器

数据卷容器的配置:

1731323676149-24bd6abc-6285-4686-8eed-d7483e449877.png

创建数据卷容器不用指定宿主机目录

普通容器绑定数据卷容器后,就算数据卷容器被删除,仍可与宿主机目录交换数据

应用部署

  1. mysql

1731324204724-418aaaca-0da2-43f1-bf8b-27da3055b15b.png

1731324905253-50837d7a-bdd3-495d-b0e3-8a1f9bb1fb93.png

docker run -id \
-p 3306:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWS/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6

-p :端口映射

-e MYSQL_ROOT_PASSWORD :固定参数,配置 mysql 的密码

mysql 挂载的目录:配置文件、日志目录、数据信息

即使容器被删除,数据等信息已经被持久化到本地

如何实现容器与外部机器的通信——端口映射

以 mysql 为例

容器和宿主机可以直接通信,容器和外部机器不能直接通信,但是外部机器可以和宿主机通信

因此可以将容器的 3306 端口映射到宿主机的任一没有被占用的端口,外部机器访问宿主机的该端口,就可以实现与容器的通信

在创建运行容器时,使用-p 参数进行端口映射

docker run ... -p 宿主机端口:容器端口 ...

Docker 镜像的原理

1731326295954-000ce831-7119-4b44-b38a-6087e4926013.png

1731325964390-af897259-c69d-4298-89b3-6e8de66599df.png

拉取镜像时就可以观察到,不同镜像下载的文件不同,一层一层的下载

docker inspect 镜像名:版本号可以查看镜像的信息,最底下就显示的每层的文件内容

1731326241150-2a1f5364-8d7d-4672-b934-16fe0e7c5aa3.png

1731326113803-ac9744bd-66ca-4250-9eec-0162fa675a56.png

Dockerfile

docker 镜像如何制作:

  1. 将容器转换为镜像传递

docker commit 容器名/id 镜像名:版本号

docker save -o 压缩文件名.tar 镜像名:版本号

docker load -i 压缩文件名

将容器转换(docker commit)为镜像后,镜像不能传递,因此要先打包压缩(docker save

解压压缩文件为镜像 (docker load

通过挂载访问的文件在转换为镜像时会被忽略

  1. Dockerfile

1731327071869-7c200ff6-8e9d-446a-8a46-78263df64572.png

Dockerfile 的编写可以参考hub.docker.com任意镜像的任意版本号,

1731327411114-7b8c4b07-3ce5-4f96-a5d8-baf2b115c1e1.png

Dockerfile 关键字

1731327564758-5209fa36-7d26-4a5f-8031-8f5d8dbff56c.png

1731327628097-f9984c86-5839-4daf-be49-f02dbf280e3f.png

使用 Dockerfile 构建镜像

docker build -f dockerfile 的文件路径 -t 镜像名:版本

Docker Compose

docker compose 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建、启动和停止

使用步骤:

  1. Dockerfile 定义运行环境镜像
  2. 使用 docker-compose.yml 定义组成应用的各服务
  3. 运行 docker-compose up 来启动应用

Docker 私有仓库

私有仓库(本地仓库)搭建

1731331226564-e76065f0-ef2b-4cc3-ba18-0b416015a141.png

私有仓库其实就是一个容器 registry

将镜像传到私有仓库

1731331333959-a0faada5-bdac-4853-8b53-b4af3a7505aa.png

tag 相当于 git 中的 add,标记一下和存到暂存区类似

从私有仓库拉取镜像

1731331683444-2e3a5ade-84dc-4b53-b41b-78f7ec70b788.png

Docker 与虚拟机

1731331825407-ca273759-d1da-434e-a9b7-7a329be2bdd3.png

1731332000624-7b40c4af-cb2f-459b-bda8-6d8df66491fa.png

容器的底层操作系统内核使用的是宿主机的操作系统,因此在 Linux 主机上不能启动 windows 的容器

由于 windows 上有 wsl2、hyper-V 的虚拟化技术,因此在 windows 上也可以启动 Linux 容器