一、Docker镜像与Docker容器介绍
Docker 镜像是一个只读的模板,它包含了运行某个应用程序所需的所有文件、依赖库、环境变量和配置。你可以将镜像看作是一个应用程序的“打包版本”,它可以在任何支持 Docker 的环境中运行。
Docker 容器是 Docker 镜像的运行实例。你可以将容器看作是一个轻量级的、独立的、可执行的软件包,它包含了运行某个应用程序所需的所有内容。容器与宿主机共享操作系统内核,但具有独立的文件系统、网络和进程空间。
它两之间的关系:
1. 镜像是静态的,类似于“类”或“模板”;容器是动态的,类似于“对象”或“实例”。
2. 你可以从一个镜像创建多个容器,每个容器都是独立的运行实例。
3. 镜像是容器的基础,容器是镜像的运行表现。
二、镜像相关命令
1. 查看镜像
docker images
REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像ID
CREATED:镜像的创建日期
SIZE:镜像大小
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下
2. 拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
NAME:镜像名称(例如 nginx、redis)。
TAG:镜像标签(例如 latest、1.23.1)。如果未指定标签,默认使用 latest。
DIGEST:镜像的唯一标识符(哈希值),用于精确指定某个版本的镜像。
常用选项(OPTIONS)
--all-tags 或 -a:下载镜像的所有标签(版本)
--quiet 或 -q:静默模式,仅显示镜像 ID。
docker pull nginx
默认下载 nginx:latest 镜像
3. 搜索镜像
docker search 镜像名称
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价,反应一个镜像的受欢迎程度
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
4. 删除镜像
docker rmi 镜像ID
三、容器相关命令
1. 查看当前正在运行的容器
docker ps
2. 查看所有容器(包括已停止的)
docker ps -a
3. 停止容器
docker stop 容器名称(或者容器ID)
4. 启动容器
docker start 容器名称(或者容器ID)
5. 重启单个容器
docker restart (容器名称或容器ID)
6. 重启多个容器
docker restart <容器1名称或ID> <容器2名称或ID> <容器3名称或ID>
7. 重启所有正在运行的容器
docker restart $(docker ps -q)
8.容器的创建与启动
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
OPTIONS:这是可选的,用于指定容器的配置。
IMAGE[:TAG]:这是你想要运行的 Docker 镜像的名称和标签(如果不指定标签,则默认为 latest)。
COMMAND:这是容器启动时默认执行的命令。如果未指定,则使用镜像的默认命令。
ARG...:传递给 COMMAND 的参数
常用选项(OPTIONS):
-d 或 --detach:在后台运行容器。
-i 或 --interactive:保持容器的标准输入开放。通常与 -t 一起使用。
-t 或 --tty:分配一个伪终端。通常与 -i 一起使用。容器启动后会进入其命令行。
-p 或 --publish:发布容器的一个或多个端口到主机,格式为 <hostPort>:<containerPort>。前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
-v 或 --volume:挂载卷到容器中,格式为 <hostPath>:<containerPath>(前者是宿主机目录,后者是映射到宿主机上的目录)。可以使用多个-v做多个目录或文
件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-e 或 --env:设置环境变量。
--rm:容器退出时自动清理容器文件系统。
--network:指定容器的网络模式,例如 bridge, host, none 等。
--restart:设置容器的重启策略,例如 no, on-failure, always 等。
--name:为容器指定一个名称。
例如创建并运行redis容器:
docker run -d --name myredis -p 6379:6379 redis --requirepass 123456
--name myredis 设置容器名称
-p 6379:6379 指定端口映射关系
redis 镜像名称
--requirepass 123456 设置密码,然后被传递给 Redis 服务器,作为其启动参数之一
9. 进入容器内部
进入容器内部 并在其中启动一个 Bash shell
docker exec -it 容器名称 (或者容器ID) /bin/bash
如果容器中没有 Bash shell,你也可以使用 sh
docker exec -it 容器名称 (或者容器ID) /bin/sh
10. 目录挂载
docker run -v <宿主机目录>:<容器目录> [其他选项] IMAGE[:TAG] [COMMAND]
<宿主机目录>:宿主机上的目录路径。
<容器目录>:容器内的目录路径,宿主机目录的内容将映射到该目录。
IMAGE[:TAG]:使用的 Docker 镜像名称和标签。
[COMMAND]:容器启动时执行的命令(可选)
docker run -v /home/user/data:/app/data mydata
挂载目录,涉及到权限问题。
将宿主机目录挂载为只读模式
docker run -v /home/user/data:/app/data:ro mydata
例如几个常用的挂职目录的场景:
1. 挂载 Nginx 的配置文件
将宿主机的 /home/user/nginx.conf 挂载到容器的 /etc/nginx/nginx.conf,并启动 Nginx 容器
docker run -d --name mynginx -v /home/user/nginx.conf:/etc/nginx/nginx.conf -p 80:80 nginx
-d:在后台运行容器。
--name mynginx:为容器指定名称。
-v /home/user/nginx.conf:/etc/nginx/nginx.conf:挂载配置文件。
-p 80:80:将宿主机的 80 端口映射到容器的 80 端口。
2. 挂载数据卷
将宿主机的 /home/user/app/data 目录挂载到容器的 /var/data/html,并启动一个 Web 应用容器
docker run -d --name myapp -v /home/user/app/data:/var/data/html -p 8080:80 mywebapp
-v /home/user/app/data:/var/data/html:挂载数据目录。
-p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口。
四、应用部署
1.Redis部署
拉取镜像
docker pull redis
启动
docker run -d --name myredis -p 6379:6379 redis --requirepass 123456
进入容器内部,连接redis
docker exec -it myredis bash
redis-cli -h 127.0.0.1 -p 6379 -a 123456
2. Nginx部署
拉取镜像
docker pull nginx
运行容器
docker run -d --name mynginx -p 80:80 nginx
浏览器访问
五、迁移与备份
将容器保存为镜像
docker commit 容器名称或容器ID 新镜像名称:标签
docker commit mynginx mynginx_i
镜像备份
docker save -o 导出文件名.tar 镜像名称:标签
docker save -o mynginx.tar mynginx_i
镜像恢复
docker load -i <导出文件名>.tar
docker load -i mynginx.tar
以上是docker镜像、docker容器的相关操作。