原文连接:Docker笔记
内置更多技术文章
Docker
1.认识与安装Docker
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的
Linux 机器上。
官网:https://www.docker.com
Docker安装:Docker安装
Docker架构
- Daemon:Docker守护进程,daemon主要功能包括镜像管理、镜像构建、
REST API
、身份验证、安全、核心网络以及编排。 - 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- **容器(Container):**镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
2.配置阿里镜像加速器
-
搜索阿里云并登录(网易云、腾讯云都类似)
-
在控制台找到“容器镜像服务>镜像加速器”
-
根据操作文档修改daemon配置文件
-
查看/etc/docker/daemon.json文件是否修改成功
3.Docker命令
Docker 进程相关命令
启动Docker服务:
systemctl start docker
停止Docker服务:
systemctl stop docker
重启Docker服务:
systemctl restart docker
查看Docker服务状态:
systemctl status docker
设置开机启动Docker服务:
systemctl enable docker
取消在CentOS 7上的Docker服务开机启动
systemctl disable docker
Docker 镜像相关命令
查看镜像
列出本地系统上已下载的Docker镜像。
docker images
docker images -q # 列出本地系统一下载的镜像ID
docker inspect mysql:5.7 # 查看镜像的更详细信息
这将显示镜像的名称、标签、镜像ID、大小和创建时间等信息。
搜索镜像
可以使用以下命令在Docker Hub上搜索镜像。
docker search <镜像名称>
例如,要搜索名为"ubuntu"的镜像:
docker search ubuntu
拉取镜像
使用以下命令从Docker Hub或其他镜像仓库拉取镜像。标签可以指定镜像的版本或变种。如果不指定标签,默认情况下会拉取 “latest” 标签的镜像。
docker pull <镜像名称>:<标签>
例如,要拉取官方的Ubuntu 20.04镜像:
docker pull ubuntu:20.04
一般我们要下载指定版本的镜像,但是我们并不知道版本是否存在,我们需要到Docker的官方网站去搜索
Docker官网:https://hub.docker.com/
删除镜像
删除本地系统上的Docker镜像。
docker rmi <镜像ID或名称>
docker rmi `docker images -q` #删除所有镜像
例如,要删除镜像ID为 abcdef123456
的镜像:
docker rmi abcdef123456
在删除镜像的时候可能会爆出一下的错误:
Error response from daemon: conflict: unable to delete 7614ae9453d1 (must be forced) - image is referenced in multiple repositories
问题复现:
我们先安装最新版的redis
docker pull redis
在安装6.2版本的redis
docker pull redis:6.2
此时我们来查看镜像列表
docker images
我们发现两个版本的ID居然一样,说明在当前时间6.2版本就是最新的版本,只能通过名字和版本进行删除。
docker rmi redis:latest
6.删除所有的镜像
docker rmi `docker images -q`
Docker 容器相关命令
当您在CentOS 7操作系统上使用Docker时,以下是一些常用的容器相关命令,包括查看、创建、进入、启动、停止、删除容器以及查看容器信息的命令:
查看容器
列出当前系统中运行的Docker容器。
docker ps
若要查看包括已停止容器在内的所有容器,可以使用 -a
选项:
docker ps -a
创建并启动容器
docker run 参数
参数说明:
- -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。当你使用这个选项时,可以像在命令行终端中一样与容器进行交互。
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
- -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
- -it:创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
- –name:为创建的容器命名。
创建一个Centos 7的容器,命名为ct01,
docker run -it --name ct01 centos:7 /bin/bash
创建并启动容器之后会进入容器的内部,此时的终端为容器分配的伪终端
启动创建守护式容器
docker run -id --name <容器名称>
使用-d创建的容器不会进入容器,只是将容器创建并运行。
例如创建并运行一个名称为ct02的容器
docker run -id --name ct02 centos:7
创建好之后会将容器的ID打印出来,但是不会进入容器的伪终端,此时界面还是停留在宿主机里面。我们查看正在运行的容器,发现及时没有进入终端,但是终端依旧是在运行的。
此时可以通过exec命令进入容器
docker exec -it ct02 /bin/bash
使用exit退出容器之后容器仍然在运行
退出容器
退出容器使用exit
命令
通过-it
参数创建的容器一旦使用exit
退出之后容器会自动关闭,但是-id不会
进入容器
进入正在运行的容器的交互式Shell会话。
docker exec -it <容器名称或ID> /bin/bash
其中/bin/bash
为要在容器中执行的命令,"Docker exec"命令需要至少两个参数来执行
例如,要进入名为 “ct02” 的容器:
docker exec -it ct02 /bin/bash
启动容器
启动停止状态的容器。
docker start <容器名称或ID>
例如启动容器名称为ct01的容器
docker start ct01
此时的ct01运行成功
停止容器
停止正在运行的容器。
docker stop <容器名称或ID>
例如停止ct02的容器
docker stop st02
删除容器
删除不再需要的容器。
docker rm <容器名称或ID>
注意开启的容器不能删除
例如删除ct02
docker rm ct02
查看容器信息
获取关于特定容器的详细信息,包括IP地址、端口映射等。
docker inspect <容器名称或ID>
例如查看ct01容器的详细信息:
docker inspect ct01
4.容器的数据卷
什么是数据卷
数据卷(Data Volumes)是一种用于在容器和宿主机之间共享和持久化数据的重要概念。数据卷允许你在容器中存储数据,并且这些数据可以在容器之间共享,甚至在容器被删除后仍然保留在宿主机上。
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
数据卷的作用:
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
个人理解相当于Vue应用中的pinia或者Vuex,两个组件的数据并不互通,但是可以将数据保存在pinia里面,一个组件修改pinia的状态之后另一个组件的数据也跟着改变。一个组件的删除不影响pinia里面保存的state,实现了数据持久化。
配置数据卷
配置Docker数据卷通常涉及使用 -v
或 --volume
选项来在容器和主机之间创建卷的绑定。
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
注意:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
例如:
下面的命令创建了一个名称为c3,镜像为contos7的容器,且将宿主机的目录和容器内的/root/data_container绑定成数据卷,实际上宿主机的/root/data一开始并不存在,挂在后会自动创建
docker run -it --name c3 -v /root/data:/root/data_container centos:7 /bin/bash
下面再容器的/root/data_container
文件夹下创建jvyou.txt
创建信息的会话,使用宿主机登录,检查宿主机的/root/data
目录
上面说明我们在容器里面创建的文件会同步到宿主机挂在的数据卷里面。
挂载多个数据卷
可以通过多次使用 -v
或 --volume
选项来挂载多个数据卷到Docker容器中。每个 -v
选项后面指定一个宿主机路径和一个容器路径,以实现多个数据卷的挂载。
# 挂载3个数据卷,其中`\`是命令换行的意思
docker run -it --name c4 \
-v /root/data/:/root/data_container \
-v /root/data1:/root/data1_container \
-v /root/data2:/root/data2_container \
centos:7
在上面当中c3和c4都挂载了
root/data
作为数据卷,其中一个容器或者宿主机修改里面的文件,其他的容器对应的文件也会同步修改,实现了不同的容器之间的数据通信。容器删除之后数据卷里面的数据仍然会保存,实现了数据的持久化。
数据卷容器
数据卷容器是一种用于管理和共享数据卷的特殊类型的Docker容器。它的主要目的是将数据从主要容器(应用程序容器)中分离出来,以实现数据的持久化和共享,从而提高容器化应用的可维护性和可扩展性。
首先,创建一个数据卷容器:
docker run -v /容器内路径 --name 数据卷容器名称 镜像名称 /bin/bash
# 创建一个容器,该容器的数据卷为容器内的`vdata`目录,docker会自动为c1容器在宿主机分配一个目录作为数据卷
docker run -it -v /vdata --name c1 centos:7
然后,创建一个主要应用程序容器,并挂载数据卷容器中的数据卷:
docker run -it --volumes-from 数据卷容器名称 --name 主要容器名称 镜像名称
docker run -it --volumes-from c1 --name c2 centos:7