文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Docker使用详解

2023-09-03 15:36

关注

Docker

Docker基础篇

目标:

1 Docker简介

1.1 什么是虚拟化

在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用

虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。

1.2 什么是Docker

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

为什么选择Docker?

(1)上手快。

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

(2)职责的逻辑分类

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

(3)快速高效的开发生命周期

Docker的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker就像一个盒子,里面可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件件的取。)

(4)鼓励使用面向服务的架构

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

1.3 容器与虚拟机比较

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

1-1

与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。

1.4 Docker 组件

1.4.1 Docker服务器与客户端

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

1.4.2 Docker镜像与容器

镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:

也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。

所以Docker容器就是:

Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。 和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。

1.4.3 Registry(注册中心)

Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。

https://hub.docker.com/

2 Docker安装与启动

2.1 安装Docker

Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。

由于我们的环境都使用的是CentOS,因此这里我们将Docker安装到CentOS上。注意:这里建议安装在CentOS7.x以上的版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境而且Docker很多补丁不支持更新。

(1)yum 包更新到最新

sudo yum update

(2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

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

(3)设置yum源为阿里云

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

(4)安装docker

sudo yum install docker-ce

(5)安装后查看docker版本,出现输入的界面都按 y

docker -v

2.2 设置ustc的镜像

ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。

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

编辑该文件:

vi /etc/docker/daemon.json  

在该文件中输入如下内容:

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

2.3 Docker的启动与停止

systemctl命令是系统服务管理器指令

启动docker:

systemctl start docker

停止docker:

systemctl stop docker

重启docker:

systemctl restart docker

查看docker状态:

systemctl status docker

开机启动:

systemctl enable docker

查看docker概要信息

docker info

查看docker帮助文档

docker --help

3 常用命令

3.1 镜像相关命令

3.1.1 查看镜像
docker imagesdocker images –q ### 查看所有镜像的id

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

3.1.2 搜索镜像

如果你需要从网络中查找需要的镜像,可以通过以下命令搜索

docker search 镜像名称
3.1.3 拉取镜像

拉取镜像就是从中央仓库中下载镜像到本地

docker pull 镜像名称

例如,要下载centos7镜像

docker pull centos:7
3.1.4 删除镜像

按镜像ID删除镜像

docker rmi 镜像ID docker rmi `docker images -q` ### 删除所有本地镜像

删除所有镜像

docker rmi `docker images -q`

3.2 容器相关命令

3.2.1 查看容器

查看正在运行的容器

docker ps

查看所有容器

docker ps –a# 格式化查看docker ps -a --format "table {{.Image}}\t{{.ID}}\t{{.Ports}}\t{{.Names}}"   

查看最后一次运行的容器

docker ps –l

查看停止的容器

docker ps -f status=exited
3.2.2 创建与启动容器

创建容器常用的参数说明:

创建容器命令:docker run

(1)交互式方式创建容器

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

这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态

退出当前容器

exit

(2)守护式方式创建容器:

docker run -di --name=容器名称 镜像名称:标签

登录守护式容器方式:

docker exec -it 容器名称 (或者容器ID)  /bin/bash
3.2.3 停止与启动容器

停止容器:

docker stop 容器名称(或者容器ID)

启动容器:

docker start 容器名称(或者容器ID)
3.2.4 文件拷贝

如果我们需要将文件拷贝到容器内可以使用cp命令

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

也可以将文件从容器内拷贝出来

docker cp 容器名称:容器目录 需要拷贝的文件或目录
3.2.5 目录挂载
数据卷

数据卷作用

数据集操作命令

数据卷操作的基本语法如下:

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

创建和查看数据卷

需求:创建一个数据卷,并查看数据卷在宿主机的目录位置

① 创建数据卷

docker volume create html

② 查看所有数据

docker volume ls

结果:

[root@localhost ~]# docker volume lsDRIVER    VOLUME NAMElocal     3a4c170885c97ae1999fec23c0323c3e9b9db8af9ab459b5cd50ef26de546c15local     html

③ 查看数据卷详细信息卷

docker volume inspect html

结果:

[root@localhost ~]# docker volume inspect html[    {        "CreatedAt": "2023-04-05T18:54:45+08:00",        "Driver": "local",        "Labels": {},        "Mountpoint": "/var/lib/docker/volumes/html/_data",        "Name": "html",        "Options": {},        "Scope": "local"    }]

可以看到,我们创建的html这个数据卷关联的宿主机目录为/var/lib/docker/volumes/html/_data目录。

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

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:

### docker run ... –v 宿主机目录(文件):容器内目录(文件) ...docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7

注:

如果你共享的是多级的目录,可能会出现权限不足的提示。

这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题

配置数据卷容器

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

    docker run –it --name=c3 –v /volume centos:7 /bin/bash
  2. 创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷

    docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bashdocker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash  

④ 删除数据卷

 # docker volume rm 数据卷名称 
3.2.6 查看容器IP地址

我们可以通过以下命令查看容器运行的各种数据

docker inspect 容器名称(容器ID) 

也可以直接执行下面的命令直接输出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
3.2.7 删除容器

删除指定的容器:

docker rm 容器名称(容器ID)

4 应用部署示例

4.1 MySQL部署

(1)拉取mysql镜像

docker pull centos/mysql-57-centos7

(2)创建容器

docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

(3)远程登录mysql

连接宿主机的IP ,指定端口为33306

4.2 tomcat部署

(1)拉取镜像

docker pull tomcat:7-jre7

(2)创建容器

创建容器 -p表示地址映射

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

4.3 Nginx部署

(1)拉取镜像

docker pull nginx

(2)创建Nginx容器

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

4.4 Redis部署

(1)拉取镜像

docker pull redis

(2)创建容器

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

5 迁移与备份

5.1 容器保存为镜像

我们可以通过以下命令将容器保存为镜像

## docker commit 容器ID 镜像名称:版本docker commit mynginx mynginx_i

5.2 镜像备份

我们可以通过以下命令将镜像保存为tar 文件

docker  save -o mynginx.tar mynginx_i

5.3 镜像恢复与迁移

首先我们先删除掉mynginx_img镜像 然后执行此命令进行恢复

docker load -i mynginx.tar

​ 执行后再次查看镜像,可以看到镜像已经恢复

6 Dockerfile

6.1 什么是Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。

关键字作用备注
FROM指定父镜像指定dockerfile基于哪个image构建
MAINTAINER作者信息用来标明这个dockerfile谁写的
LABEL标签用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN执行命令执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD容器启动命令提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用
COPY复制文件build的时候复制文件到image中
ADD添加文件build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV环境变量指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG构建参数构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME定义外部可以挂载的数据卷指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE暴露端口定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR工作目录指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER指定执行用户指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK健康检查指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD触发器当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL发送信号量到宿主机该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

6.2 常用命令

命令作用
FROM image_name:tag定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name声明镜像的创建者
ENV key value设置环境变量 (可以写多条)
RUN command是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir设置工作目录

6.3 使用脚本创建镜像

步骤:

(1)创建目录

mkdir –p /usr/local/dockerjdk8

(2)下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录

(3)创建文件Dockerfile vi Dockerfile

#依赖镜像名称和IDFROM centos:7#指定镜像创建者信息MAINTAINER ITCAST#切换工作目录WORKDIR /usrRUN mkdir  /usr/local/java#ADD 是相对路径jar,把java添加到容器中ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/#配置java环境变量ENV JAVA_HOME /usr/local/java/jdk1.8.0_171ENV JRE_HOME $JAVA_HOME/jreENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATHENV PATH $JAVA_HOME/bin:$PATH

(4)

执行命令构建镜像

## -f dockerfile 文件路径## -t 镜像名称&版本## . 路径docker build -t='jdk1.8' .

注意后边的空格和点,不要省略

(5)查看镜像是否建立完成

docker images

7 Docker私有仓库

7.1 私有仓库搭建与配置

(1)拉取私有仓库镜像

docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。可以通过获取官方registry镜像来运行

# registry镜像搭建属于我们自己的私有仓库docker pull registry### 从私有仓库拉取镜像 docker pull 私有仓库服务器ip:5000/centos:7

(2)启动私有仓库容器

docker run -di --name=registry -p 5000:5000 registry

(3)打开浏览器 输入地址http://192.168.184.141:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空

(4)修改daemon.json

vi /etc/docker/daemon.json

添加以下内容,保存退出。

# 修改为主机ip{"insecure-registries":["192.168.184.141:5000"]} 

此步用于让 docker信任私有仓库地址

(5)重启docker 服务

systemctl restart docker

7.2 镜像上传至私有仓库

(1)标记此镜像为私有仓库的镜像

docker tag jdk1.8 192.168.184.141:5000/jdk1.8

(2)再次启动私服容器

docker start registry

(3)上传标记的镜像

docker push 192.168.184.141:5000/jdk1.8

8 ker Compose

一、安装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
二、卸载Docker Compose
### 二进制包方式安装的,删除二进制文件即可rm /usr/local/bin/docker-compose
三、 使用docker compose编排nginx+springboot项目
  1. 创建docker-compose目录
mkdir ~/docker-composecd ~/docker-compose
  1. 编写 docker-compose.yml 文件
version: '3'services:  nginx:   image: nginx   ports:    - 80:80   links:    - app   volumes:    - ./nginx/conf.d:/etc/nginx/conf.d  app:    image: app    expose:      - "8080"
  1. 创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
  1. 在./nginx/conf.d目录下 编写test.conf文件
server {    listen 80;    access_log off;    location / {        proxy_pass http://app:8080;    }   }
  1. 在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
  1. 测试访问
http://192.168.149.135/hello

Docker实用篇

1.初识Docker

1.1.什么是Docker

微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。

1.1.1.应用部署的环境问题

大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:

image-20210731141907366

例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。

1.1.2.Docker解决依赖兼容问题

而Docker确巧妙的解决了这些问题,Docker是如何实现的呢?

Docker为了解决依赖的兼容问题的,采用了两个手段:

image-20210731142219735

这样打包好的应用包中,既包含应用本身,也保护应用所需要的Libs、Deps,无需再操作系统上安装这些,自然就不存在不同应用之间的兼容问题了。

虽然解决了不同应用的兼容问题,但是开发、测试等环境会存在差异,操作系统版本也会有差异,怎么解决这些问题呢?

1.1.3.Docker解决操作系统环境差异

要解决不同操作系统环境差异问题,必须先了解操作系统结构。以一个Ubuntu操作系统为例,结构如下:

image-20210731143401460

结构包括:

应用于计算机交互的流程如下:

1)应用调用操作系统应用(函数库),实现各种功能

2)系统函数库是对内核指令集的封装,会调用内核指令

3)内核指令操作计算机硬件

