docker镜像概述
什么是镜像
docker镜像是创建容器的模板,它封装了对应软件所需的一切,包括代码、运行环境和配置文件等。
镜像由多个文件系统层组成,这些层按顺序叠加再一起,形成了一个完整的文件系统。
一个典型的镜像通常包括以下几个层:
- 操作系统层:包含操作系统的基本文件和目录,例如
/dev、/proc、/bin、/etc等。不同的linux发行版在这一层目录结构可能会有所不同。 - 应用程序依赖层:包含应用程序极其运行所需的依赖库和文件
- 配置层:包含应用程序的配置文件或特定设置
一般镜像都比较小,官方提供的ubuntu镜像只有70MB,而rockylinux基础镜像也只有176MB左右,一些其他版本的镜像甚至只有几MB。
那是因为镜像是直接使用的宿主机的内核,而在镜像中只提供rootfs,也就是只需要包括最基本的命令,配置文件和程序库等相关文件就可以了,所以有些镜像的体积就会比较的小。
镜像能做什么
镜像是用来打包和分发应用程序,它可以帮助开发人员方便地构建、部署和管理软件应用。
具体来说,镜像可以帮助实现以下功能:
-
打包应用程序:镜像能够将应用程序及其依赖打包成一个可移植的文件,方便再不同的环境中运行。
-
管理应用程序:通过镜像可以统一管理应用及其依赖项,确保它们在不同环境中运行是一致的。
-
分发应用程序:通过镜像仓库,可以轻松的分发和共享应用程序。使得开发人员可以非常方便的获取和部署应用程序。
-
简化环境配置:镜像包含了运行应用所需的所有配置,从而有效的避免了因环境差异导致的问题。
docker镜像实践
| 命令 | 描述信息 |
|---|---|
| docker search | 搜索镜像 |
| docker pull | 下载镜像 |
| docker images | 查看镜像 |
| docker commit | 构建镜像 |
| docker save | 备份镜像 |
| docker load | 恢复镜像 |
| docker tag | 镜像标签 |
| docker push | 上传镜像 |
| docker rmi | 删除镜像 |
搜索docker镜像
在下载镜像之前,我们需要先使用docker search命令搜索远程仓库中共享的镜像是否存在我们需要的镜像,默认搜索dockerhub官方仓库中的镜像。
命令格式:docker search [options] {imagename}
1 docker search rockylinux # 搜索仓库中rockylinux相关的镜像
2 docker search centos # 搜索仓库中centos相关的镜像
3 docker search nginx # 搜索仓库中nginx相关的镜像
下载docker镜像
下面使用docker pull命令从仓库下载最新版本的centos镜像。
命令格式:docker pull [options] {imagename}:[tag]
如果不指定tag标签版本,默认latest为最新的镜像。
1 # 如果镜像已存在,命令会直接返回,否则会联网开始自动下载该镜像
2 docker pull rockylinux:9
3 # 获取第三方docker镜像仓库
4 docker pull index.tenxcloud.com/tenxcloud/httpd:latest
5 docker pull index.tenxcloud.com/tenxcloud/httpd:latest
查看docker镜像
使用docker images来查看本地所有已存在的镜像列表(包括:已下载的镜像、导入进来的镜像、自行通过dockerfile构建的镜像等)
命令格式:docker images [imagename]
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 16 months ago 13.3kB
centos 7 eeb6ee3f44bd 2 years ago 204MB
备份docker镜像
使用docker save命令保存当前镜像。
命令格式:docker save [options] imagename:imagetag > /path/imagename.tar.gz
- 查看本地镜像列表
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rockylinux 9 9cc24f05f309 9 months ago 176MB
hello-world latest d2c94e258dcb 16 months ago 13.3kB
centos 7 eeb6ee3f44bd 2 years ago 204MB
-
保存
rockylinux镜像到本地,打包为rockylinux.tar.gz
docker save rockylinux:9 > /opt/rockylinux_9.tar.gz -
查看对应镜像占用的磁盘大小
du -sh /opt/rockylinux_9.tar.gz
173M /opt/rockylinux_9.tar.gx
删除docker镜像
无用的镜像会占用大量的磁盘空间,因此可以使用docker rmi删除镜像。
命令格式:docker rmi [options] imagename [imagename...]
-
删除
hell-world镜像,正常删除后会打印删除的各层信息,-f代表强制
docker rmi hello-world -f -
批量删除镜像
docker rmi $(docker images | awk '{print $3}'}
注意:删除docker镜像的规范的步骤如下:
- 先使用
docker rm命令删除依赖该镜像的所有容器 - 然后使用
dockers rmi命令删除该镜像(如果不愿意删除容器,直接添加-f参数)
恢复docker镜像
使用docker load命令可将本地的镜像导入到docker中。
命令格式:docker load [options] container.tar.gz
-
使用
docker load命令导入镜像
docker load < /opt/rockylinux_9.tar.gz -
查看镜像是否导入成功
docker images
docker容器概述
什么是容器
容器是镜像运行时的实例。
启动一个容器就像启动了一台虚拟机,在这个容器上就可以运行应用程序。
从本质上说,一个容器就是一个运行的进程,只是加入了隔离机制,使其与其他容器隔离。
容器的相关操作
| 命令 | 描述信息 |
|---|---|
| docker run | 运行容器 |
| docker info、inspect、ps | 查看容器 |
| docker start、stop、restart、kill | 启停容器 |
| docker exec | 进入容器 |
| docker log/docker event | 获取容器日志、容器事件日志 |
启动docker容器
-
使用容器实现类似于虚拟机的功能,例如:创建一个新的
rockylinux操作环境
docker run -it rockylinux:9 /bin/bash -
docker run命令执行流程刨析- 1.
docker run表示启动一个新的容器。 - 2.
-it是打开容器的标准输入和输出 - 3.
rockylinux:9这里使用rockylinux:9作为容器启动的基础镜像 - 4.
/bin/bash容器启动时运行的命令,打开容器交互终端
总结:以rockylinux镜像作为基础镜像,启动一台容器,同时打开标准输入和输出,最后运行bash进程,使容器可交互。
- 1.
-
使用
rockylinux镜像创建并运行容器执行/bin/bash "hello",然后终止容器
docker run -it rockylinux:9 /bin/echo "hello"
hello
- 启动容器命名为
myrocky,操作命令如下:
docker run --name myrocky -it rockylinux:9 /bin/bash
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d82b00360d62 rockylinux:9 "/bin/bash" 28 seconds ago Up 27 seconds myrocky
- 启动后台运行容器通过
docker run -d参数
docker run --name test -itd rockylinux:9 /bin/bash
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1ed32e45c2f rockylinux:9 "/bin/bash" 13 seconds ago Up 12 seconds test
- 启动仅供测试容器,临时跑一个容器,容器退出会自动删除
docker run --rm -it rockylinux:9 /bin/bash -c "echo hehe && sleep 2"
查看docker容器
docker info用来查看运行容器状态及版本信息,包括容器运行数量、镜像数量、远程仓库地址、docker版本、使用的存储驱动等信息。
docker info
Containers: 2
Running: 1
Paused: 0
Stopped: 1
Images: 3
- 查看容器的状态,使用
docker ps命令查看当前主机容器状态以及运行容器的id号
docker ps # 查看正在运行的容器
docker ps -a # 查看所有启动过的容器
-
比如我们想查询单个容器的详细信息,通过
docker inspect命令可以查询:容器运行状态、存储位置、网络信息、配置参数、以及容器运行启动命名等。
docker inspect test -
docker logs命令查询当前运行容器的日志,其实就是查看容器的标准输出日志
docker logs -f test
进入docker容器
在实际的生产环境中,通常会将容器作为后台服务运行。
但在某些情况下,我们可能需要进入正在运行的容器进行调试或运维操作,同时又不能中断容器的服务。
这是就可以使用docker exec命令
docker exec -it test /bin/bash
启停docker容器
-
启动
docker容器
docker start d82b00360d62 -
停止
docker容器
docker stop d82b00360d62
docker kill d82b00360d62
-
删除
docker容器
docker rm d82b00360d62 -
批量删除
docker容器
docker rm $(docker ps -a -q)
暴露docker容器
容器默认运行在隔离的环境中,因此外部用户无法直接访问容器内的资源。
为了使外部用户能够访问容器中的应用程序,需要在创建容器时使用--publish参数来指定哪些端口应该对外开放。
这个过程实际上是在宿主机上添加了一条iptables dnat规则,这样即使容器本身是隔离的,用户也可以通过宿主机特定的端口访问到容器内的服务。
-p hostport:containerport-p hostip:hostport:containerport多个容器都想使用80端口-p hostip::containerport随机端口-P(大写) 随机端口
-
将宿主机的8080端口映射到容器的80端口
docker run -d -p 8080:80 nginx -
将宿主机的8080和8443映射到容器的80,443端口
docker run -itd -p 8880:80 -p 8443:443 nginx -
将宿主机的任意端口映射到容器的80端口
docker run -itd -P 80 nginx
容器制作为镜像
容器制作为镜像有两种方式:
- 手动构建镜像:其核心思想是启动一个容器,安装业务所需的服务,最后通过
docker commint封装为镜像 - 自动构建镜像:使用
dockerfile来实现
需求:使用rockylinux构建一个带有sshd服务的镜像,允许外部用户通过2222端口连接至该容器
- 创建一个容器在后台运行,然后进入该容器中
docker run -itd --name rocky rockylinux:9 /bin/bash
docker exec -it rocy /bin/bash
- 在容器中安装
sshd服务,然后修改默认root的登陆密码
yum install openssh-server openssh-clients -y
# ⽣成 SSH 服务器的密钥对的⼯具,确保后续能正常运⾏sshd服务
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
# 允许Root⽤户通过密码和密钥登录系统
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
echo "1" | passwd --stdin root
-
将容器提交为镜像,使用
commit指令实现
docker commit rocky rockylinux_ssh:v1 -
启动该镜像,执行
/usr/sbin/sshd -D使sshd服务能在前台一直运行
docker run -d -p 2222:22 rockylinux_ssh:v1 /usr/sbin/sshd -D
容器的生命周期
以运行一个rockylinux的容器为例:
- 1.
docker获取rockylinux的镜像,检查本地是否存在对应的镜像,存在则使用本地镜像,不存在则上默认仓库拉取。 - 2.
docker通过rockylinux镜像创建一个新容器,并在镜像的文件系统之上添加一层可读写层来运行应用程序。 - 3.
docker通过网桥设备的网络地址池分配可用的ip挂载至容器上 - 4.
docker执行容器的启动命令,比如/bin/bash表示启动一个和本地主机可交互的进程 - 5.执行完毕后容器就自动退出。当然也可以不终止容器,让业务一直处于前台
running状态
留言