赞
踩
在说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 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们使用社区版。
Docker是一种轻量级的操作系统虚拟化解决方案,Docker基础是Linux容器(LXC)技术,是对软件和期以来环境的标准化打包,应用之间相互隔离,共享一个OS
Docker支持CentOS6及以后版本
使用如下命令查看是否安装了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 Engine release notes | Docker Documentation
安装后,使用下面三个皆可
- //注意:这里两个 横线 ‘--’
- docker --version
-
- docker version
-
- docker -v
根据查看安装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
查看docker系统信息
docker info
查看帮助信息
docker
查看某个common的命令帮助信息
docker commond --help
启动
- 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
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:大小
从客户机上访问容器,需要有端口映射;docker容器默认此阿勇桥接模式与宿主机通信,需要将宿主机的IP端口映射到容器的IP端口上 使用 -p 参数
- //映射8080 也可以,博主使用的 9090
- docker run -d -p 9090:8080 tomcat:9.0
- 或者
- docker run -d -p 9090:8080 镜像ID
docker exec -it 镜像ID /bin/bash
退出容器:exit
Docker使用客户端-服务端(C/S)架构模式,使用远程API管理创建Docker容器
Docker容器通过 Docker镜像来创建
镜像与容器关系类似面向对象编程中类与对象关系
Docker | 面向对象 |
镜像 | 类 |
容器 | 对象 |
Docker包括三个核心要素
镜像(Image)、容器(Container)、仓库(Repository)
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
容器是镜像的运行时实例。正如从虚拟机模板上启动 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)
仓库(Repository)是集中存储镜像的地方,这里有个概念要区分一下,那就是仓库与仓库服务器(Registry)是两回事,像我们上面说的Docker Hub,就是Docker官方提供的一个仓库服务器,不过其实有时候我们不太需要太过区分这两个概念
Docker Hub是Docker官方建立的中央镜像仓库,同时也是Docker Engine的默认镜像仓库,所以使用Docker Hub是开发者共享镜像的首选,常用服务软件的镜像都能在Docker Hub中找到
仓库分为公共仓库和私有仓库,公共仓库一般是指Docker Hub
我们可以在 Dockers Hub中搜索需要需要使用的镜像
国内常用的镜像仓库是阿里云容器镜像仓库
(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'@'%';
在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
Dockerfile是用来构建docker镜像的文本文件,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、镜像发布到阿里云镜像仓库
阿里云镜像仓库
注册、登录阿里云账号;淘宝、支付宝账号可以登录进入控制台或者管理中心,直接搜索【容器镜像服务】,选择【实力列表】,可以创建一个【镜像仓库】,必须先创建一个【命名空间】
(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
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
我们可以理解为数据库中的提交事务,未提交事务会导致数据没保存成功
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。