当前位置: 首页 > news >正文

Docker——安装配置与使用

文章目录

  • 前言
  • Docker详解
    • Docker简介
    • docker和传统虚拟机区别
    • Docker架构
  • Docker安装
    • 检查系统信息
    • 更新依赖
    • 导入 Docker 官方密钥
    • 添加 Docker 源
    • 安装 Docker
    • 启动并加入开机启动
    • 配置国内镜像加速
    • 测试启动状态
  • Docker 镜像指令
    • 镜像搜索
    • 拉取镜像
    • 查看本地镜像
    • 删除本地镜像
  • Docker 容器指令
    • 启动容器
    • 查看容器信息
    • 停止容器
    • 强制停止容器
    • 启动已停止的容器
    • 查看指定容器所有信息
    • 查看容器日志
    • 查看容器里的进程
    • 宿主机与容器之间互相拷贝文件
    • 进入指定容器
    • 容器内安装vim、ping、ifconfig等指令
    • 删除容器
  • Docker 挂载PV
    • 什么是 PV 挂载
    • 以Mysql为例
      • 1、创建宿主机持久化目录(执行一次)
      • 2、启动Mysql容器指令调整
      • 3、验证是否挂载成功
    • 原理说明
  • Dockerfile 方式构建自定义镜像
    • 构建自定义nginx
      • 创建目录和文件
      • 使用指令构建镜像
    • Dockerfile常用指令

前言

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。

但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?今天就写一下博客记录下自己安装、配置和使用中出现的一些问题,希望对铁子们有所帮助。

Docker详解

Docker简介

Docker是一个开源的容器化平台,可以帮助开发者将应用程序其依赖的环境打包成一个可移植、可部署的容器。Docker的主要目标是通过容器化技术实现应用程序的快速部署、可移植性和可扩展性,从而简化应用程序的开发、测试和部署过程。

容器化是一种虚拟化技术,它通过在操作系统层面隔离应用程序和其依赖的运行环境,使得应用程序可以在一个独立的、封闭的环境中运行,而不受底层操作系统和硬件的影响。与传统的虚拟机相比,容器化具有以下优势:

  • 轻量级: 容器与宿主机共享操作系统内核,因此容器本身非常轻量级,启动和停止速度快,资源占用少。
  • 可移植性: 容器可以在任何支持相应容器运行时的系统上运行,无需关注底层操作系统的差异,提供了高度的可移植性。
  • 快速部署: 容器化应用程序可以通过简单的操作进行打包、分发和部署,减少了部署过程的复杂性和时间成本。
  • 弹性扩展: 可以根据应用程序的需求快速创建、启动和停止容器实例,实现应用程序的弹性扩展和负载均衡。
  • 环境隔离: 每个容器都具有独立的运行环境,容器之间相互隔离,不会相互干扰,提供了更好的安全性和稳定性。

docker和传统虚拟机区别

虚拟机是一个主机模拟出多个主机,需要先拥有独立的系统。传统虚拟机,利用hypervisor,模拟出独立的硬件和系统,在此之上创建应用。

docker 是在主机系统中建立多个应用及配套环境,把应用及配套环境独立打包成一个单位,是进程级的隔离

Docker架构

  • Docker daemon( Docker守护进程)
    Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。

  • Client( Docker客户端)
    Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon通信。图中, docker build等都是 Docker的相关命令。

  • Images( Docker镜像)
    Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行 Docker镜像中的程序。

  • Container(容器)
    容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过 Docker API或者 CLI命令来启停、移动、删除容器。

  • Registry
    Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助 Docker Registry来避免镜像的手动复制。

    一个 Docker Registry可包含多个 Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker镜像。这跟 Maven的仓库有点类似,如果把 Docker Registry比作 Maven仓库的话,那么 Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。

Docker Registry可分为公有Docker Registry和私有Docker Registry。 最常⽤的Docker Registry莫过于官方的Docker Hub, 这也是默认的Docker Registry。 Docker Hub上存放着大量优秀的镜像, 我们可使用Docker命令下载并使用。

Docker安装

本次使用的是腾讯云服务器,系统为Ubuntu

Centos 相对好安装一点,Ubuntu 系统没有相关的 yml 指令。

安装参考阿里巴巴开源镜像站中的说明,地址如下所示:

https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.5c611b11axETqq

检查系统信息

使用如下指令,查看服务器的系统信息:

cat/etc/os-release


监测到当前系统是Ubuntu,使用 apt-get 进行安装。

更新依赖

aptupdate&&aptinstall-yca-certificatescurlgnupg lsb-release

导入 Docker 官方密钥

