Docker 安装
Docker下载
[root@docker ~]# yum install docker-ce docker-ce-cli containerd.io --allowerasing
docker-ce: Docker 的社区版。
docker-ce-cli: Docker 的命令行工具。
containerd.io: Docker 的容器运行时。
–allowerasing 选项允许 yum 删除当前安装的任何与 Docker 冲突的软件包,以便顺利安装这些组件。这个选项有助于解决依赖冲突问题
启动Docker
开启docker : systemctl start docker
查看docker状态 :systemctl status docker
停止:systemctl stop docker
重启: systemctl restart docker
docker开机自启: systemctl enable docker
[root@docker ~]# systemctl start docker #启动docker
[root@docker ~]# systemctl status docker #查看docker 运行状态
[root@docker ~]# systemctl enable docker #设置docker自启
查看安装的docker版本(启动docker后才能使用docker命令)
[root@docker ~]# docker -v
Docker 常用命令
搜索镜像:docker search 镜像名
[root@docker ~]# docker search centos
[!WARNING]
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务。设置镜像:
第一步:
vim /etc/docker/daemon.json
第二步:
{ “registry-mirrors”:[ “https://cr.console.aliyun.com”,“https://docker.m.daocloud.io”,“https://public.ecr.aws”,“https://dockerhub.timeweb.cloud”]
}
第三步(重启docker服务):systemctl restart docker
- 查询方式一【命令行】:
docker search register.liberx.info/镜像名
[root@docker ~]# docker search register.liberx.info/centos
查询方式二【浏览器搜索】:
https://register.liberx.info
拉取镜像:docker pull 镜像名:版本号
[root@docker ~]# docker pull centos
列出当前机器上的Docker镜像:docker images
。
[root@docker ~]# docker images
列名 | 描述 |
---|---|
REPOSITORY | 镜像所属的仓库名称 |
TAG | 与镜像相关联的标签。标签用于区分同一仓库中不同版本的镜像 |
IMAGE ID | 镜像的唯一标识符,通常表示为长十六进制字符串。此 ID 用于在其他 Docker 命令中引用该镜像。 |
CREATED | 镜像创建的日期和时间。这有助于识别镜像的年龄。 |
SIZE | 镜像在磁盘上的大小。这表示该镜像占用多少存储空间。 |
查看镜像/容器/数据卷所占系统空间:docker system df
- TYPE:对象的类型。可以是镜像(Images)、容器(Containers)、本地数据卷(Local Volumes)或构建缓存(Build Cache)。
- TOTAL:该类型对象的总数。
- ACTIVE:当前正在使用的对象数量。对于容器而言,这表示正在运行的容器数量。对于镜像,它可能表示被容器引用的镜像数量。
- SIZE:该类型对象占用的总磁盘空间。这是所有对象占用的磁盘空间总和,包括活动和非活动的对象。
- RECLAIMABLE:可回收的磁盘空间大小。这表示可以通过删除未使用或不再需要的对象来释放的磁盘空间。对于镜像,这可能包括未被任何容器引用的镜像;对于容器,这可能包括已停止且未被任何进程引用的容器。
删除镜像:docker rmi 镜像ID/镜像名
[!WARNING]
删除所有镜像:
docker rmi -f $(docker images -qa)
创建容器并启动新容器:docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
常用OPTIONS:
-d
,--detach
:在后台运行容器,并打印容器ID。这是运行长时间运行的服务时常用的选项。-i
,--interactive
:保持容器的标准输入(STDIN)开放。-t
,--tty
:分配一个伪终端(pseudo-TTY)。通常与-i
一起使用,以交互模式运行容器。--name
:为容器指定一个名称。如果不指定,Docker 会自动生成一个名称。
1.以交互模式运行 Ubuntu 容器:
2.以交互模式运行并创建名为 “myubuntu” 的容器:
3.在后台运行Redis容器
交互模式的两种退出方式
exit - 输入exit后容器退出并停止运行
ctrl+p+q(同时按住) - 容器退出,并在后台运行
Docker容器command
命令 | 说明 |
---|---|
docker start [容器ID或名称] | 启动一个或多个已经停止的Docker容器 |
docker stop [容器ID或名称] | 停止一个或多个正在运行的Docker容器。容器会收到SIGTERM信号,允许它优雅地关闭 |
docker restart [容器ID或名称] | 重启一个或多个Docker容器。这实际上是先执行docker stop 再执行docker start |
docker rm [容器ID或名称] | 删除一个或多个已经停止的Docker容器。正在运行的容器无法被删除 |
docker kill [容器ID或名称] | 强制停止一个或多个正在运行的Docker容器。容器会收到SIGKILL信号,立即终止 |
启动容器:docker start 容器名/ID
[root@docker ~]# docker start myubuntu
启动容器:docker stop 容器名/ID
[root@docker ~]# docker stop myubuntu
删除容器:docker rm 容器名/ID
[root@docker ~]# docker rm fervent_wilbur
杀掉容器(强制停止):docker kill 容器名/ID
[root@docker ~]# docker kill friendly_moser
显示所有当前活动的(即正在运行的)容器的信息:docker ps
docker ps
命令的常用选项和它们的功能:
-a
或--all
:显示所有容器(包括停止运行的容器)。-q
或--quiet
:仅显示容器ID。--no-trunc
:不截断输出信息,显示完整的容器ID、命令等信息。-l
:显示最近创建的1个容器。-n
:显示最近创建的n个容器。例如,docker ps -n 5
将显示最近的5个容器。
显示正在运行的容器信息
[root@docker ~]# docker ps # 显示正在运行的容器信息
显示所有容器信息
[root@docker ~]# docker ps -a # 显示正在运行的容器信息
仅显示所有容器的CONTAINER ID
[root@docker ~]# docker ps -qa # 显示所有容器的ID
显示最新创建的1个容器
[root@docker ~]# docker ps -l # 显示最新创建的1个容器
显示最新创建的n个容器
[root@docker ~]# docker ps -n 3 # 显示最新创建的3个容器
查看完整的容器ID
[root@docker ~]# docker ps --no-trunc # 查看当前运行的完整容器ID信息
查看容器运行日志docker logs 容器名/ID
[root@docker ~]# docker logs myubuntu
查看容器进程 docker top 容器名/ID
[root@docker ~]# docker top myubuntu
- UID: 用户ID,表示运行该进程的用户。
- PID: 进程ID,是容器内部为该进程分配的唯一标识符。
- PPID: 父进程ID,表示创建该进程的父进程的ID。
- C: CPU使用率,通常以百分比表示,但在这个上下文中它可能表示进程的CPU优先级或调度类
- STIME: 进程启动时间,表示进程开始运行的时间。
- TTY: 终端类型,表示进程关联的终端。
- TIME: CPU时间,表示进程自启动以来使用的CPU总时间。
- CMD: 命令,表示启动进程的命令行。
查看容器详细信息:docker inspect 容器名/ID
[root@docker ~]# docker inspect myubuntu
Id
:容器的唯一标识符(UUID)。Created
:容器的创建时间。Path
:容器启动时执行的命令。Args
:传递给命令的参数。State
:容器的状态,包括是否正在运行、退出码、开始和结束时间等。Image
:容器使用的镜像的详细信息。NetworkSettings
:容器的网络配置,包括 IP 地址、端口映射等。Mounts
:容器内的挂载点,包括卷、绑定挂载和临时文件系统挂载。Config
:容器的配置信息,如环境变量、工作目录、入口点等。HostConfig
:主机的配置信息,如资源限制、端口绑定、日志选项等。
进入容器attach/exec
docker attach 容器名/ID
[root@docker ~]# docker attach myubuntu
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
[root@docker ~]# docker exec -it myubuntu /bin/bash
复制容器内的文件到本地主机docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
CONTAINER
是目标容器的名称或 ID。SRC_PATH
是源路径,可以是宿主机上的文件或目录,也可以是容器内的文件或目录。DEST_PATH
是目标路径,与SRC_PATH
相对,表示文件或目录应该被复制到的位置。
[root@docker ~]# docker cp myubuntu:/a.txt /
使用 docker export
和 docker import
命令来备份和恢复容器。
备份容器
要备份一个正在运行的容器,您可以使用 docker export
命令。此命令会将容器的文件系统导出为一个 tar 归档文件。
docker export <container_id> -o <backup_file>.tar
<container_id>
: 您要备份的容器的 ID 或名称。<backup_file>.tar
: 您想要保存备份的文件名。
恢复容器
要从 tar 归档文件导入一个新的容器,您可以使用 docker import
命令。
cat <backup_file>.tar | docker import - <new_image_name>
<backup_file>.tar
: 您之前保存的备份文件名。<new_image_name>
: 您想为新镜像指定的名称。
如何在Docker容器安装工具
apt-get update
是一个常用的命令,用于更新 Debian 和 Ubuntu 系统中的包管理器的本地索引。
作用:更新本地软件包索引
当你运行 apt-get update
时,系统会从配置的源(例如 /etc/apt/sources.list
文件中列出的软件仓库)下载最新的软件包索引。这并不会安装或升级任何软件,只是刷新本地缓存,以确保系统知道最新的可用软件包及其版本信息。
apt-get install vim
和apt-get install net-tools
vim
:
- 基本功能:
vim
是一种文本编辑器,旨在创建和编辑文本文件。它是vi
编辑器的增强版,提供了更多的功能和改进。
net-tools
:
- 基本功能:
net-tools
是一个网络管理工具包,包含了一系列命令行工具,用于网络配置和管理。
docker commit
命令用于将容器的当前状态保存为一个新的镜像。
可以用来在容器中进行更改后,将这些更改持久化。基本用法如下:
docker commit [OPTIONS] <container_id> <new_image_name>
<container_id>
: 要提交的容器 ID 或名称。<new_image_name>
: 为新镜像指定的名称(可以包含标签)。
选项示例
-
-m
:添加提交消息。 -
-a
:指定作者信息。docker commit -m="with vim" -a="tzj" myubuntu my_ubuntu:1.0
配置阿里云公有镜像库
https://cr.console.aliyun.com/cn-hangzhou/instances
配置本地私有镜像库
1.第一步 : 拉取registry
Docker Registry 的作用是集中管理和存储 Docker 镜像,便于开发者和运维人员分享和分发应用程序。它支持版本控制和镜像管理,确保在不同环境中一致性和可复现性。
2.第二步:搭建Docker 容器
docker run -d -p 5000:5000 --name=registry registry
docker run
: 运行一个 Docker 容器。
-d
: 以分离模式运行容器(即后台运行)。
-p 5000:5000
: 将主机的 5000 端口映射到容器内的 5000 端口,允许你通过主机的 5000 端口访问容器中的注册表。
--name=registry
: 给容器指定名称为 “registry”。
registry
: 指定使用官方的 registry
镜像,运行一个 Docker 镜像仓库服务。
curl -XGET http://192.168.10.150:5000/v2/_catalog
curl
命令用于获取 Docker 私有仓库中的镜像列表。具体解释如下:
curl
: 用于向指定的 URL 发出 HTTP 请求的工具。-XGET
: 指定使用 HTTP GET 方法来获取信息。http://192.168.10.150:5000/v2/_catalog
: 这是请求的 URL,访问的是一个运行在192.168.10.150
的 Docker 私有仓库。/v2/_catalog
是 Docker Registry API 的一个端点,用于返回该仓库中所有可用镜像的目录。
执行该命令后,服务器将返回仓库中的 Docker 镜像列表。
由于Docker同服库做了安全加固,默认不支持http推送,需要取消这个限制
vim /etc/docker/daemon.json
3.重启docker生效配置
容器数据卷的方式实现数据的持久化
假设你想以特权模式运行一个容器,并将宿主机上的某个目录挂载到容器内的某个目录,语法如下:
docker run -it --privileged=true -v /path/on/host:/path/in/container image_name
示例解释:
-v /path/on/host:/path/in/container
: 将宿主机上的/path/on/host
目录挂载到容器内的/path/in/container
目录。这使得宿主机目录和容器内目录保持同步。image_name
: 这是你要运行的 Docker 镜像的名称,如ubuntu
、centos
等。
示例:
显示了 Docker 容器中有关挂载点的配置信息
[root@docker host_data]# docker inspect 8224a5066b17
Type: "bind"
表示这是一个绑定挂载,将宿主机的某个目录直接挂载到容器内的某个目录。
Source: /tmp/host_data
表示宿主机上的目录路径,这个目录将被挂载到容器中。
Destination: /tmp/container_data
表示容器内的挂载点路径,宿主机的 /tmp/host_data
目录内容将映射到容器中的 /tmp/container_data
。
RW: true
表示这个挂载
容器实例内部被限制,只能读取不能写
docker run -it --privileged=true -v /path/on/host:/path/in/container:ro image_name
ro
表示目录以只读模式挂载。
功能
:容器内的应用程序可以读取该目录中的文件,但无法对其进行任何修改或写入。
作用
:常用于保护主机系统的数据,确保容器不会意外或故意更改主机上的文件。
容器卷之间的继承
- 语法如下:
docker run -it --privileged=true --volumes-from parent_container_name --name new_container_name image_name
--privileged=true
: 给予容器提升的权限,允许其访问宿主机的设备和一些特权操作。
--volumes-from parent_container_name
: 从名为 parent_container_name
的父容器中继承卷。这意味着新的容器将能够访问父容器中挂载的所有卷。
--name new_container_name
: 为新容器指定一个名称。
image_name
: 要使用的 Docker 镜像的名称。
- 此时myu1,myu3已经和物理机(宿主机)建立起映射
[!NOTE]
docker run -P -p
区别、作用
docker run -P
作用:自动将容器中暴露的所有端口映射到主机上的随机端口。
用法:使用
-P
时,Docker 会为每个暴露的端口选择一个随机
的主机端口。可以使用docker ps
查看容器的映射情况。
docker run -p
作用:手动指定容器的特定端口和主机端口之间的映射。
用法:格式为
-p host_port:container_port
,允许用户控制容器端口如何映射到主机端口。示例:
docker run -p 8080:80 image_name
这将把容器的 80 端口映射到主机的 8080 端口。
Tomcat 安装
新版访问会有问题
Tomcat 在安装后,如果登录端口出现 404 错误,通常是因为以下原因:
- webapps 目录问题:Tomcat 默认会在
webapps
目录下查找应用。如果这个目录不存在或未正确设置,Tomcat 无法找到默认的应用。 - webapps.dist:
webapps.dist
是 Tomcat 的默认应用示例,如果你将其重命名为webapps
,Tomcat 就会把它当作应用目录来处理。这样可以确保 Tomcat 启动时能找到必要的资源。 - 未部署应用:如果
webapps
目录为空,Tomcat 可能没有任何应用可用,导致访问时返回 404 错误。确保在webapps
目录中有至少一个有效的 web 应用(如ROOT
或其他 WAR 文件)。 - 配置问题:检查
server.xml
和其他配置文件,确保端口和上下文路径配置正确。
解决方法一般是确保 webapps
目录存在且有相应的应用文件,或者调整配置文件以指向正确的应用路径。
Exercise - 安装MySQL
step1:拉取指定版本镜像
docker pull mysql:5.7
step2:运行容器设置密码
[root@docker ~]# docker run -itd --name=TZJ_MySQL -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
使用本地Navicat工具连接Docker容器的mysql
发现不识别中文,查看字符集
character_set_database
character_set_server
被设为 latin1
,这是导致中文乱码的原因。
解决方案
在 my.cnf
下修改字符集配置的目的是为了确保 MySQL 的默认字符集和排序规则一致地支持 UTF-8 或 UTF-8MB4
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
删除原有容器
重启容器,加载配置信息
是导致中文乱码的原因。
解决方案
在 my.cnf
下修改字符集配置的目的是为了确保 MySQL 的默认字符集和排序规则一致地支持 UTF-8 或 UTF-8MB4
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
删除原有容器
重启容器,加载配置信息
完美散花,期待之后的Docker高阶操作
结语:
很高兴看到你在技术路上的不断进步!愿你在每一次的操作中都能发掘出新的乐趣。Docker 的世界广阔无垠,每一个小小的命令都隐藏着无限的可能。技术的深度如同大海,愿我们在这片海洋中,一起前行,互相指正,彼此学习。期待我们未来能共同解锁更多的技术奥秘,写下更多精彩的篇章。
愿代码如诗,未来如歌,继续加油,期待你更多精彩的分享! 🌿
– A杰