1 Docker概述

我们写的代码会接触到好几个环境:开发环境、测试环境以及生产环境等等。多种环境去部署同一份代码,由于环境原因往往会出现软件跨环境迁移的问题(也就是**“水土”不服**)
我们可以将工程及此工程依赖的所有软件打包到一个容器中统一部署

1.1 docker概念

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

  • Docker 是一个开源的应用容器引擎
  • Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
  • 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
  • 容器是完全使用沙箱机制,相互隔离
  • 容器性能开销极低。
  • Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

1.2 安装docker

1.2.1 安装docker

Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,

笔记基于CentOS7 安装Docker。官网:https://www.docker.com

环境要求:centos7的虚拟机(账号:root 密码:itcast )

安装docker (NAT模式-为确保可以联网下载)

# 1、yum 在线安装 
yum install docker -y 
#2、启动docker
systemctl start/stop/restart docker     
#3、查看docker状态
systemctl status docker

1.2.2 docker架构

在这里插入图片描述

1.2.3 docker的使用流程

1.配置docker镜像加速

2.从docker仓库下载镜像到宿主机  docker仓库地址:https://hub.docker.com/

3.通过镜像启动生成容器环境

1)配置镜像加速

默认情况下,从docker hub(https://hub.docker.com/)上下载docker镜像太慢。一般都会配置镜像加速器:

  • 中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
  • 阿里云镜像加速器
  • 网易云镜像加速器
  • 腾讯云镜像加速器
修改文件并配置

在linux中打开:/etc/docker/daemon.json文件,并导入镜像地址

直接 vi /etc/docker/daemon.json

中科大镜像地址
{
 "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
重新启动docker–docker相关的命令
#重启
systemctl restart docker
#查看docker信息
docker info

#启动docker服务:
systemctl start docker 
#停止docker服务:
systemctl stop docker 
#重启docker服务:
systemctl restart docker
#查看docker服务状态:
systemctl status docker 
#设置开机启动docker服务:
systemctl enable docker

2)从docker仓库下载镜像到宿主机–镜像相关的命令

#1 查看镜像: 查看本地所有的镜像
docker images

#2 搜索镜像:从网络中查找需要的镜像
docker search 镜像名称

#3 拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号
如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。
docker pull 镜像名称:版本号  /  docker pull 镜像名称(默认的版本号是latest)
		docker pull mysql:5.7  /  docker pull mysql

#4 删除镜像: 删除本地镜像
docker rmi 镜像id # 删除指定本地镜像

3)通过镜像启动生成容器环境(重点)–容器相关命令

#查看容器
docker ps # 查看正在运行的容器
docker ps -a #查看所有容器,包括未运行的容器

#创建并启动容器  
docker run -id --name=自定义容器名称 -p 映射端口:镜像端口 镜像名称 
run:启动
-id/-di:  创建容器
--name:  为创建的容器起别名
-p: 端口映射


#停止容器
docker stop 容器名称
#启动容器
docker start 容器名称
#删除容器
docker rm 容器名称

启动nginx

命令:docker run -di --name=my_nginx1 -p 81:80 nginx

设置网络

如果运行完容器后会出现以下信息,那么需要设置一下网络配置
在这里插入图片描述

解决办法:
#编译配置文件
vi /etc/sysctl.conf
#在末尾添加这段代码
net.ipv4.ip_forward=1 

#重启network服务
systemctl restart network 
#重启docker(容器就关闭了)
systemctl restart docker
#启动容器
docker start 容器名称 

启动MySql

命令:docker run -di --name=my_mysql1 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

Docker 容器删除后,在容器中产生的数据也会随之销毁,如何能做到容器删除 数据不删除

数据卷

什么是数据卷

数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以挂载多个数据卷。

数据卷作用

容器数据持久化、容器之间数据交换
在这里插入图片描述

配置数据卷

创建启动容器时,使用 –v 参数 设置数据卷

#启动容器,挂载数据卷 注意冒号前后不能有空格
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...

在这里插入图片描述

#先在root目录先创建一个文件夹 ,因为要做数据卷映射
cd ~
mkdir data
#启动容器,挂载数据卷
docker run -di --name=自定义容器名称 -v /root/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456  mysql:5.7 
 

查看mysql的日志会发现有权限不足的问题:docker logs my_mysql

–privileged :容器内的root拥有真正的root权限.否则,容器内的root只是外部的一个普通用户权限

docker run -id --name=my_mysql777 --privileged=true -p 33307:3306  -v /root/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456  mysql:5.7 

删除当前数据库容器

#先停止
docker stop my_mysql
#再删除
docker rm my_mysql

