Docker容器

article/2025/11/9 13:11:01

什么是 Docker?为什么会有 Docker?Docker 的优势?

  1. 为什么会有 Docker?

我们知道一款产品从开发到上线,从开发环境到生成环境。作为开发和运维人员之间协作需要考虑很多问题,尤其是当我们的产品多版本迭代之后,不同环境之间的兼容就会成为一个大问题;
这时 Docker 的出现就解决了这一难题,Docker 的出现使我们开发的软件可以“带环境安装”,即安装的时候,可以把原始环境一模一样的的复制过来,不用在担心环境不一致导致“开发时可以正常运行,生成环境就会出问题”,“在我的机器上可以正常运行,在别人的机器上就不能运行”的问题了

  1. 什么是 Docker?

Docker 就像是一个轻量级的虚拟机,Docker是一个轻量级的容器,我们可以将环境交给 Docker 来管理,当我们需要移植我们的产品的时候,就可以将环境整个的迁移到另一台主机上,而不向虚拟机一样,迁移一台虚拟机极其资源;

Docker 是一个开源的应用容器引擎,基于 Go 语言开发。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

总之:Docker相较于虚拟机来说具有更加轻量,启动更快,效率更高,可移植性更强等优势,实现了“一次封装,到处运行”,不用在关心环境的不一致问题

  1. Docker 优势?

运行环境的一致性:Docker 的镜像提供了除了内核之外完整的运行环境,确保了应用运行的一致性;
更快速地启动部署:可以做到秒级,甚至毫秒级的的启动时间。大大节约了开发、测试、部署的时间;
更好的隔离性:每个服务器都是独立运行的、完全隔离的。避免公用的服务器,资源会容易受到其他用户的影响;
弹性伸缩、快速扩展:能够更好的处理集中爆发式的服务器使用压力;
迁移更加方便:“带环境安装”;
持续交付和部署:使用 Docker 可以通过定制镜像来实现持续集成,交付,部署;


Docker 的组成?

​Docker 是一个 C/S 架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。

在这里插入图片描述在这里插入图片描述

  1. 镜像:类似虚拟机镜像 , 是一个特殊的文件系统
    操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。
    Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
  2. 容器:类似linux系统环境,运行和隔离应用。是镜像运行时的实体
    镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
  3. 仓库:集中存放镜像文件的地方。
    镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中存储、分发镜像的地方,比如后面我们要学的,Docker Registry就是这样的服务。

Docker 的安装(CentOS7)?

ubuntu 安装 docker 看这篇:Ubuntu下安装docker和docker-compose
CentOS7 自动安装 docker 看这篇:CentOS下安装docker和docker-compose
以下是 docker 手动安装:

Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。​ 由于我们学习的环境都使用的是CentOS,因此这里我们将Docker安装到CentOS上。

注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境,而且Docker很多补丁不支持更新。

  1. 确定你是不是 CentOS7及以上的版本:cat /etc/redhat-release
  2. yum 安装 gcc
    检查是否安装了gcc、g++:gcc -vg++ -v
    安装gcc、g++:yum -y install gccyum -y install gcc-c++
  3. 安装需要的软件包:yum install -y yum-utils device-mapper-persistent-data lvm2
  4. 设置镜像仓库
    推荐阿里云:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. 更新 yum 软件包索引:yum makecache fast
  6. 安装 docker-ce(社区版),企业版收费:yum -y install docker-ce
  7. 启动 docker
    手动启动:systemctl start docker
    开机自启:systemctl enable docker
  8. 测试
    检查版本:docker version
    下载运行HelloWorld:docker run hello-world
  9. 配置镜像加速:推荐阿里云
    mkdir -p /etc/docker
    vim /etc/docker/daemon.json