Ubuntu和CentOSpringBoot都是基于Linux内核,无非是系统应用不同,提供的函数库有差异:

image-20210731144304990

此时,如果将一个Ubuntu版本的MySQL应用安装到CentOS系统,MySQL在调用Ubuntu函数库时,会发现找不到或者不匹配,就会报错了:

image-20210731144458680

Docker如何解决不同系统环境的问题?

如图:

image-20210731144820638

1.1.4.小结

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

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

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

1.2.Docker和虚拟机的区别

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

两者有什么差异呢?

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

Docker仅仅是封装函数库,并没有模拟完整的操作系统,如图:

image-20210731145914960

对比来看:

image-20210731152243765

小结:

Docker和虚拟机的差异:

1.3.Docker架构

1.3.1.镜像和容器

Docker中有几个重要的概念:

一切应用最终都是代码组成,都是硬盘中的一个个的字节形成的文件。只有运行时,才会加载到内存,形成进程。

镜像,就是把一个应用在硬盘上的文件、及其运行环境、部分系统函数库文件一起打包形成的文件包。这个文件包是只读的。

容器呢,就是将这些文件中编写的程序、函数加载到内存中允许,形成进程,只不过要隔离起来。因此一个镜像可以启动多次,形成多个容器进程。

image-20210731153059464