curl-fsSLhttps://download.docker.com/linux/ubuntu/gpg|gpg--dearmor-o/usr/share/keyrings/docker-archive-keyring.gpg

添加 Docker 源

echo"deb [arch=$(dpkg --print-architecture)signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu$(lsb_release-cs)stable"|tee/etc/apt/sources.list.d/docker.list>/dev/null

安装 Docker

aptupdateaptinstall-ydocker-ce docker-ce-cli containerd.io docker-compose-plugin

启动并加入开机启动

systemctl startdockersystemctlenabledocker

配置国内镜像加速

登录阿里云的镜像加速器

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

如下图所示:

根据自己的系统,选择对应的配置信息,本次测试验证使用的是Ubuntu

将其全量复制到控制台中,回车。

mkdir-p/etc/dockertee/etc/docker/daemon.json<<-'EOF' { "registry-mirrors": ["https://l8jvnvev.mirror.aliyuncs.com"] } EOF

如果存在daemon.json文件,则进行修改。

vimdaemon.json{"registry-mirrors":["https://jbw52uwf.mirror.aliyuncs.com"]}

【注意】阿里云的镜像加速器不可用了,可以用下面的替代

{"registry-mirrors":["https://docker.1ms.run","https://hub.rat.dev","https://docker.1panel.live"]}

执行完成后,重启Docker

systemctl daemon-reload systemctl restartdocker

测试启动状态

先拉取docker给出的测试实例

dockerpull hello-world# 或者指定完整地址dockerpull docker.io/library/hello-world:latest

查看当前docker的版本信息,启动已经拉取的实例。

dockerversiondockerrun hello-world

Docker 镜像指令

镜像搜索

可使用 docker search命令搜索存放在 Docker Hub中的镜像。执行该命令后, Docker就会在Docker Hub中搜索含有 java这个关键词的镜像仓库。

docker search java

【注意】但是目前在国内已经禁止访问Docker Hub,这个指令可能会执行失败。

如果执行成功,控制台会输出如下信息(找的图,我的执行失败了)。

列表中的各项属性信息。

属性名称NAMEDESCRIPTIONSTARSOFFICALAUTOMATED
含义镜像仓库名称镜像仓库描述镜像仓库收藏数,
表示该镜像仓库的受欢迎程度,
类似于 GitHub的 stars0
表示是否为官方仓库,
该列标记为[0K]的镜像
均由各软件的官方项目组创建和维护
表示是否是
自动构建的镜像仓库

拉取镜像

使用Docker部署服务前,需要先从中央镜像仓库中拉取镜像。本次以nginx为例。

dockerpull nginx

【提示】如果不指定版本,直接拉取镜像,默认会拉取最新的镜像信息。

如果需要指定版本,可以使用下面的方式:

dockerpull nginx:1.21

查看本地镜像

查看本地已经拉取过的所有镜像信息,可以使用下面的指令:

dockerimages

你会看到刚刚下载的所有镜像信息,包括仓库名、标签(版本)、镜像ID、创建时间和大小。

如果觉得数据很多,只想看ID信息,可以使用如下方式。

dockerimages-q

删除本地镜像

使用docker提供的rmi指令进行指定镜像的删除,如果需要强制删除,可以追加一个-f。如下:

dockerrmijava

强制删除

dockerrmi-fjava

【注意】如果有容器正在使用这个镜像,必须先删除所有依赖该镜像的容器,然后才能删除镜像。

删除所有镜像

dockerrmi$(dockerimages-q)

Docker 容器指令

nginx为例,nginx启动后自带默认的首页信息,方便验证。

启动容器

拉取镜像成功后,使用docker提供的启动命令进行镜像的部署操作。

核心指令

dockerrun-d-pxx:xx 镜像名

比如,上述拉取的是最新的nginx镜像,启动时配置宿主机与镜像端口映射等。

dockerrun-d--namemy-nginx-demo-p80:80 nginx

指令参数说明:

因为markdown语法问题,指令之间为了区别多加了个空格。实际使用需要做区分!

指令名称含义举例原指令
-d-detach 的缩写
表示后台运行,类似 nohoup
-P随机端口映射,一般不用
-p指定端口映射。
如果存在多个端口映射,则调用多个
一般分为4种方式:
- -ip:hostPort:containerPort
- - ip::containerPort
- - hostPort:containerPort
- - containerPort
-p 80:80
- -net指定网络模式一般有4中模式:
- -net=bridge默认选项,表示连接到默认的网桥。
- -net=host 容器使用宿主机的网络。
- -net=container:NAME-or-ID 告诉 Docker让新建的容器使用已有容器的网络配置。
- -net=none 不配置该容器的网络,用户可自定义网络配置。
–net=bridge
- -name指定别名称比如 - -name:my-nginx-demo–name:my-nginx-demo

