docker镜像和容器

docker

docker是什么

Docker 是一种容器化技术,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后可以在任何支持Docker的机器上运行,Docker 容器与虚拟机类似,但是更加轻量级,因为它们不需要虚拟化整个操作系统,而是共享宿主机的操作系统内核,使用容器来隔离进程。

Docker核心组件包括五种:

1.docker客户端

2.docker客户端

3.docker镜像

4.docker容器

5.registry(仓库)

其中docker镜像,docker容器,registry最为重要

docker镜像:类似于虚拟机的快照,是一个只读模板,用来创建容器
docker容器:是镜像的运行实例,可以被启动、停止、删除等。容器之间相互隔离
registry仓库:是存放Docker镜像的仓库,Registry分私有和公有两种

公有仓库:最大的公有仓库是官方提供的Docker Hub,其中存放着数量庞大的镜像供用户下载。国内

如:腾讯云、阿里云也提供了仓库的本地源,可以提供稳定的国内访问。

私有仓库:用户不希望公开分享镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私

有仓库

docker的架构:

Docker使用了C/S体系架构,Docker客户端与Docker守护进程通信,Docker守护

进程负责构建,运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上

运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程

使用REST API通过UNIX套接字或网络接口进行通信。

docker的优势:
1.环境一致性:Docker 容器确保应用在开发、测试和生产环境中运行一致
2.隔离性:每个容器都在各自独立的环境中运行,不会相互干扰,提高了安全性和稳定性。
3.快速部署和启动:容器启动速度极快,通常只需几秒钟,而传统虚拟机则需要几分钟
4.资源更高效,容器共享主机系统的内核,不需要额外的操作系统开销,因此比虚拟机更加轻量,占用资源更少
5.资源高效:容器共享主机系统的内核,不需要额外的操作系统开销,因此比虚拟机更加轻量,占用资源更少
6.版本控制和组件复用:Docker 镜像可以版本化管理,方便回滚和共享,同时可以基于现有镜像构建新镜像,促进复用。

如何部署docker

Docker官方提供2个版本,一个是Docker企业版Docker-EE,另外一个则是社区版Docker-CE。

Docker-CE由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用。Docker-EE收费版

本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计。相比Docker-EE,增加一些额外

功能,更重要的是提供了更安全的保障。通常情况下,Docker-CE足以满足我们的需求。


在部署docker前,需要关闭防火墙和selinux

yum源使用阿里源

复制代码
[root@docker yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker yum.repos.d]# yum install epel-release -y

然后安装系统工具

复制代码
yum install -y yum-utils

添加软件源的信息

复制代码
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker

复制代码
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

开启docker服务

复制代码
service docker start

安装完成后,可以给docker配置一个镜像加速器

复制代码
[root@docker ~]# vim /etc/docker/daemon.json、
{ 
 "registry-mirrors": [ "https://docker.m.daocloud.io",  "https://dockerproxy.com", 
"https://docker.mirrors.ustc.edu.cn", 
 "https://docker.nju.edu.cn"
]
}

[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl restart docker

至此docker部署完成,我们可以通过docker version查看docker的版本信息

复制代码
[root@docker ~]# docker version 
Client: Docker Engine - Community
 Version:           26.1.4
 API version:       1.45
 Go version:        go1.21.11
 Git commit:        5650f9b
 Built:             Wed Jun  5 11:32:04 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.1.4
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       de5c9cf
  Built:            Wed Jun  5 11:31:02 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.33
  GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Docker镜像

Docker镜像是Docker容器的基础,它包含了运行应用程序所需的一切:代码、运行时、库、环境变量和配置文件。我们可以将Docker镜像视为一个轻量级、独立的、可执行的软件包,包括运行它所需的一切,用户甚至可以直接从网上下载一个已经做好的应用镜像,并直 接使用。

当运行容器时,使用的镜像如果在本地中不存在,Docker就会自动从Docker镜像仓库中下载,默认

是从 Docker Hub公共镜像源下载,也可以通过其他的公共仓库中下载,或者自己创建镜像

docker镜像的相关操作

docker images 可以列出本地主机上的镜像
复制代码
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    41f689c20910   6 weeks ago   192MB

REPOSITORY:表示镜像的仓库源

TAG:镜像的标签

IMAGE ID:镜像ID

CREATED:镜像创建时间

SIZE:镜像大小

docker pull 可以下载镜像,当我们在本地主机上使用一个不存在的镜像时,Docker就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull命令来下载
复制代码
[root@docker ~]# docker pull nginx
docker tag可以添加镜像的标签
复制代码
[root@docker ~]# docker tag nginx:latest mynginx:latest
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mynginx      latest    41f689c20910   6 weeks ago   192MB
nginx        latest    41f689c20910   6 weeks ago   192MB

他们是同一个镜像,只是名字不同,相当于别名

docker hostory 可以查看镜像构建的历史,在使用镜像时一定要看,如果没有构建历史说明镜像是不安全的,如果使用可能会中病毒
复制代码
[root@docker ~]# docker history nginx
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
41f689c20910   6 weeks ago   CMD ["nginx" "-g" "daemon off;"]                0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   STOPSIGNAL SIGQUIT                              0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   ENTRYPOINT ["/docker-entrypoint.sh"]            0B        buildkit.dockerfile.v0
<missing>      6 weeks ago   COPY 30-tune-worker-processes.sh /docker-ent...   4.62kB    buildkit.dockerfile.v0
<missing>      6 weeks ago   COPY 20-envsubst-on-templates.sh /docker-ent...   3.02kB    buildkit.dockerfile.v0
<missing>      6 weeks ago   COPY 15-local-resolvers.envsh /docker-entryp...   389B 
docker rmi 可以删除镜像
复制代码
[root@docker ~]# docker rmi mynginx:latest 
Untagged: mynginx:latest
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    41f689c20910   6 weeks ago   192MB

如果有多条镜像想要删除,可以一条一条删除,也可以直接删除镜像id,但如果有额外的标签,则不能直接删除,需要加 -f 强制删除

复制代码
[root@docker ~]# docker rmi 41f689c20910
Error response from daemon: conflict: unable to delete 41f689c20910 (must be forced) - image is referenced in multiple repositories
[root@docker ~]# docker rmi 41f689c20910 -f
Untagged: mynginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:d5f28ef21aabddd098f3dbc21fe5b7a7d7a184720bc07da0b6c9b9820e97f25e
Deleted: sha256:41f689c209100e6cadf3ce7fdd02035e90dbd1d586716bf8fc6ea55c365b2d81
Deleted: sha256:6d03e4aefb16ea9e0d73cacb9a9fcb8f7fb3a806c41606600cab179aa381550f
Deleted: sha256:0951af45805a90677b83c3e3ae0ff7c1d6114b796206381914d1976df19d5af7
Deleted: sha256:dfa09858601e1678c6300924eeb880cbe0070bd41b3cc1bd8245f39104f1c8d7
Deleted: sha256:0502b463a609459d9b7bbd8044fd58e77f4309818da8841029dbf638a3a1581e
Deleted: sha256:39ffa72f273801580dbcd954e125f78fd5bb430896c32ab303667c5bbf154f39
Deleted: sha256:e57750b7e7ad7cb2436b3e9d3aafa338e89ee68f50d7e63bc09af37166ebc68e
Deleted: sha256:36f5f951f60a9fa1d51878e76fc16ba7b752f4d464a21b758a8ac88f0992c488
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
docker image prune 使用docker一段时间后,系统可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通

过docker image prune命令来进行清理。

复制代码
[root@docker ~]# docker image prune -f
Total reclaimed space: 0B
docker image save将一个镜像导出到一个压缩包中,便于在其他主机上运行
复制代码
[root@docker ~]# docker image save nginx > mynginx.tar.gz
[root@docker ~]# ls
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  mynginx.tar.gz  Public     Videos
Desktop          Downloads  Music                 Pictures        Templates
docker image load导入我们需要的镜像压缩包
复制代码
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@docker ~]# docker image load -i mynginx.tar.gz 
36f5f951f60a: Loading layer  77.89MB/77.89MB
c855abf10cdc: Loading layer  118.6MB/118.6MB
8e7d6b511078: Loading layer  3.584kB/3.584kB
50da593f6222: Loading layer  4.608kB/4.608kB
72fa904a482c: Loading layer   2.56kB/2.56kB
7d95a4a72e11: Loading layer   5.12kB/5.12kB
3ce214e9ebc5: Loading layer  7.168kB/7.168kB
Loaded image: nginx:latest
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    41f689c20910   6 weeks ago   192MB
docker image inspect 可以查看镜像的详细信息
复制代码
[root@docker ~]# docker image inspect nginx:latest 
[
    {
        "Id": "sha256:41f689c209100e6cadf3ce7fdd02035e90dbd1d586716bf8fc6ea55c365b2d81",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2025-08-13T16:34:01Z",
        "DockerVersion": "",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false

Docker容器

容器是镜像的一个运行实例。可以从同一个镜像创建多个容器,它们之间是相互隔离的。容器可以被启动、停止、删除,并且每个容器都有自己的文件系统、网络配置和进程空间。

容器的生命周期包括以下几个状态:

  • 创建(created)
  • 运行(running)
  • 停止(stopped)
  • 删除(deleted

管理容器常用的命令

create 可以创建容器,创建后可以通过docker ps 或者docker ps -a查看
复制代码
[root@docker ~]# docker create -it nginx
6359a8fb6ea5b2a21afee81182d0318f90279a0e62ff2fac8ba2e64acc979dbc
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS    PORTS     NAMES
6359a8fb6ea5   nginx     "/docker-entrypoint...."   11 seconds ago   Created             gracious_davinci

ps只能看到正在允许的容器,ps -a可以看到所有的容器

-i: 让容器的标准输入保持打开。

-t: 分配一个伪终端并绑定到容器的标准输入上。

start 可以启动容器
复制代码
[root@docker ~]# docker start 6359a8fb6ea5
6359a8fb6ea5
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
6359a8fb6ea5   nginx     "/docker-entrypoint...."   2 minutes ago   Up 3 seconds   80/tcp    gracious_davinci
stop 可以终止一个容器的运行
复制代码
[root@docker ~]# docker stop 6359a8fb6ea5
6359a8fb6ea5
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                     PORTS     NAMES
6359a8fb6ea5   nginx     "/docker-entrypoint...."   4 minutes ago   Exited (0) 6 seconds ago             gracious_davinci
docker pause 命令来暂停一个运行中的容器,暂停可以用ps看见,而stop只能用ps -a来看
复制代码
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                   PORTS     NAMES
6359a8fb6ea5   nginx     "/docker-entrypoint...."   11 minutes ago   Up 30 seconds (Paused)   80/tcp    gracious_davinci
除了创建容器后通过start命令来启动,也可以直接新建并启动容器。所需要的命令主要为docker run,等价于先 执行docker create命令,再执行docker start命令。下面的命令启动一个bash终端,运行用户进行交互
复制代码
[root@docker ~]# docker run -it nginx /bin/bash
root@8366db785a48:/# ls
bin   dev		   docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc			 lib   media  opt  root  sbin  sys  usr
root@8366db785a48:/# exit
exit
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                  PORTS     NAMES
6359a8fb6ea5   nginx     "/docker-entrypoint...."   17 minutes ago   Up 6 minutes (Paused)   80/tcp    gracious_davinci
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
8366db785a48   nginx     "/docker-entrypoint...."   38 seconds ago   Exited (0) 21 seconds ago             cranky_dijkstra
6359a8fb6ea5   nginx     "/docker-entrypoint...."   17 minutes ago   Up 7 minutes (Paused)       80/tcp    gracious_davinci

使用-it运行后,会直接进入交互,如果退出容器,则会直接终止容器的运行,我们可以使用-d参数使容器在后台运行而不进行交互

复制代码
[root@docker ~]# docker run -itd httpd /bin/bash
790d8d106417cf4ba52a13cfa3127ed9ed06cbc5ea2bdd23c3897d03ffdaecdf
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                  PORTS     NAMES
790d8d106417   httpd     "/bin/bash"              6 seconds ago    Up 5 seconds            80/tcp    silly_bohr
6359a8fb6ea5   nginx     "/docker-entrypoint...."   20 minutes ago   Up 9 minutes (Paused)   80/tcp    gracious_davinci
attach可以进入容器,但是我们一般不用,因为使用attach进入容器后,退出容器会导致容器停止
exec 我们还可以使用exec命令进入容器,这样退出容器后容器不会停止
复制代码
[root@docker ~]# docker exec -it httpd /bin/bash
Error response from daemon: No such container: httpd
[root@docker ~]# docker exec -it silly_bohr /bin/bash
root@790d8d106417:/usr/local/apache2# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs	modules
root@790d8d106417:/usr/local/apache2#

可以使用rm命令删除容器,但是只能删除停止的容器

复制代码
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                     PORTS     NAMES
790d8d106417   httpd     "/bin/bash"              6 minutes ago    Up 6 minutes               80/tcp    silly_bohr
8366db785a48   nginx     "/docker-entrypoint...."   9 minutes ago    Exited (0) 9 minutes ago             cranky_dijkstra
6359a8fb6ea5   nginx     "/docker-entrypoint...."   26 minutes ago   Up 15 minutes (Paused)     80/tcp    gracious_davinci
[root@docker ~]# docker rm 8366db785a48
8366db785a48
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                   PORTS     NAMES
790d8d106417   httpd     "/bin/bash"              7 minutes ago    Up 7 minutes             80/tcp    silly_bohr
6359a8fb6ea5   nginx     "/docker-entrypoint...."   27 minutes ago   Up 16 minutes (Paused)   80/tcp    gracious_davinci
[root@docker ~]# docker rm 6359a8fb6ea5
Error response from daemon: cannot remove container "/gracious_davinci": container is paused and must be unpaused first

可以看到,只能删除用stop停止的容器,而不能删除被暂停的容器

如果要直接删除,需要加 -f

复制代码
[root@docker ~]# docker rm 6359a8fb6ea5 -f
6359a8fb6ea5
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
790d8d106417   httpd     "/bin/bash"   8 minutes ago   Up 8 minutes   80/tcp    silly_bohr
使用 --name可以给容器命名,如果不用则会随机命名
复制代码
[root@docker ~]# docker run -itd --name httpd httpd /bin/bash
16634626c58506766bcbbed0a92f0faadc5ed0296b9b2d15dc50d5557c7a2625
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
16634626c585   httpd     "/bin/bash"   7 seconds ago    Up 6 seconds    80/tcp    httpd
790d8d106417   httpd     "/bin/bash"   13 minutes ago   Up 13 minutes   80/tcp silly_bohr
导入和导出容器

export可以导出容器,export可以导入

导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker

export命令。"-o"选项也可以重定向">"来代替

复制代码
[root@docker ~]# docker export > httpd.tar.gz 16634626c585
[root@docker ~]# ls
anaconda-ks.cfg  httpd.tar.gz          Pictures
Desktop          initial-setup-ks.cfg  Public
Documents        Music                 Templates
Downloads        mynginx.tar.gz        Videos

导入容器,导出的文件又可以使用docker import命令导入变成镜像。

复制代码
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    41f689c20910   6 weeks ago   192MB
[root@docker ~]# docker import httpd.tar.gz myhttpd
sha256:e0120625b3920f7c4fc1979778028c7e53e41fb76e60bf4efe7f3dcde01709a9
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
myhttpd      latest    e0120625b392   4 seconds ago   115MB
nginx        latest    41f689c20910   6 weeks ago     192MB

导出容器是把容器导出到一个文件,然后导入则会使文件变成镜像


容器的端口映射和目录映射

端口映射是指将容器的端口映射到宿主机的端口上,这样我们访问宿主机的端口就相当于访问容器的端口,目录映射也是同理

-P是映射随机端口

-p是手动选择端口

复制代码
[root@docker ~]# docker run --name nginx -itd -p 8080:80 nginx:latest 
35fa5db066af11f8c6f2f51a320f522dd1454f5b37c13e1cbd115e1a778960ec

手动选择先本地后容器,目录映射同理

复制代码
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                   NAMES
35fa5db066af   nginx:latest   "/docker-entrypoint...."   48 seconds ago   Up 48 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   nginx

访问8080端口测试

目录的映射

我们可以在宿主机上创建目录,然后将容器的相关配置文件映射到宿主机的目录上,这样就只需要在宿主机的目录里面修改配置文件

创建用于存放映射数据的目录

复制代码
[root@docker ~]# mkdir -p ~/nginx/www
[root@docker ~]# mkdir -p ~/nginx/logs
[root@docker ~]# mkdir -p ~/nginx/conf

将nginx的默认配置文件复制到宿主机目录

复制代码
[root@docker ~]# docker cp 35fa5db066af:/etc/nginx/nginx.conf ~/nginx/conf
Successfully copied 2.56kB to /root/nginx/conf
[root@docker conf]# ls
nginx.conf

[root@docker ~]# docker run -itd -p 8081:80 --name nginx3 -v ~/nginx/www:/usr/share/nginx/html -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/logs:/var/log/nginx nginx:latest
1e9a584aa165f8b2ee81f93f9823223f8038f092a61dff13da39692eef1d634d
相关推荐
johnny2332 小时前
Docker Desktop实战、问题记录
docker
安当加密4 小时前
如何安全地在 Kubernetes 中管理凭据?——基于 SMS 凭据管理系统的实践探索
安全·容器·kubernetes
bestcxx12 小时前
(二十六)、Kuboard 部署网络问题 &k8s 使用本地镜像 & k8s使用 register本地镜像站 综合应用
网络·容器·kubernetes
Lin_Aries_042116 小时前
容器化 Flask 应用程序
linux·后端·python·docker·容器·flask
Lin_Aries_042118 小时前
通过配置 GitLab 自动触发项目自动化构建与部署
运维·docker·容器·自动化·云计算·gitlab
尘埃不入你眼眸18 小时前
Docker操作命令
运维·docker·容器
数智顾问21 小时前
开源的容器化平台:Docker入门与核心概念解析
docker
liweiweili1261 天前
K8S中关于容器对外提供服务网络类型
容器·kubernetes
云游1 天前
Zabbix7.4.8(三):通过Zabbix agent 2监控Docker相关指标
docker·容器·zabbix