百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

快速入门 Docker,看这一篇文章就够

nanshan 2024-12-02 23:25 7 浏览 0 评论

一、简介



什么是 Docker?


Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上运行,方便做持续集成并有助于整体的发布的容器虚拟化技术。



Docker 的应用场景


Web 应用的自动化打包和发布

自动化测试和持续集成、发布

在服务型环境中部署和调整数据库或其他的后台应用

从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境



Docker 的核心概念:


镜像:Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统

容器:镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等

仓库:仓库可看成一个代码控制中心,用来保存镜像



???

二、安装配置



安装


安装命令如下:


curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun


也可以使用国内 daocloud 一键安装命令:


curl -sSL https://get.daocloud.io/docker | sh



配置镜像加速器


针对 Docker 客户端版本大于 1.10.0 的用户

您可以通过修改 daemon 配置文件

/etc/docker/daemon.json 来使用加速器


各大云服务厂商都有提供镜像加速服务,登录之后可以在自己获取


sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://自己的云服务的加速地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker



???

三、操作命令



docker 帮助命令


启动 docker :systemctl start docker

停止 docker: systemctl stop docker

重启 docker: systemctl restart docker

查看 docker 状态:systemctl status docker

开机启动:systemctl enable docker

查看 docker 概要信息:docker info

查看帮助文档:docker --help

查看命令帮助文档:docker 命令 --help



镜像命令


列出本地所有镜像:docker images

参数:

-a:列出本地所有镜像
-q:只显示镜像 ID


搜索镜像:docker search 镜像名


下载镜像:docker pull 镜像名:版本

不指定版本,默认下载最新版


查看容器镜像,容器,数据卷所占空间:docker system df


删除镜像 :docker rmi 镜像ID

删除单个:docker rmi 镜像1ID

删除多个:docker rmi 镜像1ID 镜像2ID



容器命令


创建容器:docker run 镜像名


demo:


docker run 镜像名 -i -t --name newname


参数:


-a stdin: 指定标准输入输出内容类型,

可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器 ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="aa": 为容器指定一个名称;
-h "mars": 指定容器的 hostname;


-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;
-m :设置容器使用内存最大值;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷


查看容器:docker ps

查看所有启动的容器(包括停止的容器),加参数 -a


docker ps -a
进入容器:`docker exec -it  容器名|ID  /bin/bash`


退出容器:容器内执行命令exit

停止容器运行:doker stop 容器名

启动容器:docker start 容器名

删除容器:docker rm 容器名



???

四、数据卷



什么是数据卷


Docker 容器删除后,在容器中产生的数据也会销毁,容器内部如何和外部机器共享数据,容器之间数据交互怎么解决?



配置数据卷


启动容器时,使用参数 -v 设置数据卷


docker run -v 宿主机目录(文件):容器内目录(文件)


同时挂载多个文件和目录


docker run -v 宿主机目录1(文件):容器内目录1(文件) -v 宿主机目录2(文件):容器内目录2(文件)


多个容器挂载同一个文件


docker run -it --name Cb -v /home/data:/v2/data centos


docker run -it --name Cb -v /home/data:/v1/data ubuntu



数据卷容器的配置


创建数据卷容器


docker run -it --name=musen -v /volume centos


创建容器继承数据卷容器的挂载目录


docker run -it --name=a1 --volumes-form centos



数据卷管理命令


查看所有的数据卷


docker volume ls


删除指定的数据卷


docker volume rm 数据卷


查看数据卷的具体位置


[root@ecs-170297 home]# docker volume inspect jenkins_home
[
    {
        "CreatedAt": "2022-02-16T22:00:38+08:00",
        "Driver": "local",
        "Labels": null,
        # 数据卷数据存储的具体位置
        "Mountpoint": "/var/lib/docker/volumes/jenkins_home/_data",
        "Name": "jenkins_home",
        "Options": null,
        "Scope": "local"
    }
]



???

五、端口映射



将宿主机的端口和容器内部端口进行映射,实现外部机器可以访问容器


-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口


docker run -id -p 3307:3306  centos:7



???

六、DockerFile



什么是 Dockerfile?


Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。



镜像制作


容器转为镜像


# 把容器打包为镜像
docker commit 容器ID 镜像名称:版本号
# 把镜像转换为压缩文件
docker save -o 压缩文件名称 镜像名称:版本号
# 将压缩文件还原为镜像
docker load -i 压缩文件名称


通过 Docker File 制作镜像


1、编写 DockerFile 文件


FROM centos:7
MAINTAINER musen<121292679@qq.com>
RUN yum install -y vim
WROKDIR /usr
CMD /bin/bash


2、通过 dockerFile 构建镜像


docker build -f ./xxxDcokerFile -t musenCentos:1 .


参数说明

-f:指定 dockerFile 文件

-t:指定构建出来的镜像名和版本



DockerFile 命令


FROM: 构建镜像基于哪个镜像

MAINTAINER :镜像维护者姓名或邮箱地址

RUN :构建镜像时运行的指令