执行上述指令,如下:

出现随机一串uuid,表示成功。
访问 http://Docker宿主机 IP:91/,将会看到nginx的主界面如下:

如果别名称出现重复,启动会出现报错。

查看容器信息

查看所有的已启动的容器列表,可以使用下列指令:

dockerps

如果需要展示所有(已启动和未启动)的容器列表,需要增加一个-a指令。

dockerps-a

已成功启动的容器信息:

全部容器信息:

展示信息的各项列值说明:

列名CONTAINER_IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
含义容器 ID镜像名称启动容器时运行的命令容器的创建时间容器运行的状态。
UP表示运行中, Exited表示已停止。
容器对外的端口号容器名称。
该名称默认由 Docker自动生成,也可使用 docker run命令的–name选项自行指定。

停止容器

使用 docker stop命令,即可停止容器

dockerstop 容器id|容器名称

比如,上述的nginx容器对应的容器id(CONTAINER ID)9ae51d610d4c,则可以使用下列指令进行停止。

dockerstop 9ae51d610d4c

或者使用容器名称停止。

dockerstop my-nginx-demo

强制停止容器

可使用 docker kill命令发送 SIGKILL信号来强制停止容器

dockerkill9ae51d610d4c

启动已停止的容器

这里的启动操作与docker run有很大的区别,docker run除了启动对应的容器外还包含新建容器等额外的操作。

启动一个已停止的容器,只需要使用docker start即可。

dockerstart 容器id

比如上面停止了nginx的容器,需要启动则使用下列指令实现:

dockerstart 9ae51d610d4c

查看指定容器所有信息

dockerinspect 容器id

查看容器日志

dockercontainer logs 容器id

查看容器里的进程

dockertop容器id

宿主机与容器之间互相拷贝文件

互相复制文件需要分两种情况:

  • 从容器里面拷文件到宿主机:
    使用下列的指令实现
    dockercp容器id:要拷贝的文件在容器里面的路径 宿主机的相应路径
    比如:
    dockercp9ae51d610d4c:/etc/nginx/nginx.conf /mydata/nginx
  • 从宿主机拷文件到容器里面:
    dockercp要拷贝的宿主机文件路径 容器id:要拷贝到容器里面对应的路径

进入指定容器

使用docker exec命令用于进入一个正在运行的docker容器。

如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。

一旦进入了容器,就可以在容器的 Shell 执行命令了。

dockerexec-it9ae51d610d4c /bin/sh

这里指令中的-it含义如下:
1、-i全称--interactive

  • 保持标准输入开启
  • 作用:让你可以往容器里输入命令、打字
  • 不加-i:进去之后没法输入字符,只能看不能操作

2、-t全称--tty

  • 分配一个伪终端
  • 作用:给你一个像正常服务器一样的终端界面,有命令行提示符、光标、格式排版
  • 不加-t:界面很丑,没有命令行前缀,输入体验极差

【注意】上述的指令中/bin/shUbuntu操作系统的指令,如果是Centos系统则需要使用/bin/bash

容器内安装vim、ping、ifconfig等指令

容器内可能会存在linux指令不全的问题,需要进行容器内的相关指令安装。

即使宿主机是Centos,进入容器后也像Ubuntu的操作指令。

apt-getupdateapt-getinstallvim#安装vimapt-getinstalliputils-ping#安装pingapt-getinstallnet-tools#安装ifconfig


【问】进入容器内的shell操作窗口后,怎么退出容器操作?

输入 exit

删除容器

删除容器指令分为安全强制两种情况。

安全删除容器:仅能删除已停止的容器。

dockerrm9ae51d610d4c

强制删除容器:如果容器正在运行,需要删除可以追加-f指令

dockerrm-f9ae51d610d4c

强制删除所有容器:

dockerrm-f$(dockerps-a-q)

Docker 挂载PV

为什么会有要求必须挂载PV的操作?

在实验过程中,发现一个现象,启动和停止容器时,会创建和删除对应的目录信息。

还是以nginx为例,如下所示,查看已启动的容器信息。

dockerps

执行指令后,可以看到 docker 在/var/lib/docker/rootfs/overlayfs目录中会存留容器的相关目录信息。

如果此时停止nginx的容器会发生什么?

dockerstop 9ae51d610d4c


这里居然存储的信息被删除了,如果再docker start操作,则会继续重新创建目录。