例如你下载了一个QQ,如果我们将QQ在磁盘上的运行文件及其运行的操作系统依赖打包,形成QQ镜像。然后你可以启动多次,双开、甚至三开QQ,跟多个妹子聊天。

1.3.2.DockerHub

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

我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:

image-20210731153743354

1.3.3.Docker架构

我们要使用Docker来操作镜像、容器,就必须要安装Docker。

Docker是一个CS架构的程序,由两部分组成:

如图:

image-20210731154257653

1.3.4.小结

镜像:

容器:

Docker结构:

DockerHub:

1.4.安装Docker

企业部署一般都是采用Linux操作系统,而其中又数CentOS发行版占比最多,因此我们在CentOS下安装Docker。参考:基础篇>>Docker安装与启动

2.Docker的基本操作

2.1.镜像操作

2.1.1.镜像名称

首先来看下镜像的名称组成:

如图:

image-20210731155141362

这里的mysql就是repository,5.7就是tag,合一起就是镜像名称,代表5.7版本的MySQL镜像。

2.1.2.镜像命令

常见的镜像操作命令如图:

image-20210731155649535

2.1.3.案例1-拉取、查看镜像

需求:从DockerHub中拉取一个nginx镜像并查看

1)首先去镜像仓库搜索nginx镜像,比如DockerHub:

image-20210731155844368

2)根据查看到的镜像名称,拉取自己需要的镜像,通过命令:docker pull nginx

image-20210731155856199

3)通过命令:docker images 查看拉取到的镜像

[root@localhost ~]# docker imagesREPOSITORY             TAG            IMAGE ID       CREATED        SIZEnginx                  latest         2d389e545974   6 months ago   142MB
2.1.4.案例2-保存、导入镜像

需求:利用docker save将nginx镜像导出磁盘,然后再通过load加载回来

1)利用docker xx --help命令查看docker save和docker load的语法

例如,查看save命令用法,可以输入命令:

[root@localhost ~]# docker save --helpUsage:  docker save [OPTIONS] IMAGE [IMAGE...]Save one or more images to a tar archive (streamed to STDOUT by default)Options:  -o, --output string   Write to a file, instead of STDOUT[root@localhost ~]#

命令格式:

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

2)使用docker save导出镜像到磁盘

运行命令:

# docker save -o nginx.tar nginx:latest[root@localhost ~]# docker save -o nginx.tar nginx:latest[root@localhost ~]# lsnginx.tar

3)使用docker load加载镜像

先删除本地的nginx镜像:

# docker rmi nginx:latest[root@localhost ~]# docker rmi nginx:latestUntagged: nginx:latestDeleted: sha256:2d389e545974d4a93ebdef09b650753a55f72d1ab4518d17a30c0e1b3e297444Deleted: sha256:363202476290a0db2316a59ad55a204a29c38a3911e3446667cb701cc4198dc7Deleted: sha256:2206f0339ff8e4bea401bd90d6dc4e7e709bc22428c1ae5f68f38c67386c7e7fDeleted: sha256:d70edfab07872218e08147095350ca0ae6e2b6cc21c38468b95d00e9ae8325ccDeleted: sha256:7b46b6757c9a5142df79b3310962da6c7dd41a49a5a51c938d44fdf574b5f8e3Deleted: sha256:39a76abc4386c54429c626f7bc0e378eddf566dad18f6b8a2281e480a5cae071[root@localhost ~]# docker imagesREPOSITORY             TAG            IMAGE ID       CREATED        SIZE[root@localhost ~]# 

然后运行命令,加载本地文件:

# docker load -i nginx.tar[root@localhost ~]# docker load -i nginx.tar9388548487b1: Loading layer [==================================================>]  62.04MB/62.04MBa064c1703bfd: Loading layer [==================================================>]  3.072kB/3.072kB7ee9bf58503c: Loading layer [==================================================>]  4.096kB/4.096kB31192a8593ec: Loading layer [==================================================>]  3.584kB/3.584kB36665e416ec8: Loading layer [==================================================>]  7.168kB/7.168kBLoaded image: nginx:latest[root@localhost ~]# docker imagesREPOSITORY             TAG            IMAGE ID       CREATED        SIZEnginx                  latest         2d389e545974   6 months ago   142MB[root@localhost ~]# 
2.1.5.实践

​ 去DockerHub搜索并拉取一个Redis镜像

2.2.容器操作

2.2.1.容器相关命令

容器操作的命令如图:

image-20210731161950495

容器保护三个状态:

其中:

2.2.2.案例-创建并运行一个容器

创建并运行nginx容器的命令:

# docker run --name containerName -p 80:80 -d nginx[root@localhost ~]# docker run --name nginx-tmp -p 80:80 -d nginx82e5b02c1b22efb698ed0b129a1939924bd4ca7a58972dfb2610d687dca5f5a0

命令解读:

这里的-p参数,是将容器端口映射到宿主机端口。

默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。

现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了:

image-20210731163255863

2.2.3.案例-进入容器,修改文件

需求:进入Nginx容器,修改HTML文件内容,添加“hello word”

提示:进入容器要用到docker exec命令。

步骤

1)进入容器。进入我们刚刚创建的nginx容器的命令为:

# docker exec -it mn bash[root@localhost ~]# docker exec -it nginx-tmp /bin/bashroot@82e5b02c1b22:/# 

命令解读:

2)进入nginx的HTML所在目录 /usr/share/nginx/html

容器内部会模拟一个独立的Linux文件系统,看起来如同一个linux服务器一样:

[root@localhost ~]# docker exec -it nginx-tmp /bin/bashroot@82e5b02c1b22:/# lsbin  boot  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  varroot@82e5b02c1b22:/# 

nginx的环境、配置、运行文件全部都在这个文件系统中,包括我们要修改的html文件。

查看DockerHub网站中的nginx页面,可以知道nginx的html目录位置在/usr/share/nginx/html

我们执行命令,进入该目录:

# cd /usr/share/nginx/htmlroot@82e5b02c1b22:/# cd /usr/share/ningx/htmlbash: cd: /usr/share/ningx/html: No such file or directoryroot@82e5b02c1b22:/# cd /usr/share/nginx/html# 查看目录下文件root@82e5b02c1b22:/usr/share/nginx/html# ls -ltotal 8-rw-r--r--. 1 root root 497 Jul 19  2022 50x.html-rw-r--r--. 1 root root 615 Jul 19  2022 index.htmlroot@82e5b02c1b22:/usr/share/nginx/html# 

查看目录下文件:

image-20210731164455818

3)修改index.html的内容

容器内没有vi命令,无法直接修改,我们用下面的命令来修改:

sed -i -e 's#Welcome to nginx#Hello#g' -e 's###g' index.html

在浏览器访问自己的虚拟机地址,即可看到结果:

image-20230405130007006

2.2.4.小结

docker run命令的常见参数有哪些?

查看容器日志的命令:

查看容器状态:

2.3.数据卷(容器数据管理)

在之前的nginx案例中,修改nginx的html页面时,需要进入nginx内部。并且因为没有编辑器,修改文件也很麻烦。

这就是因为容器与数据(容器内文件)耦合带来的后果。

image-20210731172440275

要解决这个问题,必须将数据与容器解耦,这就要用到数据卷了。

2.3.1.什么是数据卷

**数据卷(volume)**是一个虚拟目录,指向宿主机文件系统中的某个目录。

image-20210731173541846

一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。

这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了

2.3.2.数据集操作命令

数据卷操作的基本语法如下:

docker volume [COMMAND]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

2.3.3.创建和查看数据卷

需求:创建一个数据卷,并查看数据卷在宿主机的目录位置

① 创建数据卷

# docker volume create html[root@localhost ~]# docker volume create htmlhtml

② 查看所有数据

# docker volume ls[root@localhost ~]# docker volume lsDRIVER    VOLUME NAMElocal     html

③ 查看数据卷详细信息卷

# docker volume inspect html[root@localhost ~]# docker volume inspect html[    {        "CreatedAt": "2023-04-05T21:06:36+08:00",        "Driver": "local",        "Labels": {},        "Mountpoint": "/var/lib/docker/volumes/html/_data",        "Name": "html",        "Options": {},        "Scope": "local"    }]

可以看到,我们创建的html这个数据卷关联的宿主机目录为/var/lib/docker/volumes/html/_data目录。

