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
状态
留言