到这里就会有一个很严重的问题,大家都知道Docker是可以部署NginxMysql这些东西的,如果容器不小心执行停止指令,那么像nginx的/etc/nginx/conf.d/xxx相关配置会丢,mysql的/var/lib/mysql/xxx这些存储文件都会丢失!

这是一个很严重的生产风险问题!

【疑惑】如何解决这个问题呢?
这里就要提到目录标题说到的PV挂载。

什么是 PV 挂载

在 Docker 里,容器是临时的。

  • 容器删了,里面的文件、数据、配置全都会跟着消失
  • 如果你直接把 RabbitMQ 的队列数据、用户配置、日志都存在容器内部,那下次重启或重建容器,数据就丢了。

把容器里需要持久化的数据目录,映射到宿主机(你的服务器)上的一个真实目录,让数据保存在宿主机上,而不是容器里。

以Mysql为例

这里以Mysql的启动配置为例。

Mysql中,通常有以下几个目录特别重要。

宿主机目录 → 容器内目录 ---------------------------------------- /data/mysql/data → /var/lib/mysql (数据文件,最重要) /data/mysql/conf → /etc/mysql/conf.d (配置文件) /data/mysql/logs → /var/log/mysql (日志)

1、创建宿主机持久化目录(执行一次)

mkdir-p/data/mysql/{data,conf,logs}

2、启动Mysql容器指令调整

dockerrun-d\--namemysql\-p3306:3306\-v/data/mysql/data:/var/lib/mysql\-v/data/mysql/conf:/etc/mysql/conf.d\-v/data/mysql/logs:/var/log/mysql\-eMYSQL_ROOT_PASSWORD=123456\-eTZ=Asia/Shanghai\--restart=always\mysql

3、验证是否挂载成功

首先先看容器中是否存在对应的数据

/var/lib/mysql

检查宿主机挂载目录是否存在数据

cd /data/mysql/


关闭Mysql容器查看是否会删除,以及验证再次重启是否会读取。

原理说明

加了-v 宿主机目录:容器内目录挂载后:

  • 启动时:容器优先读宿主机这个目录里的配置 / 文件
  • 运行中:容器产生的所有数据、日志、新增文件,实时写到宿主机目录
  • 容器本身内部不再存数据,数据全落在宿主机上

步骤说明

  1. 启动读取阶段
    Docker 启动容器时:
    监测到创建容器指令中存在-v /宿主机路径:/容器路径,会直接把容器里这个目录 “屏蔽替换” 成宿主机目录,容器所有读写,全部指向宿主机,不碰容器内部存储。
  2. 运行写入阶段
    容器里程序(MySQL/Nginx/RabbitMQ)往自身目录写数据:
    容器内 /var/lib/mysql 写数据 ↓ 被挂载映射 ↓ 实际写到 宿主机 /data/mysql/data

实时同步、即时写入,不是缓存、不是定时同步,是内核级目录映射。

【注意】这里需要注意一点问题。

nginx 的 pv 挂载操作,宿主机挂载目录千万别一开始是空的直接挂

因为容器在启动前,会把容器默认配置覆盖掉导致启动失败!

对于类似 nginx 的正确处理方式如下:

先临时容器拷出默认配置,再挂载!

Dockerfile 方式构建自定义镜像

Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节。

在实际工作中,这个用的比较普遍,而且和K8S之间能很好地契合。

接下来重点说明一下怎么玩。

构建自定义nginx

先来编写一个最简单的Dockerfile,以前文下载的Nginx镜像为例,来编写一个Dockerfile修改该Nginx镜像的首页。

创建目录和文件

如:在linux系统中,创建一个文件夹/root/my-docker。并在其中创建子目录。

mkdir-p/myNginx/app


app文件夹中新增两个文件,分别是Dockerfile文件和index.html。其中内容如下所示:

Dockerfile :

# 基础镜像FROM nginx:latest# 指定工作区间#workdir /root/nginx# 把本地 index.html 复制到容器里COPY index.html /usr/share/nginx/html/# 暴露端口EXPOSE80# 启动命令(默认 nginx 不用改)CMD["nginx","-g","daemon off;"]

index.html 页面:

<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title></head><body><h1>我用 Dockerfile 构建的 Nginx 镜像!</h1></body></html>

使用指令构建镜像

docker 提供了构建的指令。

dockerbuild-fDockerfile文件名称-t镜像名称:版本.

指令拆分解读。
-t--tag指令的缩写,用于给镜像指定别名称和版本信息。
.:最后还有个.不能省略,这里指Dockerfile 文件的路径。