小结

数据卷的作用:

数据卷操作:

2.3.4.挂载数据卷

我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:

# docker run ... –v 宿主机目录(文件):容器内目录(文件) ...docker run \  --name nginx-tmp1 \  -v html:/root/html \  -p 8080:80 \  -d nginx  # 进入容器docker exec -it nginx-tmp1 /bin/bash

这里的-v就是挂载数据卷的命令:

2.3.5.案例-给nginx挂载数据卷

需求:创建一个nginx容器,修改容器内的html目录内的index.html内容

分析:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置/usr/share/nginx/html ,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。

提示:运行容器时使用 -v 参数挂载数据卷

步骤:

① 创建容器并挂载数据卷到容器内的HTML目录

docker run --name nginx-tmp2 -v html:/usr/share/nginx/html -p 80:80 -d nginx

② 进入html数据卷所在位置,并修改HTML内容

### 查看html数据卷的位置docker volume inspect html### 进入该目录cd /var/lib/docker/volumes/html/_data### 修改文件vi index.html
2.3.6.案例-给MySQL挂载本地目录

容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:

如图:

image-20210731175155453

语法

目录挂载与数据卷挂载的语法是类似的:

需求:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器

实现思路如下:

2.3.7.小结

docker run的命令中通过 -v 参数挂载文件或目录到容器中:

数据卷挂载与目录直接挂载的

3.Dockerfile自定义镜像

常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。

而要自定义镜像,就必须先了解镜像的结构才行。

3.1.镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

我们以MySQL为例,来看看镜像的组成结构:

image-20210731175806273

简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。

我们要构建镜像,其实就是实现上述打包的过程。

3.2.Dockerfile语法

构建自定义的镜像时,并不需要一个个文件去拷贝,打包。

我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。

而描述上述信息的文件就是Dockerfile文件。

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

image-20210731180321133

更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

3.3.构建Java项目

3.3.1.基于Ubuntu构建Java项目

需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目

步骤如下:

最后访问 http://主机IP:8090/hello,其中的ip为虚拟主机IP

3.3.2.基于java8构建Java项目

虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。

例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。

需求:基于java:8-alpine镜像,将一个Java项目构建为镜像

实现思路如下:

3.4.小结

小结:

  1. Dockerfile的本质是一个文件,通过指令描述镜像的构建过程

  2. Dockerfile的第一行必须是FROM,从一个基础镜像来构建

  3. 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine

4.Docker-Compose

Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!

image-20210731180921742

4.1.初识DockerCompose

Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:

version: "3.8" services:  mysql:    image: mysql:5.7.25    environment:     MYSQL_ROOT_PASSWORD: 123     volumes:     - "/tmp/mysql/data:/var/lib/mysql"     - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"  web:    build: .    ports:     - "8090:8090"

上面的Compose文件就描述一个项目,其中包含两个容器:

DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/

其实DockerCompose文件可以看做是将多个docker run命令写到一个文件,只是语法稍有差异。

4.2.安装DockerCompose

参考资料

4.2.1.下载

Linux下需要通过命令下载:

#### 安装curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

如果下载速度较慢,或者下载失败,可以自行下载上传到/usr/local/bin/目录也可以。

4.2.2.修改文件权限

修改文件权限:

#### 修改权限chmod +x /usr/local/bin/docker-compose
4.2.3.Base自动补全命令:
#### 补全命令curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件:

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

4.3.部署微服务集群

需求:将自己的微服务集群(cloud-demo)利用DockerCompose部署

实现思路

4.3.1.compose文件

docker-compose内容如下:

version: "3.2"services:  nacos:    image: nacos/nacos-server    environment:      MODE: standalone    ports:      - "8848:8848"  mysql:    image: mysql:5.7.25    environment:      MYSQL_ROOT_PASSWORD: 123    volumes:      - "$PWD/mysql/data:/var/lib/mysql"      - "$PWD/mysql/conf:/etc/mysql/conf.d/"  userservice:    build: ./user-service  orderservice:    build: ./order-service  gateway:    build: ./gateway    ports:      - "10010:10010"

