在说Docker之前,我们先说说传统服务器

传统的独立服务器,它是一个独立的硬件设备,可以理解成是一台放在机房的高配置电脑;有独立的处理器、内存、硬盘、带宽等资源,可根据需求安装各种操作系统以及配置各种环境

这种服务器缺点:

1、花费成本较高(时间成本,资金成本)

2、应用迁移比较麻烦,需要重新购买服务器,安装操作系统,配置运行环境,部署应用

因此出现了虚拟化技术,主要分为

硬件虚拟化(hardware-level-virtualization)

操作系统虚拟化(os-level-virtualization)

硬件虚拟化 是运行在硬件之上的虚拟化技术,技术核心是Hypervisor,Hypervisor是一种运行在基础物理服务器之上的软件层,可以虚拟化硬件资源,如CPU、硬盘、内存等,然后在虚拟化出来的资源上安装操作系统,就是所谓的虚拟机,如VMWare,VirtualBox等

操作系统虚拟化 是运行在操作系统之上的虚拟化技术,它模拟的是运行在一个操作系统上的多个不同进程,并将其封装在一个密闭的容器里面,也称为容器化技术,如Docker

VM:使用Hypervisor提供虚拟机的运行平台,管理每个VM中操作系统的运行。每个VM都要有自己的操作系统、应用程序和必要的依赖文件等

Docker容器:使用Docker引擎进行调度和隔离,提高了资源利用率,在相同硬件能力下可以运行更多的容器实例;每个容器拥有自己的隔离化用户空间

相较于VM,Docker容器作为一种轻量级的虚拟化方式,在应用方面具有以下显著优势:

1、Docker容器可以在秒级时间内快速启动和停止,相较传统虚拟机显著提升

2、Docker容器对系统资源要求低,数千个Docker容器可同时运行在同一个主机上。Docker容器通过类似Git的操作来方便用户获取和更新应用镜像

3、Docker容器通过Dockerfile配置文件实现自动化创建和灵活部署,提高工作效率

4、Docker容器除了运行其中的应用之外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。

下图可直观了解Docker容器与传统VM方式的区别:

一、Docker简介

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们使用社区版。

Docker是一种轻量级的操作系统虚拟化解决方案,Docker基础是Linux容器(LXC)技术,是对软件和期以来环境的标准化打包,应用之间相互隔离,共享一个OS

Docker支持CentOS6及以后版本

Docker 官网:https://www.docker.com

Github Docker 源码:https://github.com/docker/docker-ce

DockerHub镜像仓库:https://hub.docker.com/

二、Docker安装启动

1、Docker安装

使用如下命令查看是否安装了docker

yum list installed | grep docker 

