Docker介绍

Docker介绍

1.Docker概念

Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分离,以便快速交付软件。
使用Docker,您可以用与管理应用程序相同的方式管理基础设施。
通过利用Docker快速发布、测试和部署代码的方法,您可以显著减少编写代码和在生产中运行代码之间的延迟。

1.1什么是 Docker

Docker的官方主页

image-20211026224736318

Docker 使用 Google 公司推出的 Go 语言 (opens new window)进行开发实现,基于 Linux 内核的 cgroup (opens new window)namespace (opens new window),以及 OverlayFS (opens new window)类的 Union FS (opens new window)等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术 (opens new window)。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC (opens new window),从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer (opens new window),从 1.11 版本开始,则进一步演进为使用 runC (opens new window)containerd (opens new window)

下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

传统虚拟化

Docker

比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。

传统虚拟机Docker容器
磁盘占用几个GB到几十个GB左右几十MB到几百MB左右
CPU内存占用虚拟操作系统非常占用CPU和内存Docker引擎占用极低
启动速度(从开机到运行项目)几分钟(从开启容器到运行项目)几秒
安装管理需要专门的运维技术安装、管理方便
应用部署每次部署都费时费力从第二次部署开始轻松简捷
耦合性多个应用服务安装到一起,容易互相影响每个应用服务一个容器,达成隔离
系统依赖需求相同或相似的内核,目前推荐是Linux

1.2我可以用Docker做什么?

1.快速、一致地交付您的应用程序

2.快速部署和扩展

Docker基于容器的平台允许高度可移植的工作负载。Docker容器可以在开发人员的本地笔记本电脑、数据中心的物理或虚拟机、云提供商或混合环境中运行。

Docker的可移植性和轻量级特性还使其能够轻松地动态管理工作负载,根据业务需求以近乎实时的方式扩展或删除应用程序和服务。

3.在同一硬件上运行更多工作负载

Docker重量轻,速度快。它为基于虚拟机监控程序的虚拟机提供了一种可行、经济高效的替代方案,因此您可以使用更多的计算能力来实现业务目标。Docker非常适合高密度环境和中小型部署,在这些环境中,您需要用更少的资源做更多的工作。

1.3.为什么是Docker

  • 在开发的时候,在本机测试环境可以跑,生产环境跑不起来

    这里我们拿java Web应用程序举例,我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、mysql等软件环境。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序以及使用软件环境直接打包在一起,无论在那个机器上保证了环境一致。

    优势1: 一致的运行环境,更轻松的迁移

  • 服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了

    这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。

    优势2:对进程进行封装隔离,容器与容器之间互不影响,更高效的利用系统资源

  • 公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器

    在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率。

    优势3: 通过镜像复制N多个环境一致容器

2.docker体系结构

