docker基础安装使用

news/2024/6/3 18:53:45 标签: docker, 容器, 运维

文章目录

    • 一、简介
      • 1、虚拟化
      • 2、Docker组件
        • 2.1 Docker服务器与客户端
        • 2.2 Docker镜像与容器
        • 2.3 Registry(注册中⼼)
      • 3、小结
      • 4、Docker和虚拟机的区别
    • 二、安装Docker
      • 1、安装docker
      • 2、设置`ustc`的镜像
      • 3、docker的启动与停止
    • 三、常用命令
      • 1、镜像相关命令
        • 1.1 查看镜像
        • 1.2 搜索镜像
        • 1.3 拉取镜像
        • 1.4 删除镜像
      • 2、容器相关命令
    • 四、常见应用部署
      • 1、MySQL部署
      • 2、Tomcat部署
      • 3、Nginx部署
      • 4、Redis部署
    • 五、数据备份和迁移
      • 1、容器持久化为镜像
      • 2、镜像备份
      • 3、加载镜像文件
    • 六、自定义镜像部署
      • 1、资源准备
      • 2、发布镜像
      • 3、测试


一、简介

1、虚拟化

Docker 是⼀个开源项⽬,诞⽣于 2013 年初,最初是 dotCloud 公司内部的⼀个业余项⽬。它基于 Google 公司推出的 Go 语⾔实现。 项⽬后来加⼊了 Linux 基⾦会,遵从了 Apache 2.0 协议,项⽬代码在 GitHub 上进⾏维护。

请添加图片描述

为什么选择Docker?

  • (1)上⼿快。

⽤户只需要⼏分钟,就可以把⾃⼰的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应⽤程序也⾮常迅速,可以说达到“随⼼所致,代码即改”的境界。随后,就可以创建容器来运⾏应⽤程序了。⼤多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很⾼的性能,同时同⼀台宿主机中也可以运⾏更多的容器,使⽤户尽可能的充分利⽤系统资源。

  • (2)职责的逻辑分类

使⽤Docker,开发⼈员只需要关⼼容器中运⾏的应⽤程序,⽽运维⼈员只需要关⼼如何管理容器。Docker设计的⽬的就是要加强开发⼈员写代码的开发环境与应⽤程序要部署的⽣产环境⼀致性。从⽽降低那种“开发时⼀切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)”

  • (3)快速⾼效的开发⽣命周期

Docker的⽬标之⼀就是缩短代码从开发、测试到部署、上线运⾏的周期,让你的应⽤程序具备可移植性,易于构建,并易于协作。(通俗⼀点说,Docker就像⼀个盒⼦,⾥⾯可以装很多物件,如果需要这些物件的可以直接将该⼤盒⼦拿⾛,⽽不需要从该盒⼦中⼀件件的取。)

  • (4)⿎励使⽤⾯向服务的架构

Docker还⿎励⾯向服务的体系结构和微服务架构。Docker推荐单个容器只运⾏⼀个应⽤程序或进程,这样就形成了⼀个分布式的应⽤程序模型,在这种模型下,应⽤程序或者服务都可以表示为⼀系列内部互联的容器,从⽽使分布式部署应⽤程序,扩展或调试应⽤程序都变得⾮常简单,同时也提⾼了程序的内省性。(当然,可以在⼀个容器中运⾏多个应⽤程序)

2、Docker组件

2.1 Docker服务器与客户端

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

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器

  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

在这里插入图片描述

2.2 Docker镜像与容器

Docker中有几个重要的概念:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

  镜像是构建Docker的基⽯。⽤户基于镜像来运⾏⾃⼰的容器。镜像也是Docker⽣命周期中的“构建”部分。镜像是基于联合⽂件系统的⼀种层式结构,由⼀系列指令⼀步⼀步构建出来
  Docker可以帮助你构建和部署容器,你只需要把⾃⼰的应⽤程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运⾏⼀个或多个进程。我们可以认为,镜像是Docker⽣命周期中的构建或者打包阶段,⽽容器则是启动或者执⾏阶段。 容器基于镜像启动,⼀旦容器启动完成后,我们就可以登录到容器中安装⾃⼰需要的软件或者服务。
  Docker也不关⼼你要把容器运到何⽅:我们可以在⾃⼰的笔记本中构建容器,上传到Registry,然后下载到⼀个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱⼀样,Docker容器⽅便替换,可以叠加,易于分发,并且尽量通⽤。

2.3 Registry(注册中⼼)

  Docker⽤Registry来保存⽤户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。⽤户可以在Docker Hub注册账号,分享并保存⾃⼰的镜像(说明:在Docker Hub下载镜像巨慢,可以⾃⼰构建私有的Registry)。
https://hub.docker.com/

开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样。

  • DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。

  • 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等。

我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:
在这里插入图片描述

3、小结

Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
  • Docker应用运行在容器中,使用沙箱机制,相互隔离

Docker如何解决开发、测试、生产环境有差异的问题?

  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

Docker是一个快速交付应用、运行应用的技术,具备下列优势:

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
  • 启动、移除都可以通过一行命令完成,方便快捷

4、Docker和虚拟机的区别

Docker可以让一个应用在任何操作系统中非常方便的运行。而以前我们接触的虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。

两者有什么差异呢?

虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。

Docker仅仅是封装函数库,并没有模拟完整的操作系统,如图:
在这里插入图片描述

对比来看:
在这里插入图片描述

小结:

Docker和虚拟机的差异:

  • docker是一个系统进程;虚拟机是在操作系统中的操作系统

  • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

二、安装Docker

docker_114">1、安装docker

yum 包更新到最新

yum update

安装需要的软件包

yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源为阿⾥云

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker

yum install docker-ce

查看docker版本

docker -v

2、设置ustc的镜像

ustc是⽼牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在⽤。ustc的docker镜像加速器速度
很快。ustc docker mirror的优势之⼀就是不需要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker

https://lug.ustc.edu.cn/wiki/mirrors/help/docker

编辑该⽂件(本身没有该文件,编辑后即可添加):

vim /etc/docker/daemon.json

在该⽂件中输⼊如下内容:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

docker_174">3、docker的启动与停止

启动/停止docker

# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
#	重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker

开机启动docker

systemctl enable docker

查看docker概要信息

docker info

查看docker帮助文档

docker --help

三、常用命令

在这里插入图片描述

1、镜像相关命令

1.1 查看镜像

docker images

在这里插入图片描述

  • REPOSITORY:镜像名称。
  • TAG:镜像标签。
  • IMAGE ID:镜像ID。
  • CREATED: 镜像的创建⽇期(不是获取该镜像的⽇期)。
  • SIZE: 镜像⼤⼩。

这些镜像都是存储在Docker宿主机的/var/lib/docker⽬录下

1.2 搜索镜像

从网路中搜索镜像

docker search 镜像名称
docker search mysql
  • NAME: 仓库名称

  • DESCRIPTION: 镜像描述

  • STARS: ⽤户评价,反应⼀个镜像的受欢迎程度

  • OFFICIAL: 是否官⽅

  • AUTOMATED: ⾃动构建,表示该镜像由Docker Hub⾃动构建流程创建的

1.3 拉取镜像

从中央仓库下载镜像到本地

docker pull 镜像名称
docker pull mysql

1.4 删除镜像

根据镜像ID删除镜像

docker rmi 镜像ID

删除所有镜像

docker rmi 'docker images -q'

2、容器相关命令

2.1 容器内容查看

查看正在运行容器

docker ps

查看所有容器

docker ps -a

查看最后一次运行的容器

docker ps -l

查看停止的容器

docker ps -f status=exited

2.2 创建与启动容器

创建容器命令:docker run

  • -i: 表示运⾏容器

  • -t: 表示容器启动后会进⼊其命令⾏。加⼊这两个参数后,容器创建就能登录进去。即分配⼀个伪终端。

  • –name: 为创建的容器命名。

  • -v: 表示⽬录映射关系(前者是宿主机⽬录,后者是映射到宿主机上的⽬录),可以使⽤多个-v做多个⽬录或⽂件映射。注意:最好做⽬录映射,在宿主机上做修改,然后共享到容器上。

  • -d: 在run后⾯加上-d参数,则会创建⼀个守护式容器在后台运⾏(这样创建容器后不会⾃动登录容器,如果只加-i -

  • -p: 表示端⼝映射,前者是宿主机端⼝,后者是容器内的映射端⼝。可以使⽤多个-p做多个端⼝映射t两个参数,创建后就会⾃动进去容器)。

1. 交互式创建容器

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

退出容器

exit

2. 守护式方式创建容器

docker run -di --name=容器名称 镜像名称:标签
#	启动Redis
docker run -di --name=myredis -p 6379:7379 redis

登录守护式容器方式

docker exec -it 容器名称(容器ID) /bin/bash
#	登录 redis
docker exec -it 35f3bf9a06ef /bin/bash

2.3 启动和停止容器

启动容器

docker start 容器名称(或者容器ID)
#	启动Redis
docker start 35f3bf9a06ef

停止容器

docker stop 容器名称(容器ID)
#	停止Redis
docker stop 35f3bf9a06ef

2.4 文件拷贝

文件拷贝到容器

docker cp 需要拷贝文件/目录 容器名称:容器目录

容器中文件拷贝出来

docker cp 容器名称:容器目录 拷贝后文件/目录

2.5 查看容器IP地址

docker inspect 容器名称(容器ID)
#	查看Redis的ID
docker inspect 35f3bf9a06ef

直接输出ID

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
#	获取指定IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' 35f3bf9a06ef

2.6 删除容器

docker rm 容器名称(容器ID)
#	先停止容器、然后删除
docker stop 35f3bf9a06ef
docker rm 35f3bf9a06ef

四、常见应用部署

1、MySQL部署

拉取MySQL镜像

docker pull centos/mysql-57-centos7

创建容器

docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
  • -p :代表端⼝映射,格式为 宿主机映射端⼝:容器运⾏端⼝
  • -e: 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root⽤户的登陆密码

2、Tomcat部署

拉取Tomcat

docker pull tomcat

创建容器

docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat

3、Nginx部署

docker pull nginx

创建Nginx容器

docker run -di --name=mynginx -p 80:80 nginx

4、Redis部署

docker pull redis

创建容器

docker run -di --name=myredis -p 6379:6379 redis

五、数据备份和迁移

1、容器持久化为镜像

将运行中容器持久化为镜像

#	查看在运行容器
docker ps
# 持久化Tomcat
docker commit 78a69ea6da3a mytomcat_1

2、镜像备份

docker save -o [保存的目标文件名称] [镜像名称]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22omdZQ1-1667125049509)(assets/image-20210731161354344.png)]

将镜像保存为tar文件

#	查看镜像(1中容器持久化的镜像)
docker images
# 保存为本地文件(mynginx.tar)
docker save -o /data/mynginx.tar mytomcat_1

3、加载镜像文件

将保存到本地的镜像文件,加载到docker

#	加载镜像
docker load -i mynginx.tar

六、自定义镜像部署

1、资源准备

下载JDK

wget https://codechina.csdn.net/weixin_44624117/software/-/raw/master/software/jdk-8u181-linux-x64.tar.gz

配置Docker打包配置文件:Dockerfile

# 指定基础镜像
FROM centos:8

# 拷贝jdk和java项目的包
COPY ./demo-docker.jar /tmp/app.jar
COPY ./jdk-8u181-linux-x64.tar.gz /tmp/jdk-8u181-linux-x64.tar.gz

# 配置环境变量
RUN cd /tmp \
 && tar -zxvf /tmp/jdk-8u181-linux-x64.tar.gz  -C /tmp

# 配置环境变量
ENV JAVA_HOME=/tmp/jdk1.8.0_181
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8080

# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

创建Java项目并打包

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class Test {
    @RequestMapping("/test")
    public String get() {
        System.out.println("test");
        return "test";
    }
}

打包后的jar包路径

https://download.csdn.net/download/weixin_44624117/86862162

配置完成后文件,完整文件(JDK+Jar+Dockerfile)

https://download.csdn.net/download/weixin_44624117/86862417

2、发布镜像

自定义发布到docker容器

docker build -t docker_test:1.0 .

运行docker镜像

docker run -di --name=my_docker -p 8080:8080 e6bf70c38c35 /bin/bash

3、测试

curl http://localhost:8080/test/test

http://www.niftyadmin.cn/n/1634386.html

相关文章

B. Sereja and Mirroring

B. Sereja and Mirroringtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputLets assume that we are given a matrix b of size x  y, lets determine the operation of mirroring matrix b. The mirroring of matrix…

数据库重要基础知识

Table of Contents 常见的数据库优化手段 索引的优缺点,什么字段上应该建立索引 为什么建立索引可以提高查询效率 数据库连接池介绍 Druid连接池 MVCC原理及应用 Mysql并发控制 读写锁 锁粒度 Mysql索引 数据库视图 noSql知识 Nosql优点 Nosql不足 适…

抽象类与接口的区别 Java描述(转)

abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换&#xf…

Spring Cloud Gateway简单使用

文章目录一、简介1、功能特点:2、术语解释3、网关技术二、快速开始1、创建Spring boot工程2、启动引导类开启注册中心Eureka客户端发现3、配置文件appliation.yml4、编写路由规则三、路由配置(转发)(predicates)1、Query属性2、Header3、Method4、RemoteAddr5、Host…

使用python一步一步搭建微信公众平台(一)

使用的工具,python 新浪SAE平台,微信的公众平台 你需要先在微信的公众平台与新浪SAE平台上各种注册,微信平台注册的时候需要你拍张手持身份证的照片,还有几天的审核期 微信公众平台:http://mp.weixin.qq.com 新浪SAE&a…

百度北京

百度北京地 址:北京市北四环西路58号理想国际大厦12层邮 编:100080电 话:(010)82621188传 真:(010)82607007 82607008E-mail:[email]webmasterbaidu.com[/email]地 …

maven问题整理

1、Maven简介 2、Maven问题整理 文章目录一、下载Jar包报错1、方式一:可能现在使用的,不是你配置的2、方式二:多环境配置,未指定当前环境3、方式三:已下载过,但是未成功二、右侧依赖报错1、方式一&#xf…

TRIZ普及热潮有望到来

近日,以北京理工大学的大规模公开演讲和培训为开端,TRIZ知识创新系统的国内领导性厂商亿维讯,开始带动各大高校掀起新一轮对TRIZ理论的关注热潮,引发了高校师生的热切关注。有分析人士就此认为,从目前高校师生对TRIZ的…