CMD :运行容器时执行的 shell 环境

VOLUME : 指定容器挂载点到宿主机自动生成的目录或其他容器

USER :为 RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户


WORKDIR: 为 RUN、CMD、ENTRYPOINT、COPY和 ADD 设置工作目录,就是切换目录

HEALTHCHECH :健康检查

ARG: 构建时指定的一些参数

EXPOSE :声明容器的服务端口(仅仅是声明)

ENV: 设置容器环境变量

ADD: 拷贝文件或目录到容器中,如果是 URL 或压缩包便会自动下载或自动解压

COPY:拷贝文件或目录到容器中,跟 ADD 类似,但不具备自动下载或解压的功能

ENTRYPOINT:运行容器时执行的 shell 命令



???

七、Docker Compose



简介和安装


Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。


Compose 安装


下载 Compose


# github下载
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内镜像下载
$sudo curl -L https://get.daocloud.io/docker/compose/releases/download/2.28.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose


将可执行权限应用于二进制文件:


$ sudo chmod +x /usr/local/bin/docker-compose

验证是否安装成功


卸载


$ sudo rm /usr/local/bin/docker-compose



Compose 使用步骤:


使用 Dockerfile 定义应用程序的环境。

使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

执行 docker-compose up 命令来启动并运行整个应用程序。



Compose 常用指令


version

指定本 yml 文件按照的 compose 哪个版本编写的。


services

多个容器服务的集合


version: "3.7"
services:
  # 容器1
  webapp:
    build: ./dir
  # 容器2
  mysql:
    xxx: xxx
  # 容器3
  nginx:
    xxx: xxx 


build

指定为构建镜像上下文路径:


例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:


version: "3.7"
services:
  webapp:
    build: ./dir


image

指定容器运行的镜像。以下格式都可以:


version: "3.7"
services:
  redis:
    image: redis


volumes

将宿主机的数据卷或着文件挂载到容器里。

使用绝对路径进行挂载


version: "3.7"
services:
  db:
    image: mariadb:latest
    volumes:
      - "/home/data:/var/mysql/data"


使用的数据卷标进行挂载( 简洁易于管理,但是数据实际存放的位置需要费点周折才能看到 )


version: "3.7"
services:
  db:
    image: mariadb:latest
    volumes:
      - [卷标名称]:/var/lib/mysql


volumes:
  [卷标名称]:


#  查看卷标的信息 
docker volume inspect [卷标名称]
#输出的信息中 Mountpoint 即为数据实际存放的位置
# 查看所有的卷标
docker volume ls


ports

设置宿主机和容器的映射端口


version: "3.7"
services:
  db:
    image: redis:latest
    ports:
    - "6379:6379"


expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

仅可以指定内部端口为参数:


expose:
 - "3000"
 - "8000"


restart

设置容器重启策略


no:是默认的重启策略,在任何情况下都不会重启容器。

always:容器总是重新启动。

on-failure:在容器非正常退出时(退出状态非 0),才会重启容器。

unless-stopped:在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器



container_name

指定自定义容器名称,而不是生成的默认名称。


version: "3.7"
services:
  django-app:
  container_name: my-web-app


environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。


environment:
  MYSQL_ROOT_PASSWORD: pythonvip
  MYSQL_DATABASE: test


depends_on

设置容器启动的顺序依赖关系


version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres


上面的案例:先启动 db 和 Redis ,才会启动 Web 这个容器


command

覆盖容器启动的默认命令参数


command: ["bundle", "exec", "thin", "-p", "3000"]


links

将指定容器连接到当前连接 ,服务之间可以使用服务名称相互访问


可以设置别名,避免 ip 方式导致的容器重启动态改变的无法连接情况


version: '3'
services:
    web:
        build: .
        links:
          # 指定服务名称:别名
            - "db:database"
    db:
        image: mysql


这样 Web 服务就可以使用 db 或 database 作为 host 地址 访问 db 服务了。

今天为大家带来的是深入浅出Docker

特点

  • 标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
  • 节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;
  • 方便构建基于SOA架构或微服务架构的系统,通过服务编排,更好的松耦合;
  • 节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;
  • 方便持续集成,通过与代码进行关联使持续集成非常方便;
  • 可以作为集群系统的轻量主机或节点,在IaaS平台上,已经出现了CaaS,通过容器替代原来的主机。

Docker


Docker的优点

1、简化程序:

Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就能完成。

2、避免选择恐惧症:

如果你有选择恐惧症,还是资深患者。Docker 帮你打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。

3、节省开支:

一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。

总结


Docker一词意为码头工人,而Docker的功能也与集装箱类似。通常一个webapp并不会用到操作系统/虚拟机的全部功能,即操作系统/虚拟机对于一个webapp来说太过笨重。打个比方说,我要从宿舍去食堂,我并不需要一架飞机,只需要一辆自行车就够了,而Docker镜像就相当于是一辆自行车。你可以把Docker镜像理解为轻量化的虚拟机!