简单安装命令(这个安装的Docker版本偏旧,1.13.x

//-y 参数表示直接确认,不然会跳出一个确认框,输入Y/N
yum install docker -y

我们可以按照下述方式安装指定版本Docker 

//更新docker的yum源
yum install wget -y

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

//安装指定版本的docker:
yum install docker-ce-20.10.0 -y

安装、卸载可参考官网最新文档

Install Docker Engine on CentOS | Docker Documentation

Docker版本说明

Docker Engine release notes | Docker Documentation

安装后,使用下面三个皆可

//注意:这里两个 横线 ‘--’
docker --version

docker version

docker -v

2、卸载

根据查看安装docker命令,可查看docker安装文件,将其移除

首先查看docker运行状态

systemctl status docker 

如果是运行状态,将其停用

systemctl stop docker

查看yum安装的docker文件包

 yum list installed |grep docker

 查看docker相关的rpm源文件

rpm -qa |grep docker

依次删除所有安装的docker文件包,如

yum -y remove docker-ce.x86_64
yum -y remove docker-ce-cli.x86_64
yum -y remove docker-ce-rootless-extras.x86_64
yum -y remove docker-scan-plugin.x86_64

删完之后可以再查看下docker rpm源

删除docker的镜像文件,默认在/var/lib/docker目录下 ,使用 pwd 查看

 

删除上述的docker目录

rm -rf /var/lib/docker

 3、docker服务信息

查看docker系统信息

docker info

查看帮助信息

docker 

 查看某个common的命令帮助信息

docker commond --help

4、启动、停止docker服务

启动

systemctl start docker 或者
service docker start

 停止

systemctl stop docker 或者
service docker stop

重启

systemctl restart docker 或者
service docker restart

 查看docker运行状态

systemctl status docker 或者
service docker status

查看docker进程

ps -ef | grep docker

5、Docker运行机制

1、启动docker服务

2、找镜像,Docker运行容器前先在本地查找是否存在对应的镜像,如果本地不存在对应的镜像,Docker会从镜像仓库下载镜像

(1)从docker hub 官网搜索需要使用的镜像

Docker镜像仓库 https://registry.hub.docker.com/

一般下载 带 Official Image 标志的官方镜像

 (2)直接使用命令行使用搜索命令,如

docker search tomcat

STARS:星数

OFFICIAL:是否官方的 

下载镜像

// 下面两种方式一样的,默认下载最新版  :latest 即为最新版本
docker pull tomcat
docker pull tomcat:latest

//也可下载其他版本,如
docker pull tomcat:9.0

3、运行镜像,启动镜像得到对应容器

// -d 表示后台运行
docker run -d tomcat:9.0
docker run -d docker.io/tomcat
docker run -d 镜像ID

查看Tomcat镜像是否启动容器成功 

ps -ef | grep tomcat

查看本地镜像

docker images

REPOSITORY:仓库,如docker.io/tomcat

TAG:镜像标记,如 latest

IMAGE ID:镜像ID

CREATED:  创建时间

SIZE:大小

6、客户机访问容器

从客户机上访问容器,需要有端口映射;docker容器默认此阿勇桥接模式与宿主机通信,需要将宿主机的IP端口映射到容器的IP端口上  使用 -p 参数

//映射8080 也可以,博主使用的 9090
docker run -d -p 9090:8080 tomcat:9.0
或者
docker run -d -p 9090:8080 镜像ID

7、进入Docker容器

docker exec -it 镜像ID /bin/bash

退出容器:exit

三、Docker核心组件

Docker使用客户端-服务端(C/S)架构模式,使用远程API管理创建Docker容器

Docker容器通过 Docker镜像来创建

镜像与容器关系类似面向对象编程中类与对象关系

Docker面向对象
镜像
容器对象

Docker包括三个核心要素

镜像(Image)容器(Container)仓库(Repository)

1、镜像(Image)

Docker镜像就是一个只读模板,用来创建Docker容器。它与操作系统的安装光盘有点像

Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像由很多层文件系统叠加构成,最下面是一个引导文件系统bootfs,第二层是一个root文件系统rootfs,root文件系统通常是某种操作系统,如centos,Ubuntu,在root文件系统之上又有很多层文件系统,这些文件系统叠加在一起,构成Docker镜像

 镜像命令概览

1、下载镜像

// 下面两种方式一样的,默认下载最新版  :latest 即为最新版本
docker pull tomcat
docker pull tomcat:latest

//也可下载其他版本,如
docker pull tomcat:9.0

2、查看已下载镜像

 latest 是镜像标签,表示最新的镜像版本

docker images
或者
docker images tomcat

获取镜像方式

(1)官方docker仓库搜索下载

(2)通过Dockerfile文件构建

 如果没有官方镜像,才会通过Dockerfile文件构建

3、运行镜像,可得到容器

从客户机上访问容器,需要有端口映射;docker容器默认此阿勇桥接模式与宿主机通信,需要将宿主机的IP端口映射到容器的IP端口上  使用 -p 参数

//映射8080 也可以,博主使用的 9090
docker run -d -p 9090:8080 tomcat:9.0
或者
docker run -d -p 9090:8080 镜像ID

查看Tomcat进程 

ps -ef | grep tomcat

4、查看容器镜像状态

//查看运行中容器
docker ps

//查看所有容器
docker ps -a

CONTAINER ID:每个容器的唯一标识符号,自动生成。类似于数据库中的主键

IMAGE :创建容器使用的镜像名称

COMMAND:运行容器时的命令

CREATED:容器创建的时间

STATUS:容器的运行状态,Up 8 months 指容器已运行8个月
        -created(已创建)
        -restarting(重启中)
        -running(运行中)
        -removing(迁移中)
        -paused(暂停)
        -exited(停止)
        -dead(死亡)
PORTS:容器开放的端口信息。
NAME:容器的别名,在运行容器执行docker run 时可使用 --name进行指定

5、进入容器

docker exec -it 镜像ID /bin/bash

退出容器:exit

6、删除镜像

docker rmi 镜像ID
或者
docker rmi tomcat:9.0

2、容器(Container)

容器是镜像的运行时实例。正如从虚拟机模板上启动 VM 一样,用户也同样可以从单个镜像上启动一个或多个容器。

每个容器相互隔离,保证平台安全,一个容器可以看做一个简易版的Linux系统

Docker利用容器来运行应用,镜像只读,容器在启动时创建一层可写层作为最上层

1、启动容器有两种方式

(1)基于镜像新建一个容器启动

docker run -d tomcat

(2)重新启动终止状态的容器

docker start 容器id 或 容器名
或者
docker restart 容器id 或 容器名
//查看运行中容器
docker ps

//查看所有容器
docker ps -a

2、停止容器

docker stop 容器ID 或 容器名

 3、删除容器

注:

删除容器时,容器必须是停止状态,否则报错

docker stop 容器ID 或 容器名

docker rm 容器ID 或 容器名

4、进入容器

docker exec -it 容器ID 或 容器名 /bin/bash

5、查看容器更多信息

docker inspect 容器ID 或 容器名

 6、停用全部运行中的容器

docker stop $(docker ps -q) 

7、删除全部容器:

docker rm $(docker ps -aq)

8、一条命令实现停用并删除容器

docker stop $(docker ps -q) & docker rm-f $(docker ps -aq)

3、仓库(Repository)

仓库(Repository)是集中存储镜像的地方,这里有个概念要区分一下,那就是仓库与仓库服务器(Registry)是两回事,像我们上面说的Docker Hub,就是Docker官方提供的一个仓库服务器,不过其实有时候我们不太需要太过区分这两个概念

Docker Hub是Docker官方建立的中央镜像仓库,同时也是Docker Engine的默认镜像仓库,所以使用Docker Hub是开发者共享镜像的首选,常用服务软件的镜像都能在Docker Hub中找到

仓库分为公共仓库和私有仓库,公共仓库一般是指Docker Hub

我们可以在 Dockers Hub中搜索需要需要使用的镜像

 国内常用的镜像仓库是阿里云容器镜像仓库

https://dev.aliyun.com/

4、docker安装MySQL示例

(1)下载MySQL镜像

docker pull mysql:latest

(2)运行MySQL镜像得到容器,并映射端口

docker run -d -p 3306:3306 -e MYSQL_DATABASE=mydb -e MYSQL_ROOT_PASSWORD=123456 mysql:latest

-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务

MYSQL_DATABASE=mydb:设置 MySQL 服务 使用的数据库

MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码

docker run 后面还可以跟 --restart always等命令

1、--restart=always:当 Docker 重启时,容器能自动启动

docker run --restart 具体参数值详细信息

no -  容器退出时,不重启容器;

on-failure - 只有在非0状态退出时才从新启动容器;

        –restart=on-failure:10 : 表示最多重启10次

always - 无论退出状态是如何,都重启容器;
 

2、--privileged=true:挂载宿主机目录,不会报权限问题 

如果docker run 的时候没有加 --restart=always ,然后已经运行的docker容器,执行下面命令 

# demo : 你的容器名称
docker update –-restart=always demo

(3)进入容器

docker exec -it 容器ID或者mysql名 /bin/bash

(4)登录MySQL

mysql -u root -p

修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'

授权添加远程用户登录访问

CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';

5、docker安装SQL Server示例

在docker hub中搜索 “Microsoft SQL Server”

https://registry.hub.docker.com/_/microsoft-mssql-server

(1)下载SQL Server镜像

docker pull mcr.microsoft.com/mssql/server:2019-latest

  

(2)运行SQL Server镜像得到容器,并映射端口

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=yourStrong(!)Password" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest

四、Docker自定义镜像

Dockerfile是用来构建docker镜像的文本文件,Dockerfile文件由一行行命令语句组成

1、Dockerfile基本结构

基础镜像信息

维护者信息

镜像操作指令

容器启动时执行指令

2、Dockerfile指令

(1)FROM

FROM 指令用于指定要构建的镜像的基础镜像。它通常是 Dockerfile 中的第一条指令

格式为:  FROM <image> 或者 FROM <image>:<tag>

(2)MAINTAINER

指定维护者信息

格式为: MAINTAINER <name>

(3)ENV 

指定环境变量

ENV <key> <value>

(4)ADD 或者 COPY

复制文件或者目录到容器里指定路径

ADD <src> <dest>

COPY <src> <dest>

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)

ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>

ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定

(5)EXPOSE

说明Docker 服务端容器暴露的端口号,在启动容器时通过 -p 映射端口

默认协议为 tcp ,若是 udp 协议,则需要在后面添加 udp ,如 80/udp

EXPOSE <port> [<port>/<protocol>...]

EXPOSE 8080,表明容器在运行时提供8080端口,在启动该容器时需端口映射

(6)RUN

在当前镜像基础上执行命令并创建新的镜像层,通常用于更新或安装软件

RUN <command>

(7)CMD

指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令,指定多条,只有最后一条会被执行

如果启动容器时指定了运行命令,会覆盖掉CMD指定的命令

如下Dockerfile示例

Dockefile文件样例:
FROM XXX/jdk:8
MAINTAINER docker_user
ENV JAVA_ HОМE /usr/local/java
ADD apache -tomcat-8.0.32. tar.gz /usr/local/
RUN mv apache-tomcat-8.0.32 tomcat8
ÉXPOSE 8080
RÚN chmod u+x /usr/local/tomcat8/bin/* .sh
CMD /usr/ local/tomcat8/bin/catalina.sh start

1、自定义JDK镜像

FROM centos:latest
MAINTAINER admin
ADD jdk-8u121-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_121
ËNV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
CMD java -version

构建镜像

使用当前目录的Dockerfile文件创建镜像并设置标签

"."代表当前目录

-t参数设置标签

docker build -t admin_jdk1.8.0_121 .

 2、自定义Tomcat镜像

FROM admin_jdk1.8.0_121
MAÌNTAINER admin
ADD apache-tomcat-8.5.24.tar.gz /usr/local/
ENV CATALINA_ HОME/usr/local/apache-tomcat-8.5.24
ENV PATH $PATH:$CATALINA_ HOME/Iib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.24/bin/catalina.sh run

3、自定义MySQL镜像

FROM centos:centos8
MAINTAINER admin
RUN yum install mysql-server mysqI -y
RUN /etc/init.d/mysqld start &&\
    mysql -e "grant all privileges on *.* to 'root'@'%' identified by '123456' WITH
GRANT OPTION ;" &&\
    mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456'WITH GRANT OPTION ;" &&\
    mysql -uroot -p123456 -e "show databases;"
EXPOSE 3306
CMD /ûsr/bin/mysqld_safe

3、镜像发布到阿里云镜像仓库

阿里云镜像仓库

https://dev.aliyun.com/

注册、登录阿里云账号;淘宝、支付宝账号可以登录进入控制台或者管理中心,直接搜索【容器镜像服务】,选择【实力列表】,可以创建一个【镜像仓库】,必须先创建一个【命名空间】

 (1)登录阿里云 Docker Registry

docker login -username=xx@aliyun.com registry.cn-hangzhou.aliyuncs.com

登录的用户名即为阿里云账号,密码为开通服务时设置的密码

(2)将镜像推送到 Registry

docker tag [lmageld] registry.cn-hangzhou.aliyuncs.com/123test/1234test:[镜像版本号心]
docker push registry.cn-hangzhou.aliyuncs.com/123test/1234test:[镜像版本号]

根据实际镜像信息替换示例中的[lmageld]和[镜像版本号]参数

镜像加速器

/etc/docker/daemon.json

五、Docker部署应用

1、部署一个SpringBoot项目

(1)将springboot程序打包成jar或者war

(2)将jar或者war包上传到Linux某个目录下,如 /root/docker 

(3)定义Dockerfile文件,创建项目镜像

2、定义jar包的Dockerfile文件

FROM admin_jdk1.8.0_121
MAINTAINER admin
ADD springboot-web-1.0.0.jar /opt
RUN chmod +X /opt/springboot-web-1.0.0.jar
CMD java -jar /opt/springboot-web-1.0.0.jar

3、构建jar包程序镜像

构建镜像: docker build -t springboot-web-jar .
运行容器: docker run -d 镜像ID

运行容器之后我们可以查看运行日志

docker logs -f --tail=100 容器名称

4、jar包程序依赖容器环境

运行Redis容器: docker run -p 6379:6379 -d redis
运行MySQL 容器: docker run -p 3306:3306 -e MYSQL_DATABASE=mydb -e
MYSQL_ ROOT_ _PASSWORD=123456 -d mysql:latest

MySQL容器启动后,我们可以通过远程IP + 端口,以及用户密码访问数据库,此时如果关闭MySQL容器会导致数据丢失

因此修改容器之后需要保存

docker commit 容器id xxx(镜像名:tagxxx)

如:
docker commit 容器ID admin_mysql_new

我们可以理解为数据库中的提交事务,未提交事务会导致数据没保存成功 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