1 容器管理概述
Docker 的容器管理可以通过 Docker CLI 命令行工具来完成。Docker 提供了丰富的命令,用于管理容器的创建、启动、停止、删除、暂停、恢复等操作。
以下是一些常用的 Docker 容器命令:
1、docker run:用于创建并启动一个容器。使用 docker run 命令时,可以指定容器名称、镜像名称、启动命令、挂载数据卷、网络配置等,以满足不同使用需求。
2、docker start/stop/restart:用于启动/停止/重启一个已经创建的容器。
3、docker rm:用于删除一个或多个容器。可以使用 docker rm -f 命令强制删除正在运行的容器。
4、docker pause/ unpause:用于暂停/恢复一个容器。
5、docker stats:用于查看正在运行的容器的资源使用情况。
6、docker inspect:用于查看容器信息。
7、docker exec:用于在正在运行的容器中执行命令。
8、docker cp:用于从宿主机拷贝文件到容器中,或者从容器中拷贝文件到宿主机。
2 创建容器
docker run 命令是 Docker 最重要的命令之一,用于创建并启动一个新的 Docker 容器。
docker run 命令首先在指定的镜像上创建一个可写的容器层,然后使用指定的命令启动它。也就是说,docker run 相当于 API /containers/create 然后 /containers/(id)/start。
下面是 docker run 命令的主要语法:
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
其中:
- IMAGE:指定要使用的 Docker 镜像的名称或 ID
- TAG:指定要使用的镜像的标签,默认为 latest
- DIGEST:指定要使用的镜像的数字摘要
- COMMAND:覆盖容器默认的启动命令
- ARG:覆盖容器默认的启动命令的参数
OPTIONS 包含多种参数和选项,可用于指定容器运行时的各种属性和配置,常用的参数和选项有:
- -d, --detach:在后台运行容器
- -it:在容器内部启动一个交互式终端
- -p, --publish:将容器的端口发布到主机的端口
- -v, --volume:将主机的目录或文件挂载到容器的目录
- --name:指定容器的名称
- -h, --hostname:可指定容器的主机名
- -e, --env:该选项可将环境变量传递给容器,例如配置数据库密码等
3 创建和删除容器示例
启动一个tomcat容器,在后台运行,并查看本机中正在运行的容器:
docker run -d tomcat
停止容器:
docker stop ff89 # 容器名称/ID
此时docker ps无法查询到容器信息。可以使用docker ps -a查看包含已停止容器在内的全部容器信息。
可以使用docker rm命令删除一个已停止的容器:
4 进入容器的方法
容器是一个相对隔离的运行管径,就像住宅中的一个房间,进入容器就是进入这个容器的运行环境。
Docker提供了多种进入容器的方法:
1、docker exec 命令:可以在运行中的容器中启动一个新进程。这种方式对于多个用户协作进行调试非常方便,也不需要停止容器,推荐使用这种方式。
2、docker attach 命令:可以连接到后台运行的容器的标准输入、输出、错误流。attach命令可能导致docker容器意外关闭,不推荐使用。
3、docker run 命令:可以在创建一个新的容器时启动交互终端,但是退出交互终端默认会关闭容器,需要使用特殊的命令退出才行。
5 网络端口映射
Docker的网络端口映射是将宿主机的一个端口映射到Docker容器的一个端口,此时宿主机的这个端口就可以访问容器中运行的应用程序了。
Docker的端口映射有两种方式:随机端口映射和固定端口映射。
1、随机端口映射:在启动容器时可以使用-P命令配置随机端口映射,Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口。
docker run -d -P tomcat # 使用-P命令需要镜像支持
2、固定端口映射:可以在启动容器时指定宿主机端口映射到容器的端口。
docker run -d -p 8080:80 tomcat
其中 -p 参数代表端口映射,冒号前面的数字表示宿主机端口号,冒号后面的数字表示容器端口号。
Docker 的端口映射可以方便地在宿主机上访问容器内的应用程序,是 Docker 中非常实用的网络功能之一。
6 进入容器和网络端口映射示例
本示例启动一个tomcat容器,并实现外部对该tomcat服务器的访问。
首先,启动一个tomcat容器,将容器的8080端口绑定到宿主机的8080端口。
docker run --name some-tomcat -d -p 8080:8080 tomcat
Tomcat镜像默认将欢迎页面等资源放在内部的webapps.dist文件夹中,无法被用户直接访问,需要手动进行修改。
进入some-tomcat容器。
docker exec -it some-tomcat /bin/bash
在容器中,将webapps.dist文件夹下的全部内容复制到webapps文件夹下。
cp -r webapps.dist/* webapps/
然后,退出容器。
exit
接下来,需要开放主机的8080端口,在本机使用浏览器访问主机的8080端口,查看能否看到Tomcat服务器的首页。
7 数据卷的管理
Docker容器卷是一种用于在Docker容器和主机之间共享数据的机制。它们可以将主机文件系统的目录或文件夹挂载到容器的特定路径中,以便容器可以访问这些文件和目录。
Docker容器卷可以通过以下方式进行管理:
1、创建卷:可以使用docker volume create命令创建一个卷,并指定名称和其他选项。例如:docker volume create my-volume可以创建名为my-volume的空卷。
2、挂载卷:可以使用-v选项将主机文件夹或卷挂载到容器中。例如:docker run -v /host/folder:/container/folder my-image可以将主机上的/host/folder目录挂载到容器中的/container/folder路径。
3、查看卷:可以使用docker volume ls命令列出所有当前可用的卷,也可以使用docker volume inspect命令获取有关特定卷的详细信息。
4、删除卷:可以使用docker volume rm命令删除特定的卷。例如:docker volume rm my-volume可以删除名为my-volume的卷。请注意,您不能删除当前正在使用的卷,必须首先从所有容器中卸载卷。
5、自动删除卷:如果需要,您可以创建自动删除的卷。这些卷将在其中没有容器使用它们的情况下自动删除。要创建这些卷,您可以使用docker run命令的--rm选项或在docker create命令中指定--rm选项。
8 数据卷示例
本示例演示两种较为常见的使用卷的方法:
1、启动容器时创建挂载卷
2、先创建卷后挂载
接下来演示启动容器时创建挂载卷。
首先,关闭并删除之前创建的Tomcat容器。
然后,使用如下命令创建Tomcat容器,并将宿主机的/opt/html文件夹挂载到Tomcat容器的/usr/local/tomcat/webapps/ROOT文件夹。
docker run --name some-tomcat -d -p 8080:8080 -v /opt/html:/usr/local/tomcat/webapps/ROOT tomcat
接下来,在宿主机的/opt/html文件夹下新建mypage.html。
echo 'Hello Docker!' > /opt/html/mypage.html
使用curl命令访问宿主机的8080端口,查看能否访问到mypage.html中的内容。
接下来演示先创建卷后挂载。
首先,关闭并删除之前创建的Tomcat容器。
然后,创建卷:
docker volume create demo-vo # demo-vo是卷的名称
查看卷列表:
docker volume ls
查看卷详细信息:
docker volume inspect demo-vo
可以看到实际的存储位置:
使用卷创建容器:
docker run -d -p 8080:8080 -v demo-vo:/usr/local/tomcat/webapps/ROOT tomcat
创建测试mypage.html:
echo 'Hello' > /var/lib/docker/volumes/demo-vo/_data/mypage.html
测试:
curl localhost:8080/mypage.html
9 将容器保存为镜像
在 Docker 中,将容器保存为镜像是非常有用的功能。这允许用户将现有的容器转换为可重用的镜像,进行分发、共享和部署。
Docker commit命令用于将一个正在运行的容器保存为一个新的镜像。它会记录容器中的当前状态并创建一个增量镜像层,新的镜像将包含原容器中的所有修改。Docker commit 命令的语法如下:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS: 可选参数。常见参数如下:
- -a, --author: 镜像作者
- -c, --change: 指定容器创建时的修改项
- -m, --message: 提交镜像时的提交消息
- -p, --pause: 在提交时暂停容器运行
CONTAINER: 必需,容器的名称或 ID。
REPOSITORY: 镜像仓库名称。
TAG: 镜像版本号。
10 容器保存为镜像示例
本示例演示创建一个安装了JDK8的rockylinux镜像。
首先,拉取rockylinux镜像:
docker pull rockylinux:9.0
然后,基于镜像启动容器:
docker run -it rockylinux:9.0 /bin/bash
在容器中使用yum命令安装JDK8:
yum install -y java-17-openjdk-devel
exit离开容器。
使用commit命令创建本地镜像:
docker commit 6906 rockylinux-java17 # 其中3a38是容器的简写id
查看本地镜像:
docker images
使用新镜像创建容器,并在容器中执行java -version命令:
docker run rockylinux-java17 java -version