测试创建一个新的数据库容器挂在数据卷 查看是否有travel数据:有!

启动tomcat

需求: 在Docker容器中部署Tomcat,并通过外部机器访问Tomcat部署的项目。

创建启动容器

docker run -di --name=my_tomcat1 -p 8080:8080 tomcat:8.5

问题:发现访问不到页面

查看tomcat容器所在的目录

docker exec -it my_tomcat1 /bin/bash

发现webapp下没有任何页面

#退出
exit

将页面放入数据卷中(/root/webapps) 进行挂在

docker run -id --name=my_tomcat666 --privileged=true -v /root/webapps:/usr/local/tomcat/webapps -p 8081:8080 tomcat:8.5

直接把要部署的资源直接放到宿主机的 /root/webapps文件夹中即可
在这里插入图片描述

启动Redis

创建启动容器

docker run -di --name=my_redis1 -p 63779:6379 redis

4 Dockerfile(了解)

程序员可以通过Dockerfile制作镜像,在linux中启动变成容器运行

比如:将springboot生成的jar包通过Dockerfile制作成镜像 在inux中启动运行

​ springboot:jar包—》Dockerfile—》镜像—》容器(springboot项目的运行环境)

4.1 Docker 镜像原理

镜像原理
在这里插入图片描述

4.2 Dockerfile概念及作用

在这里插入图片描述

4.4 案例

**需求:**定义dockerfile,发布springboot项目

实现步骤:

#1.定义父镜像(定义当前工程依赖的环境):
FROM java:8
#2.定义作者信息(可以省略不写):
MAINTAINER  itheima
#3.将jar包添加到容器(将jar包存入镜像中): 
ADD hello-1.0-SNAPSHOT.jar hello.jar
#4.指定这个容器对外暴露的端口号
EXPOSE 8888
#5.定义容器启动执行的命令: 当通过此镜像启动容器的时候,执行的命令
ENTRYPOINT ["java","-jar","/hello.jar"]

(3) 通过dockerfile构建镜像

#通过dockerfile构建镜像:执行这个名称是my_hello的dockerfile文件 -f: from  -t: to
docker build -f my_hello -t my_hello_image . 
# 最后一个点不要忽略

(4) 启动容器

#创建启动容器
docker run -id --name=自定义名称 -p 端口  镜像名称

5 Docker服务编排(了解)

服务编排:批量管理所有容器进行统一启动/停止删除

5.1 服务编排

微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。

  • 要从Dockerfile build image 或者去dockerhub拉取image
  • 要创建多个container
  • 要管理这些container(启动停止删除)

**服务编排:**按照一定的业务规则批量管理容器

5.2 Docker Compose(服务编排) 概述

Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:

  1. 利用 Dockerfile 定义运行环境镜像
  2. 使用 docker-compose.yml 定义组成应用的各服务
  3. 运行 docker-compose up 启动应用

5.3 安装

5.3.1 安装Docker Compose

# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose
# 查看版本信息 
docker-compose -version

5.3.2 卸载Docker Compose

# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

5.4 案例

通过docker compose进行容器批量管理:一次性启动三个容器(nginx,tomcat,redis)

步骤:

(1) 定义一个Docker Compose配置文件

  • docker-compose.yml
  • 定义需要的容器
  • 每个容器的配置

(2) 进入docker-compose.yml所在的目执行docker-compose up -d 命令批量执行

开始操作:

(1) 创建docker-compose目录

mkdir ~/docker-compose
cd ~/docker-compose

(2) 定义docker-compose.yml 文件

vi docker-compose.yml 内容如下

version: '3'
services: 
  nginx:
   container_name: my_nginx
   image: nginx
   ports:
    - 80:80
    
  tomcat:
   container_name: my_tomcat
   image: tomcat:8.5
   ports:
    - 8080:8080    
  
  redis:
   container_name: my_redis
   image: redis
   ports:
    - 6379:6379        

(3) 启动容器

在执行命令之前应该把上面的那些容器关闭并且删除

在这里插入图片描述

执行此命令的时候,需要和配置文件再同一个目录下

docker-compose up -d

关闭容器并且删除

docker-compose down 

docker与虚拟机比较

相同:

  • 容器和虚拟机具有相似的资源隔离和分配优势

不同:

  • 软件在虚拟机中 软件在docker中
  • 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
  • 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统
Docker 虚拟机
启动速度 秒级 分钟级
硬盘使用 一般为MB 一般为G
CPU/内存消耗
支持数量 上百个 十几个
可视化管理 不成熟 成熟

上图来一个直观的比较:

在这里插入图片描述

虚拟机已死,容器才是未来

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