Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何影响。
Docker的优势包括快速部署、跨平台兼容、资源隔离、易于管理和扩展等。
Docker由三个主要组件组成:Docker引擎、Docker镜像和Docker容器。
Docker引擎是运行和管理容器的核心组件,
Docker镜像是应用程序和其依赖项的打包格式,
Docker容器是基于镜像运行的实例。
- 容器是一种轻量级的虚拟化技术,它提供了隔离的运行环境,使应用程序可以在不同的环境中以相同的方式运行。
- 创建容器可以使用Docker命令行工具或Docker API。容器的启动可以基于现有的镜像,也可以通过编写Dockerfile来定义自定义镜像。
- Docker提供了一系列命令和API来管理和监控容器,包括启动、停止、重启、查看日志、查看状态等操作。
- 镜像是Docker容器的基础,它包含了运行应用程序所需的所有文件、依赖项和配置。
- 镜像可以通过Dockerfile来定义和构建,Dockerfile是一个文本文件,用于描述如何构建镜像。
- Docker镜像可以通过Docker命令行工具或Docker Registry来管理和分享。Docker Registry是一个集中存储和分发镜像的仓库。
- Docker在各种场景中都有广泛的应用,包括开发环境搭建、持续集成和部署、微服务架构等。
- Docker可以提供一致的开发和测试环境,简化了开发者之间的协作和应用的部署。
- 在CI/CD中,Docker可以用于构建和打包应用程序,以及自动化测试和部署。
- 在微服务架构中,Docker可以帮助实现服务的隔离、部署和扩展。
启动docker
systemctl start docker
关闭docker
systemctl stop docker
重启docker
systemctl restart docker
docker设置随服务启动而自启动
systemctl enable docker
查看docker运行状态
systemctl status docker
查看docker版本号信息
docker version
docker info
ocker 帮助命令
忘记了某些命令便可使用此进行查看与回顾
docker --help
比如 咱忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用
docker pull --help
查看镜像列表
docker images
搜索镜像
docker search 镜像名
docker search --filter=STARS=9000 mysql
搜索 STARS >9000的 mysql 镜像
拉取镜像
不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本
docker pull 镜像名
docker pull 镜像名:tag
运行镜像
docker run 镜像名
docker run 镜像名:Tag
删除镜像
1.删除一个
docker rmi -f 镜像名/镜像ID
2.删除多个 其镜像ID或镜像用用空格隔开即可
docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
3.删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID
docker rmi -f $(docker images -aq)
4.删除镜像
docker image rm 镜像名称/镜像ID
1.查看正在运行容器列表
docker ps
2.查看所有容器 ---包含正在运行和已停止的
docker ps -a
3.运行一个容器
-it 表示 与容器进行交互式启动
-d 表示可后台运行容器 (守护式运行)
--name 给要运行的容器 起的名字
/bin/bash 交互路径
docker run -it --name 要取的别名 镜像名:Tag /bin/bash
例如我们要启动一个redis 把它的别名取为redis001 并交互式运行 需要的命令 —我这里指定版本号为5.0.5
#1.拉取redis镜像
docker pull redis:5.0.5
#2.命令启动
docker run -it --name redis001 redis:5.0.5 /bin/bash
4.停止容器
docker stop 容器名/容器ID
5.删除容器
#删除一个容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)
6.容器端口与服务器端口映射
命令:
-p 宿主机端口:容器端口 (注意是小写的p)
-P 宿主机随机端口:容器端口 (注意是大写P)
-p 9090:80 解析 将容器内部的 80端口与docker 宿主机(docker装在哪太服务器 那台服务器 )9090端口进行映射 那通过外部访问宿主机9090端口 即可访问到 docker 容器 80端口了
docker run -d --name nginx01 -p 9090:80 nginx
docker run -d --name nginx02 -p 9091:80 nginx
在Docker中, -p 和 -P 是用于映射容器端口到主机端口的两个选项。它们之间的区别如下:
1. -p 选项:这个选项用于映射指定的容器端口到主机的指定端口。例如,使用 -p 8080:80 将容器的80端口映射到主机的8080端口。你可以指定容器和主机的端口号。
2. -P 选项:这个选项用于自动将容器的所有暴露的端口映射到主机的随机端口。Docker会自动分配一个主机端口,并将容器端口映射到该主机端口上。类似 docker -p :80
你可以使用 docker port
命令来查看容器的映射端口。
总结来说, -p 选项允许你手动指定容器和主机的端口映射关系,而 -P 选项则是自动将容器的所有暴露的端口映射到主机的随机端口上。
7.进入容器
这里咱就进入 前面的 nginx1 容器
docker exec -it 容器名/容器ID /bin/bash
进入 前面的 nginx容器
docker exec -it nginx01 /bin/bash
8.退出容器
从容器内 退出到自己服务器中 需注意 两个退出命令的区别
#直接退出 未添加 -d(持久化运行容器) 时 执行此参数 容器会被关闭
exit
# 优雅提出 --- 无论是否添加-d 参数 执行此命令容器都不会被关闭
Ctrl + p + q
9.容器文件拷贝
docker cp 命令用于在容器和本地文件系统之间复制文件/文件夹。
#从主机上拷贝文件到容器内
docker cp 1.txt mycontainer:/1.txt
#从容器里面拷贝文件/目录到本地一个路径
docker cp 容器名称或id:/container_path to_path
例如:docker cp tomcat:usr/local/tomcat/README.md ./
10.查看容器日志
docker logs -f --tail=要查看末尾多少行 默认all 容器ID
12.容器自动重启
使用docker run命令时 添加参数--restart=always
便表示,该容器随docker服务启动而自动启动
docker run -d -p 8888:6379 --restart=always --name redis002 nginx:latest/bin/bash
13.数据挂载
简单来讲,就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!
命令:
-v 宿主机文件存储位置:容器内文件位置
如此操作,就将 容器内指定文件挂载到了宿主机对应位置,-v命令可以多次使用,即一个容器可以同时挂载多个文件
-v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置
Redis示例:
docker run -p 6300:6379 --name redis01 --restart=always -v /home/208/redis/redis.conf:/etc/redis/redis.conf -v /home/208/redis/data:/data -d redis redis-server /etc/redis/redis.conf
FROM openjdk:8
#设置工作目录
WORKDIR /app
#复制应用程序文件到容器中
COPY target/wms-app-0.0.1-SNAPSHOT.jar app.jar
# 设置环境变量
ENV JAVA_HOME=/usr/local/openjdk-11
ENV PATH=$PATH:$JAVA_HOME/bin
#暴漏端口
EXPOSE 8080
#设置启动命令
ENTRYPOINT ["java","-jar","app.jar"]
这个示例Dockerfile的功能是构建一个基于OpenJDK 11镜像的Docker镜像。它的构建过程包括以下步骤:
1. 使用 FROM 指令指定基础镜像,这里使用的是OpenJDK 11镜像。
2. 使用 WORKDIR 指令设置工作目录为 /app ,后续的操作都在这个目录下进行。
3. 使用 COPY 指令将当前目录下的所有文件复制到容器的 /app 目录下。
4. 使用 ENV 指令设置环境变量,这里是设置Java的安装路径和将Java可执行文件路径添加到系统PATH中。
5. 使用 RUN 指令在容器中执行命令,这里是使用javac编译App.java文件。
6. 使用 CMD 指令在容器启动时执行命令,这里是执行Java应用程序。
通过以上步骤,我们可以使用该Dockerfile构建一个包含Java应用程序的镜像,并在容器启动时执行Java应用程序。
3.构建镜像
当你有了上述的Dockerfile文件后,你可以使用 docker build 命令来构建Docker镜像。以下是使用 docker build 命令的示例:
1. 首先,打开终端并进入包含Dockerfile的目录。
2. 运行以下命令来构建镜像:
docker build -t myapp:v1 .
解释:
-t myapp:v1 :指定构建的镜像名称为 myapp:v1 ,你可以自定义镜像名称。
. :表示Dockerfile所在的当前目录。
3. Docker引擎将会根据Dockerfile的指令和参数开始构建镜像。它会执行每个指令,并在构建过程中显示相应的输出信息。
4. 构建完成后,你可以使用 docker images 命令来查看构建好的镜像列表:
docker images
4. CMD 与 ENTRYPOINT 区别
在Dockerfile中, CMD 和 ENTRYPOINT 都是用于定义容器启动时要执行的命令或脚本。它们之间有一些区别:
CMD 指令:
- CMD 指令用于设置容器启动时要执行的默认命令。它可以有多种形式:
- CMD ["executable","param1","param2"] :使用JSON数组格式,推荐使用这种形式。
- CMD command param1 param2 :使用命令格式,不推荐使用这种形式。
- 如果在运行镜像时指定了要运行的命令,那么 CMD 指令将被覆盖。 docker run app206:v1 /bin/bash
- CMD 指令可以被Dockerfile中的多个 CMD 指令覆盖,但只有最后一个 CMD 指令会生效。
ENTRYPOINT 指令:
- ENTRYPOINT 指令类似于 CMD ,用于设置容器启动时要执行的命令。它也可以有多种形式:
- ENTRYPOINT ["executable","param1","param2"] :使用JSON数组格式,推荐使用这种形式。
- ENTRYPOINT command param1 param2 :使用命令格式,不推荐使用这种形式。
- 与 CMD 不同的是, ENTRYPOINT 指令的参数不会被覆盖。如果在构建镜像时指定了要运行的命令,它将作为参数传递给 ENTRYPOINT 指令。
- ENTRYPOINT 指令的参数可以通过 CMD 指令进行覆盖,这样可以在运行容器时动态地修改执行的命令。
综上所述, CMD 指令用于设置默认的容器启动命令,而 ENTRYPOINT 指令用于设置始终执行的命令。 ENTRYPOINT 指令更适合用于定义容器的主要执行逻辑,而 CMD 指令则更适合用于提供默认参数或允许在运行容器时动态修改命令。
Docker Compose是一个用于定义和运行多个Docker容器的工具。它使用YAML文件来定义应用程序的服务、网络和卷等配置,然后使用单个命令即可启动、停止和管理整个应用程序的多个容器。
使用Docker Compose的简要步骤如下:
1. 创建一个YAML文件(通常命名为 docker-compose.yml ),用于定义应用程序的服务、网络和卷等配置。
2. 在YAML文件中定义服务,包括容器的镜像、端口映射、环境变量、依赖关系等。
3. 运行 docker-compose up 命令,Docker Compose将根据YAML文件中的配置启动和管理容器。
4. 使用 docker-compose down 命令停止和删除由Compose创建的容器。
yum install docker-compose
以下是一个简单的Docker Compose示例:
version: '3'
services:
web:
image: nginx:latest
ports:
- 3888:80
volumes:
- ./nginxhtml:/usr/share/nginx/html
db:
image: mysql:latest
ports:
- 3999:3306
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=mydb
volumes:
- ./mysqldata:/var/lib/mysql
在这个示例中,我们定义了两个服务: web 和 db 。
web 服务使用了 nginx:latest 镜像,并将主机的3888端口映射到容器的80端口。还定义了一个卷,将主机的 ./nginxhtml 目录映射到容器的 /usr/share/nginx/html 目录。
db 服务使用了 mysql:latest 镜像,并设置了两个环境变量 MYSQL_ROOT_PASSWORD 和 MYSQL_DATABASE 。还定义了一个卷,将主机的 ./mysqldata 目录映射到容器的 /var/lib/mysql 目录。
通过运行 docker-compose up
命令,Docker Compose将启动这两个容器,并根据定义的配置进行设置。这样,我们就可以同时运行和管理这两个容器,它们可以相互通信和交互。