目前测试时Dockerfile文件的完整路径是/root/my-docker/myNginx/app/Dockerfile

如果正好在/root/my-docker/myNginx/app/路径下执行命令,案例如下:

dockerbuild-tmy-nginx:v2.

如果是在/root/my-docker/下,则需要调整命令

如下所示:

dockerbuild-tmy-nginx:v2 ./myNginx/app/

命令执行完成后,控制台中输出如下信息:

查看构建的镜像信息。

启动镜像:

Dockerfile常用指令

下面列举几项常用指令。

命令说明举例
FROM指定基础镜像文件,并拉取FROM nginx:latest
RUN构建镜像阶段执行命令RUN mkdir -p /home/server
ADD <src> <dest>添加文件,从src目录复制文件到容器的dest,其中 src可以是 Dockerfile所在目录的相对路径,也可以是一个 URL,还可以是一个压缩包ADD fuxi/dist.tar.gz /usr/local/nginx/fuxi/
COPY拷贝文件,和ADD命令类似,但不支持URL和压缩包COPY nginx-prod.conf /etc/nginx/conf.d/default.conf
CMD容器启动后执行命令
EXPOSE声明容器在运行时对外提供的服务端口
WORKDIR指定容器工作路径WORKDIR /home/server
ENV指定环境变量ENV LC_ALL zh_CN.UTF-8
ENTRYPINT容器入口, ENTRYPOINT和 CMD指令的目的一样,都是指定 Docker容器启动时执行的命令,可多次设置,但只有最后一个有效。
USER该指令用于设置启动镜像时的用户或者 UID,写在该指令后的 RUN、 CMD以及 ENTRYPOINT指令都将使用该用户执行命令。
VOLUME指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在 Dockerfile中使用该指令。格式为: VOLUME[“/data”]。
http://www.jsqmd.com/news/775373/

相关文章:

  • 为AI编程助手加装安全层:Claw Gatekeeper风险分级与动态审批实践
  • 如何快速掌握网页资源捕获:3个专业技巧帮你轻松搞定猫抓浏览器扩展
  • 把2000个端子排得整整齐齐,强迫症的快乐!
  • spec2026
  • MCP服务器开发指南:为AI助手构建安全可控的本地文件与应用管理能力
  • 3步解锁Warframe音乐创作:智能演奏系统完全指南
  • GJB/Z 299D-2024 电子设备可靠性预计软件高效实操教程
  • 节能酶解鱼溶浆设备推荐,龙源四方怎么样 - mypinpai
  • 3分钟搞定QQ音乐加密文件转换:QMCDecode终极解密指南
  • TIDAL音乐下载神器:tidal-dl-ng完整使用教程与配置指南
  • 浏览器视频资源智能捕获:猫抓扩展如何帮你轻松下载网页媒体内容
  • 2026年北京哪里配近视眼镜能免费调整清洗口碑榜 - mypinpai
  • Windows 无缝运行 deepin 25|WSL 离线安装全指南
  • 解锁NVIDIA显卡隐藏潜能:5个必学的Profile Inspector高级优化技巧
  • AI智能体配置管理利器:create-agent-config标准化开发实践
  • OFIRM本源场中的信息传播动力学与宇宙学唯象定量推导:从因果律重构到暗物质引力与哈勃张力的精确拟合V2.6
  • 实时监测,防患于未“燃”|CET中电技术无线测温系统为电力设备安全保驾护航
  • 高三家长择校指南:全日制补习机构选择经验分享
  • 本地化AI代码助手Twinny:双模架构、离线部署与VSCode集成实战
  • 如何通过智能功耗分配实现3倍系统响应速度提升:Universal x86 Tuning Utility实战指南
  • 智能手机号地理位置查询系统:基于ASP.NET的高效定位解决方案
  • 2026年感应加热设备口碑排名,广之源靠谱吗? - mypinpai
  • 嵌入式FPGA在SoC设计中的核心价值与应用实践
  • 知识付费选型新局:课堂街、小鹅通与海豚知道的深度解析
  • 知网AI率超50%怎么办?2026实用降AI工具技巧汇总 - 晨晨_分享AI
  • 戴尔G15散热控制终极指南:如何用开源工具彻底告别游戏本过热烦恼?[特殊字符]
  • 视频上的水印文字怎么去掉?亲测好用的视频去文字方法合集
  • 【AISMM×OKR双引擎落地指南】:20年实战验证的5步融合法,让目标管理真正驱动业务增长
  • 13. 学会提示词,从此 AI 听你指挥
  • 2026年性价比高的龙井茶叶,靠谱吗 - mypinpai