{
“registry-mirrors”: [“https://8y2y8njn.mirror.aliyuncs.com”]
}

重新记载daemon,重启docker
systemctl daemon-reload
systemctl restart docker

  1. 卸载
    systemctl stop docker
    yum -y remove docker-ce
    rm -rf /var/lib/docker

常用的镜像加速器地址:

  1. 官方镜像:https://registry.docker-cn.com
  2. 网易镜像:http://hub-mirror.c.163.com
  3. 清华大学:https://mirrors.tuna.tsinghua.edu.cn/
  4. 搜狐镜像:http://mirrors.sohu.com/
  5. 阿里镜像:阿里镜像需要登录阿里云控制台获取,每个账号有唯一镜像加速地址。在控制台—>镜像容器服务---->镜像中心:镜像加速服务 下获取。

Docker 的常用命令?

Docker Hub 类似与 Maven 仓库,是 Docker 的远程仓库
国内的 Docker 网站 https://www.docker.com

1.启动与停止命令

命令解释
systemctl start docker启动 Docker
systemctl stop docker停止docker
systemctl restart docker查看docker状态
systemctl status docker开机启动
systemctl enable docker开机启动
docker info查看docker概要信息
docker --help查看docker帮助文档

2.镜像相关命令

命令解释
docker images查看本地存在的镜像
这些镜像都存储在 Docker 的 /var/lib/docker目录下
docker search 镜像名称从网络中查找需要的镜像
docker pull 镜像名称将远程镜像拉取到本地
docker rmi [-f] 镜像ID(强制)删除本地镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG删除多个镜像
docker rmi -f $(docker images -qa)删除所有镜像

使用:
docker images
在这里插入图片描述
docker search 镜像名字
在这里插入图片描述docker pull 镜像名字
在这里插入图片描述

3.容器相关命令

1. 查看容器

命令解释
docker ps查看正在运行的容器
docker ps -a查看所有容器
docker ps -l查看最后一次运行的容器
docker ps -f status=exited查看停止的容器

2. 创建与启动容器

docker run

-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
–name:为创建的容器命名。

2.1.以交互的方式创建容器

以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态。可以理解成交互式容器是前台容器。

docker run -it --name=容器名称 镜像名称:标签 /bin/bash

比如:docker run -it --name=mycentos centos:7 /bin/bash
docker run:表示创建容器
-it:表示运行容器并进入它的命令行
–name=mycentos:给当前的容器命名
centos:7:使用该镜像创建
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

在这里插入图片描述2.2.创建后台容器

创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。

创建守护式容器:docker run -id --name=容器名字 centos:7
登录守护式容器:docker exec -it 容器名称 (或者容器ID) /bin/bash

在这里插入图片描述
2.3.停止与启动容器
docker stop 容器名称(或者容器ID)
docker start 容器名称(或者容器ID)
在这里插入图片描述

3. 文件拷贝

将宿主机的文件拷贝的容器的指定目录下
宿主机向容器拷贝:docker cp 需要拷贝的文件或目录 容器名称:容器目录
容器向宿主机拷贝:docker cp 容器名称:容器目录 需要拷贝的文件或目录
例如: docker cp /opt/tomcat8080/conf/web.xml mycentos7_2:/usr/local/

在这里插入图片描述

4. 目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。

创建容器并挂载:docker run -id --name=mycentos1 -v 宿主机的目录:容器的目录 centos:7

创建容器并挂载 linux 中的 /usr/local/myhtml 到,容器的 /usr/local/myhtml 目录
docker run -id --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7
在这里插入图片描述如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数
--privileged=true 来解决挂载的目录没有权限的问题
docker run -id --privileged=true --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7

5. 查看容器 IP 地址

我们可以通过 docker inspect 容器名称 来查看容器运行时的各种数据

当然我们也可以通过 docker inspect --format='{{属性的键}}' 容器名称 来查看单独某个属性

例如我们单独查看 IP 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos1

在这里插入图片描述

6. 删除容器

docker rm 容器名称

当我们在删除一个正在运行的容器时,会报错;需要先关闭这个容器才可删除

当然我们也可以用 docker rm -f 容器名称 来强制删除一个容器


Docker 的应用容器部署

我们不能直接访问在 Docker 上部署的应用(包括 MySQL),如果我们想要访问我们部署在 Docker 上的应用,那么我们只需要访问 Docker 上部署的应用在宿主机上的映射端口即可,例如:我们在 Docker 上部署了一个 MySQL应用(3306),在宿主机上的映射端口为 33306,我们只需要访问 33306 端口,即可访问 Docker 上的 MySQL;

1.MySQL 部署

在这里插入图片描述

  1. 拉取镜像
    docker pull centos/mysql-57-centos7

  2. 创建容器
    docker run -di --name=mysql5.7 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7

选项解释
-p 宿主机端口:容器端口指定端口映射
-e …传递环境变量,这里表示 MySQL 的密码为 123456,账户默认为 root
  1. 远程链接 MySQL
    在这里插入图片描述

2.Tomcat 部署

  1. 拉取镜像
    docker pull tomcat:7-jre7

  2. 创建容器
    docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7

  3. 找一个 web 项目,部署到宿主机的 /usr/local/webapps 目录下,然后进入 docker 容器查看项目有没有成功部署,最后在浏览器中测试看看能不能成功访问

在这里插入图片描述输入默认的用户名之后,我们成功登录,说明项目已经部署成功了

在这里插入图片描述

3.Nginx 部署

  1. 拉取镜像
    docker pull nginx

  2. 创建 Nginx 容器
    docker run -di --name=mynginx -p 80:80 nginx

  3. 测试

在这里插入图片描述

4.Redis 部署

  1. 拉取镜像
    docker pull redis

  2. 创建容器
    docker run -di --name=myredis -p 6379:6379 redis

  3. 用 redis 客户端工具链接测试

在这里插入图片描述


迁移与备份

保存容器为镜像:docker commit 容器名称 镜像名称
例如:docker commit mynginx mynginx_i

保存镜像为 tar 文件:docker save –o tar文件名 镜像名
docker save -o mynginx.tar mynginx_i

加载 tar 文件为镜像:docker load -i tar文件名
docker load -i mynginx.tar


Dockerfile 制作镜像

前面已经知道了,想要获得一个镜像可以从 Docker 中心仓库拉取,但是如果我们想要自己制作一个镜像,这时就需要 Dockerfile 了;

Docker 实际上就是一个文本文件,我们可以在这个文本文件里输入一些命令或参数,来定制我们需要的镜像,之后 Docker 可以通过读取 Dockerfile 文件的描述来构建镜像;

  1. 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
  2. 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
  3. 对于运维人员:在部署时,可以实现应用的无缝移植。

Dockerfile 常用的命令:

命令作用
FROM image_name:tag定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name声明镜像的创建者
ENV key value设置环境变量 (可以写多条)
RUN command是Dockerfile的核心部分(可以写多条)
RUN 后面输入 linux 命令
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir设置工作目录(进入容器之后默认的工作路径)

下面我们以创建一个具有 jdk1.8 的 centos7 系统为例制作一个镜像

  1. 创建目录
    mkdir –p /usr/local/dockerjdk8

  2. 下载 jdk-8u144-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录

在这里插入图片描述

  1. 创建 Dockerfile 文件(名字固定为Dockerfile)

#依赖的镜像的名称和版本
FROM centos:7
#指定镜像创建者信息
MAINTAINER ayi
#设置工作目录,进入容器之后默认的工作目录,即进入 centos7 应用容器之后默认的工作目录为 /usr
WORKDIR /usr
#RUN yum install -y glibc.i686 制作完镜像之后,用镜像安装的centos7可能会有问题,缺少 glibc.i686,所以这里我们可以安装一下,也可以稍后安装
#RUN 后面是我们在构建镜像时需要执行的命令,下面是创建一个文件夹
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

  1. 执行命令构建镜像
    docker build -t='jdk1.8' .
    注意:这里的 . 不要拉下了,“.” 的意思是指定相对目录为当前目录
    -t:指定构建的镜像的名称

在这里插入图片描述

  1. 查看镜像是否构建成功
    docker images

在这里插入图片描述

  1. 最后,运行容器进行测试

在这里插入图片描述执行 java -version 发现报错,那么我们需要安装一下 glibc
yum install -y glibc.i686
在这里插入图片描述安装完成之后,就可以了
在这里插入图片描述


Docker 私有仓库

Docker 中心仓库中维护着私有仓库的镜像,我们需要将其拉取下来,才能搭建我们自己的私有仓库

  1. 拉取私有仓库
    docker pull registry

  2. 启动私有仓库容器
    docker run -di --name=registry -p 5000:5000 registry

  3. 这里我们就可以访问我们的私有仓库了
    http://192.168.211.144:5000/v2/_catalog,IP 改为你们自己的宿主机 IP 即可

  4. 修改 daemon.json,
    Docker 默认我们的私有仓库是不安全的,所以我们要配置一下,就和之前配置镜像加速一样
    vi /etc/docker/daemon.json
    "insecure-registries":["192.168.211.144:5000"] IP,改为你们自己的宿主机 IP

  5. 重启docker 服务
    systemctl restart docker

成功访问私有仓库

将镜像上传到私有仓库

  1. 先将镜像标记为私有仓库的镜像

docker tag 自己的镜像名称 宿主机IP:私有服务容器的端口/jdk1.8
docker tag jdk1.8 192.168.17.132:5000/jdk1.8
5000:是我们之前创建 registry 的时候映射的端口,是宿主机的端口

在这里插入图片描述

  1. 再次启动私服容器
    docker start registry

  2. 上传标记的镜像
    docker push 192.168.211.144:5000/jdk1.8

在这里插入图片描述

从私有仓库拉取镜像

docker pull 192.168.211.144:5000/jdk1.8


http://chatgpt.dhexx.cn/article/PuFDR1ux.shtml

相关文章

搞懂什么是容器?

操作系统是如何管理进程的 进程的特点: 可以相互通信:具有高级权限的进程可以攻击其他进程共享同一份文件系统:(1)进程可以对已有的进程进行增删改查,也就意味着高级进程可以将其他应用所需要的进程删掉&…

通俗讲解:什么是容器?为什么我们要使用它?

作为程序员,让我们回忆我们每天从事的熟悉得不能再熟悉的软件开发工作: 在本地搭好开发环境,进行开发工作,完了进行单元测试,把开发好的代码部署到测试系统,重复测试,最后部署到生产系统。 我们…

容器化技术概述

容器技术概述 一、什么是容器? 容器这个词,当你第一眼看它或许脑子里是这东西:瓶瓶罐罐、装水、装其他东西的玩意。 不管是什么,总体来说,容器给人第一印象就是——“装”。 那今天我们要说的容器技术是怎么一个概念呢…

Docker学习(一):容器介绍

一、什么是容器 1、容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己的笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、或物理服务器、或公有云主机上运行。 2、容器…

容器基本概念

本节课程要点 什么是容器与镜像?如何构建容器与镜像容器的生命周期容器项目的架构容器 VS.VM 容器与镜像 什么是容器? 在介绍容器的具体概念之前,先简单回顾一下操作系统是如何管理进程的。 首先,当我们登录到操作系统之后&a…

走进波分 -- 15.Optix OSN1800产品介绍

用于城域接入/汇聚层。 盘纤盒,可容纳40根光纤,内部容纳光纤总长度50米 透过内置盘纤盒,构成一体化模块 一个DCM插框可以按照2个DCM模块 直流配电盒,用于安装在机柜上方,给设备供电。AB两部分,互为备份 O…

【PyTorch】Optim 优化器

文章目录 五、Optim 优化器1、SGD 五、Optim 优化器 参考文档:https://pytorch.org/docs/stable/optim.html 1、SGD 参考文档:https://pytorch.org/docs/stable/generated/torch.optim.SGD.html#torch.optim.SGD import torch.optim import torchvisio…

OptioMenu

#OpionMenu.py(可选菜单) from tkinter import *def ok ():print(value is,v.get())root.quit()rootTk() root.geometry(300x300280280)vStringVar(root) v.set(Python)omOptionMenu(root,v,Python,PHP,CPP,C,Java,JavaScript,VBScript) om.pack() buttonButton(root,textOK,co…

Optix7文档阅读(二):基本概念

2. 基本概念和定义 2.1. Program In NVIDIA OptiX 7, a program is a block of executable code on the GPU that represents a particular shading operation. This is called a shader in DXR and Vulkan. For consistency with prior versions of NVIDIA OptiX 7, the ter…

初次尝试OpitX +CMake

** 初次尝试OptiX CMake ** 首先安装好cuda、vs、OptiX和CMake 在OptiX的SDK文件(C:\ProgramData\NVIDIA Corporation\OptiX SDK 7.1.0\SDK)中找到CMakeLists.txt ,将其拖入CMake中,在CMake点击Configure ,完成后点…

Instant-ngp Windows11安装、使用记录

Instant NeRF - Study&Debug 本机配置 Y9000P RTX3060 Win11 Instant NeRF - Study&Debug1. Git2. Cmake3. instant-ngp示例数据自定义数据注意事项问题疑惑 1. Git 正常下载安装,启动Git Bash 设置用户名 $ git config --global user.name "**&q…

Houdini17 OptiX Denoise使用

Houdini17 OptiX Denoise使用 NVIDIA Optx Denoiser第一步 下载安装第二步 启用第三步 打开面板中的按钮一句卧槽走天下! NVIDIA Optx Denoiser NVIDIA Optx Denoiser是一个后处理的算法,在Houdini17中可以被开启使用 第一步 下载安装 点击 Render/ D…

HTML中option和input的区别,option

手机评站网今天精心准备的是《option》,下面是详解! option键是哪一个? 我的键盘上没有option字样的键,请问它指的是哪一个??... 我的键盘上没有option字样的键,请问它指的是哪一个?…

十四、OPTIM

一、torch.optim torch.optim.Optimizer(params, defaults)优化器官网说明 由官网给的使用说明打开看出来优化器实验步骤: ①构造选择优化器 例如采用随机梯度下降优化器SGD torch.optim.SGD(beyond.parameters(),lr0.01),放入beyond模型的参数param…

GPU开发环境搭建(CUDA和 OptiX)

Optix是英伟达一直推出的闭源光线跟踪(rayTracing)引擎 CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复…

Intel OpenImageDenoise VS Nvidia Optix 降噪结果对比

说明:原始图像(Raytracing的直接输出结果,每一幅的左图)为PPM格式, 一、OIDN 按照官方文档提示,先用ImageMagick转换成pfm格式,再将其作为oidn的输入,输出亦为pfm。 magick conve…

OTN技术及华为OTN设备简介

OTN技术及华为OTN设备简介 城域波分环四环五即将进行建设,本次工程采用华为华为下一代智能光传送平台OTN设备OptiX OSN 8800和OptiX OSN 6800。本文主要对OTN技术涉及的网络结构、复用方式、帧结构、ROADM技术和OptiX OSN 8800和OptiX OSN 6800设备特点及本次工程配…

【OptiX】第0个示例 OptixHello 学习Optix的工程配置以及基本框架

首先需要查看本博客的这篇文章:【Optix】Optix介绍与示例编译 把该安装的工程都安装好。可以按照本文所说的顺序创建和理解代码,也可以在本文末尾下载到已经配置好的代码。建议首先在本文末尾处下载代码,编译通过,这样配合文件看心…

OptiX-7入门教程

OptiX是英伟达专为光线追踪打造的SDK,但是他的官方案例都比较复杂,包含了大量初始化相关的代码,初学容易一头雾水。 本人跟着Github上的optiX7course一步步学习才算入门。这个课程是Siggraph 2019/2020上的OptiX课程,有源码&…

optix入门

射线追踪是embarrassingly parallel/perfectly parallel/pleasingly parallel的问题,就是说基本不用费劲就可以并行化。 射线追踪是指从某点发射射线,判断其与几何结构的交点,根据交点对图像进行渲染,或者计算。 nvidia optix是基…