Docker使用客户机-服务器体系结构。Docker客户端与Docker守护进程对话,Docker守护进程负责构建、运行和分发Docker容器。Docker客户端和守护程序可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护进程使用RESTAPI通过UNIX套接字或网络接口进行通信。另一个Docker客户端是Docker Compose,它允许您使用由一组容器组成的应用程序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bBond5xV-1635266133367)(https://wywtypora.oss-cn-shanghai.aliyuncs.com/image/architecture.svg)]

● Docker_Host:
  ○ 安装Docker的主机
● Docker Daemon:
  ○ 运行在Docker主机上的Docker后台进程
● Client:
  ○ 操作Docker主机的客户端(命令行、UI等)
● Registry:
  ○ 镜像仓库
  ○ Docker Hub
● Images:
  ○ 镜像,带环境打包好的程序,可以直接启动运行
● Containers:
  ○ 容器,由镜像启动起来正在运行中的程序
交互逻辑
装好Docker,然后去软件市场 寻找镜像,下载并运行,查看容器状态日志等排错

2.1Docker的核心架构

image-20200404111908085

  • 镜像: 一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像,tomcat镜像,nginx镜像等
  • 容器: 镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写
  • 仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置
  • dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置
  • tar:一个对镜像打包的文件,日后可以还原成镜像

2.2Docker运行流程

image-20200404120356784

3.镜像

镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。

3.1 为什么一个镜像会那么大?

image-20200404142950068

镜像就是花卷

  • UnionFS(联合文件系统):

    Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 。

3.2 Docker镜像原理

docker的镜像实际是由一层一层的文件系统组成。

  • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。

  • rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。

  • 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QoxY2vzy-1634193832044)(https://wywtypora.oss-cn-shanghai.aliyuncs.com/image/1567585172(1)].jpg)

3.3为什么docker镜像要采用这种分层结构呢?

最大的一个好处就是资源共享

  • 比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。

4.安装docker

4.1移除以前docker相关包

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

4.2配置yum源

sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.3安装docker

# 复制代码
sudo yum install -y docker-ce docker-ce-cli containerd.io

4.4启动

systemctl enable docker --now

4.5配置加速

这里额外添加了docker的生产环境核心配置cgroup

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

5.基本命令

5.1找镜像

docker hub,找到nginx镜像

# 搜索镜像
docker search tomcat
#下载最新版
docker pull nginx 
# 镜像名:版本名(标签)
docker pull nginx:1.20.1
#下载最新
docker pull redis 
docker pull redis:6.2.4
# 下载来的镜像都在本地
docker images  #查看所有镜像
redis = redis:latest
docker rmi 镜像名:版本号/镜像id

5.2启动容器

启动nginx应用容器,并映射88端口,测试的访问

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

【docker run  设置项   镜像名  】 镜像启动运行的命令(镜像里面默认有的,一般不会写)

# -d:后台运行
# --restart=always: 开机自启
docker run --name=mynginx   -d  --restart=always -p  88:80   nginx

# 查看正在运行的容器
docker ps
# 查看所有
docker ps -a
# 删除停止的容器
docker rm  容器id/名字
docker rm -f mynginx   #强制删除正在运行中的

#停止容器
docker stop 容器id/名字
#再次启动
docker start 容器id/名字

#应用开机自启
docker update 容器id/名字 --restart=always

5.3修改容器内容

修改默认的index.html 页面

1、进容器内部修改

# 进入容器内部的系统,修改容器内容
docker exec -it 容器id  /bin/bash

2、挂载数据到外部修改

docker run --name=mynginx   \
-d  --restart=always \
-p  88:80 -v /data/html:/usr/share/nginx/html:ro  \
nginx

# 修改页面只需要去 主机的 /data/html

5.4提交改变

将自己修改好的镜像提交

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

docker commit -a "naumy"  -m "首页变化" 341d81f7504f guignginx:v1.0
# 将镜像保存成压缩包
docker save -o abc.tar guignginx:v1.0
# 别的机器加载这个镜像 离线安装
docker load -i abc.tar

5.5推送远程仓库

推送镜像到docker hub;应用市场

docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname
# 把旧镜像的名字,改成仓库要求的新版名字
docker tag guignginx:v1.0 leifengyang/guignginx:v1.0
# 登录到docker hub
docker login       
# 推送完成镜像后退出
docker logout
# 推送
docker push leifengyang/guignginx:v1.0
# 别的机器下载
docker pull leifengyang/guignginx:v1.0

5.6补充

docker logs 容器名/id   排错

docker exec -it 容器id /bin/bash

# docker 经常修改nginx配置文件
docker run -d -p 80:80 \
-v /data/html:/usr/share/nginx/html:ro \
-v /data/conf/nginx.conf:/etc/nginx/nginx.conf \
--name mynginx-02 \
nginx

#把容器指定位置的东西复制出来 
docker cp 5eff66eec7e1:/etc/nginx/nginx.conf  /data/conf/nginx.conf
#把外面的内容复制到容器里面
docker cp  /data/conf/nginx.conf  5eff66eec7e1:/etc/nginx/nginx.conf

6.Docker安装常用服务

6.1docker 安装MySQL

6.1.1 获取镜像
获取指定版本:docker pull mysql:8.0        获取最新版本:   docker pull mysql

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

6.1.2 通过镜像创建容器并运行
docker run -itd --name mysql8.0 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。 MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。

6.1.3 修改MySQL数据库权限

在这里插入图片描述
进入容器:

docker exec -it 62349aa31687 /bin/bash

进入mysql:

mysql -uroot -p

授权:

mysql> GRANT ALL ON *.* TO 'root'@'%';

刷新权限:

mysql> flush privileges;

更新加密规则:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;

更新root用户密码:

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

刷新权限:

mysql> flush privileges;

6.2docker操作redis

6.2.1 docker进入redis
#运行容器
docker run -itd --name redis-test -p 6379:6379 redis

#进入镜像
docker exec -it redis-test /bin/bash

#然后输入:
redis-cli

在这里插入图片描述
redis查看所有的key

keys *

redis删除key

del key

在这里插入图片描述

7.Docker-compose

7.1安装Docker-compose

7.1.1Linux官方推荐方法安装Docker-Compose

Linux系统默认是没有安装docker-compose工具的,可以进入下面的网址。

https://docs.docker.com/desktop/

进入亡之后,选择Product Manuals —>Docker compose—>Liunx后,可以看到三条命令,依次执行就可以安装docker-compose工具了。

第一条命令:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 或者
yum install docker-compose

如果一次安装不成功,可以多安装几次。一般是网络问题。

第二条命令:

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

第三条命令:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

安装好以后,用docker-compose --version 进行检查,如果能出现版本,说明安装成功了。

查看是否安装成功:

docker-compose --version

image-20211013110701706

7.2编写docker-compose.yml文件

查询docker-comcpose.yml文件位置,并进行修改。

whereis docker-compose.yml
# 或者
locate docker-compose.yml
# 或者
find / -name "docker-compose*"

image-20211013111353118

7.2.1拉取相关镜像并运行
7.2.2拉取相关镜像
# 拉取sonarqube镜像
$ docker pull sonarqube:9.1.0-community (推荐使用) /  $ docker pull sonarqube:7.6-community
# 拉取postgres镜像
$ docker pull postgres:9.6.23

创建目录:

# 创建目录
mkdir -p /opt/sonarqube

# 进入目录文件夹下面
cd /opt/sonarqube

# 创建文件docker-compose.yml
touch docker-compose.yml

# 保存镜像
docker save -o sonarqube.tar sonarqube:9.1.0-community
docker save -o postgres.tar postgres:9.6.23
docker save -o portainer.tar portainer/portainer

docker load -i postgres.tar
7.2.3创建网桥

使sonarqube容器与postgres在同一个网桥中

docker network create sonarnet

查看创建的网桥

docker network ls

7.3docker-compose.yml文件

docker-compose.yml

version: "3.2"

services:
  sonarqube: #服务名称
    container_name: sonarqube # 相当于run 的 --name
    image: sonarqube:9.1.0-community
    restart: always
    ports:
      - "9001:9000"
    depends_on:
      - postgres
    networks:
      - sonarnet
    environment:
      - sonar.jdbc.username=sonar
      - sonar.jdbc.password=123456
      - sonar.jdbc.url=jdbc:postgresql://postgres:5432/sonarqube
      - SONARQUBE_JDBC_USERNAME=sonar
      - SONARQUBE_JDBC_PASSWORD=123456
      - SONARQUBE_JDBC_URL=jdbc:postgresql://postgres:5432/sonarqube
    volumes:
      - /home/sonar/sonarqube/extensions:/opt/sonarqube/extensions
      - /home/sonar/sonarqube/logs:/opt/sonarqube/logs
      - /home/sonar/sonarqube/data:/opt/sonarqube/data
      - /home/sonar/sonarqube/conf:/opt/sonarqube/conf

  postgres:
    container_name: postgres # 相当于run 的 --name
    image: postgres:9.6.23
    restart: always
    ports:
      - 5432:5432
    networks:
      - sonarnet
    environment:
      - ES_JAVA_POTS="-Xms128m -Xmx128m"
      - TZ=Asia/Shanghai
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=123456
      - POSTGRES_DB=sonarqube
    volumes:
      - /home/sonar/postgres/postgresql:/var/lib/postgresql
      - /home/sonar/postgres/data:/var/lib/postgresql/data

  potainer:
    container_name: potainer # 相当于run 的 --name
    image: portainer/portainer
    container_name: portainer
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    ports:
      - "8000:8000"
      - "9000:9000"

volumes:
  portainer_data:

networks:
  sonarnet:
    driver: bridge
    external:
      true   #使用外部指定网桥  注意:网桥必须存在

终端里输入下面的命令,就可以开启wordpress容器了。

docker-compose up

但这时候的容器开启方式是有日志输出的,并且窗口被占用了。没办法进行其它操作了。可以加入-d参数,解决这个问题。

docker-compose up -d

7.4查询docker-compose.yml文件位置

查询docker-compose.yml文件位置,并进行修改。

whereis docker-compose.yml
# 或者
locate docker-compose.yml

# 查看相关的yml文件路径
find / -name "docker-compose.yml"

image-20211013111353118

7.5Portainer 可视化工具

image-20201223231707738

输入用户名和密码:

用户名:admin

密码:12345678

image-20211014102459716

Manage the Docker environment where Portainer is running.

Ensure that you have started the Portainer container with the following Docker flag:

-v "/var/run/docker.sock:/var/run/docker.sock" (Linux).

or

-v \\.\pipe\docker_engine:\\.\pipe\docker_engine (Windows).

8.dockerfile

运行springboot应用:

localhost:8080/hello

编写dockerfile


# docker应用运行环境
FROM openjdk:8-jdk-slim
LABEL maintainer=naumy

COPY target/*.jar   /app.jar

# 项目启动命令
ENTRYPOINT ["java","-jar","/app.jar"]
# 构建镜像
docker build -t java-demo:v1.0 .

# 运行容器
docker run -d -p 8080:8080 --name myjava-app java-demo:v1.0 

# 查看结果
139.198.167.214:8080/hello

139.198.167.214:8080/hello

Kubernetes基础概念

img

我们急需一个大规模容器编排系统

kubernetes具有以下特性:

  • 服务发现和负载均衡
    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排
    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • 自动部署和回滚
    你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

  • 自动完成装箱计算
    Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。

  • 自我修复
    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理
    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移、部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary 部署

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值