可以看到,其中包含5个service服务:

将mysql含有用到的cloud_order、cloud_user表的数据目录放到cloud-demo根目录下:

├── mysql│   ├── conf│   │   └── hmy.cnf│   └── data│       ├── auto.cnf│       ├── ca-key.pem│       ├── ca.pem│       ├── client-cert.pem│       ├── client-key.pem│       ├── cloud_order│       │   ├── db.opt│       │   ├── tb_order.frm│       │   └── tb_order.ibd│       ├── cloud_user│       │   ├── db.opt│       │   ├── tb_user.frm│       │   └── tb_user.ibd│       ├── ib_buffer_pool....

查看微服务目录,可以看到都包含Dockerfile文件:

内容如下:

FROM java:8-alpineCOPY ./app.jar /tmp/app.jarENTRYPOINT java -jar /tmp/app.jar
4.3.2.修改微服务配置

因为微服务将来要部署为docker容器,而容器之间互联不是通过IP地址,而是通过容器名。需要将order-service、user-service、gateway服务的mysql、nacos地址都修改为基于容器名的访问。

如下所示:

spring:  datasource:    url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false    username: root    password: 123    driver-class-name: com.mysql.jdbc.Driver  application:    name: orderservice  cloud:    nacos:      server-addr: nacos:8848 ### nacos服务地址
4.3.3.打包

接下来需要将我们的每个微服务都打包。因为之前查看到Dockerfile中的jar包名称都是app.jar,因此我们的每个微服务都需要用这个名称。

可以通过修改pom.xml中的打包名称来实现,每个微服务都需要修改:

<build>    <finalName>appfinalName>  <plugins>    <plugin>      <groupId>org.springframework.bootgroupId>      <artifactId>spring-boot-maven-pluginartifactId>    plugin>  plugins>build>
4.3.4.拷贝jar包到部署目录

编译打包好的app.jar文件,需要放到Dockerfile的同级目录中。注意:每个微服务的app.jar放到与服务名称对应的目录,别搞错了。

├── docker-compose.yml├── gateway│   ├── app.jar│   └── Dockerfile├── mysql│   ├── conf│   └── data├── order-service│   ├── app.jar│   └── Dockerfile└── user-service    ├── app.jar    └── Dockerfile
4.3.5.部署

最后,我们需要将文件整个cloud-demo文件夹上传到虚拟机中,交由DockerCompose部署。

上传到任意目录:

部署:

进入cloud-demo目录,然后运行下面的命令:部署并启动,若因nacos未启动前别的项目先启动,只需docker-compose restart 服务名重启即可

docker-compose up -d

5.Docker镜像仓库

5.1.搭建私有镜像仓库

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。

官网地址:https://hub.docker.com/_/registry

5.1.1.简化版镜像仓库

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。

搭建方式比较简单,命令如下:

docker run -d \    --restart=always \    --name registry\    -p 5000:5000 \    -v registry-data:/var/lib/registry \    registry

命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。

访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

5.1.2.带有图形化界面版本

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

version: '3.0'services:  registry:    image: registry    volumes:      - ./registry-data:/var/lib/registry  ui:    image: joxit/docker-registry-ui:static    ports:      - 8080:80    environment:      - REGISTRY_TITLE=传智教育私有仓库      - REGISTRY_URL=http://registry:5000    depends_on:      - registry
5.1.3.配置Docker信任地址

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

#### 打开要修改的文件vi /etc/docker/daemon.json#### 添加内容:"insecure-registries":["http://192.168.150.101:8080"]#### 重加载systemctl daemon-reload#### 重启dockersystemctl restart docker

5.2.推送、拉取镜像

推送镜像到私有镜像服务必须先tag,步骤如下:

① 重新tag本地镜像,名称前缀为私有仓库的地址:192.168.150.101:8080/

docker tag nginx:latest 192.168.150.101:8080/nginx:1.0 

② 推送镜像

docker push 192.168.150.101:8080/nginx:1.0 

③ 拉取镜像

docker pull 192.168.150.101:8080/nginx:1.0 

来源地址:https://blog.csdn.net/lxlsygxs2017/article/details/129973983

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