Docker的容器是以镜像来创建的,镜像是不是一个类似操作系统的环境? 是的,你可以将Docker理解为一个轻量化的虚拟机,至于我们经常说的什么Tomcat镜像、MySQL镜像之类的,只是这个轻量化的虚拟机中安装了相应的软件。镜像的名字也就说明了镜像的功能。

是不是到正式环境上还要安装Docker,然后把应用部署在其中? 是的,构建Docker镜像、运行Docker容器,都需要安装Docker,但这是一劳永逸的,因为我们使用的是安装了各种各样功能软件的Docker镜像和Docker容器。

最后:

这一份深入浅出Docker.PDF是可以免费送给想要学习的小伙伴!

私信小编:资料,免费领取

————————————————

相关推荐

在 Ubuntu 上安装 Zabbix(以 Zabbix 6.4 LTS 版本为例)

Zabbix是一个流行的开源监控解决方案,能够监控各种网络参数和服务器健康状态。一、环境准备系统要求Ubuntu20.04/22.04LTS至少2GBRAM(生产环境建议4GB+)至少1...

如何在 Ubuntu 24.04 服务器上安装 Apache Solr

ApacheSolr是一个免费、开源的搜索平台,广泛应用于实时索引。其强大的可扩展性和容错能力使其在高流量互联网场景下表现优异。Solr基于Java开发,提供了分布式索引、复制、负载均衡及自...

如何在 Ubuntu 24.04 LTS 或 22.04/20.04 上安装 Apache Maven

Maven是由Apache托管的开源工具,用于管理Java项目。它包含一个项目对象模型(POM):一个配置文件(XML),其中包含项目的基本信息,包括配置、项目依赖项等。Maven可以处理...

Cursor的终极对手——Trae Pro最新系统提示词

前段时间,字节的AI编程神器Trae国际版,终于甩出了Pro订阅计划!很多对它又爱又恨的小伙伴,直呼:终于等到你。爱它,是因为Trae长期免费+体验真香;恨它?还不是那该死的排队等待,...

AI系统提示词:V0(ai代码提示)

以下是对V0系统提示词(SystemPrompt)的分部分讲解与解读,帮助你理解其核心内容和设计意图。V0系统提示词##CoreIdentity-Youarev0,Vercel&...

8岁男童失踪第13天,搜救人员发现可疑水库,更恶心的事情发生了

Lookingatyourrequest,Ineedtorewritethearticleaboutthe8-year-oldmissingboywhilemaking...

docker常用指令及安装rabbitMQ(docker安装zabbix)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

三步教你用Elasticsearch+PyMuPDF实现PDF大文件秒搜!

面对100页以上的大型PDF文件时,阅读和搜索往往效率低下。传统关系型数据库在处理此类数据时容易遇到性能瓶颈,而Elasticsearch凭借其强大的全文检索和分布式架构,成为理想解决方案。通过...

ElasticSearch中文分词插件(IK)安装

坚持原创,共同进步!请关注我,后续分享更精彩!!!前言ElasticSearch默认的分词插件对中文支持很不友好。一段话按规则会以每个中文字符来拆解,再分别建立倒排索引。如"中华人民共和国国歌...

SpringBoot使用ElasticSearch做文档对象的持久化存储?

ElasticSearch是一个基于Lucene的开源搜索引擎,广泛应用于日志分析、全文搜索、复杂查询等领域,在有些场景中使用ElasticSearch进行文档对象的持久化存储是一个很不错的选择...

Elasticsearch数据迁移方案(elasticsearch copyto)

前言最近小编要去给客户部署一套系统涉及到了Mysql和ES数据的迁移,下面就给大家分享一下ES数据迁移的几套方案,根据具体的使用场景来选择不同的迁移方案能使你事倍功半,话多说下面就一一介绍。Elast...

Rancher部署单体ElasticSearch(rancher2.5部署)

Rancher是k8s图形管理界面,之前曾有写文章介绍如何安装。ElasticSearch是热门搜索引擎,很多地方都有用到,常规安装部署略显繁琐,本文介绍在k8s下用rancher简易部署ES。1.在...

Elasticsearch在Java项目的搜索实践:从零开始构建高效搜索系统

Elasticsearch在Java项目中的搜索实践:从零开始构建高效搜索系统在现代的Java项目中,数据量激增,传统的数据库查询方式已经无法满足快速检索的需求。这时,Elasticsearch(E...

小白入门-Kibana安装(kibana安装配置)

一Kibana基础1.1介绍Kibana是一款免费且开放的前端应用程序,其基础是ElasticStack,可以为Elasticsearch中索引的数据提供搜索和数据可视化功能。Kiban...

Docker上使用Elasticsearch,Logstash,Kibana

在对一个项目做性能测试时我需要处理我们web服务器的访问日志来分析当前用户的访问情况。因此,我想这是试用ELK的一个好机会。ELK栈首先要注意的是使用它是非常简单的。从决定使用ELK到在本机上搭一个...

取消回复欢迎 发表评论: