Docker 知识点总结 及 技术实战流程(附单独练习参考)

Posted 二刺程序猿wow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 知识点总结 及 技术实战流程(附单独练习参考)相关的知识,希望对你有一定的参考价值。

Docker 实战一:知识点总结

Docker技术概述

Docker是一个虚拟化平台,基于 Google 公司的 Go 语言进行实现。可以通过虚拟化方式,为应用提供可运行的容器。基于这种方式,可更快地打包、测试以及部署应用程序。

Docker核心对象

镜像 (Image) 和容器 (Container) ,容器为运行镜像的载体,类似于光盘和光驱的关系。

Docker应用架构分析

Docker 是一种Client/Server架构的应用程序,架构图参考https://docs.docker.com/get-started/overview/
Docker Host: docker宿主机,即安装了docker的操作系统(项目里的CentOS7964)。
Registry: docker拉取镜像的远程仓库,提供大量镜像下载,下载后保存在images中。
Docker Daemon: 是docker的服务线程,处理Docker客户端命令。
Images: 是Docker本地的镜像仓库,可以通过docker images查看镜像文件。

Docker运行机制

docker pull(拉取):

1. 客户端发送指令给docker daemon。
2. Docker daemon 先检查本地images中是否有相关镜像。
3. 如果本地没有相关镜像,则向镜像服务器请求,将镜像下载到本地。

docker run(运行):

1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
2. 利用镜像创建并启动一个容器。
3. 分配个文件系统,并在制度的镜像层外面挂载一层可读写层。
4. 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去。
5. 从地址池配置一个ip地址给容器。
6. 执行用户制定的应用程序。

Docker实战二:技术实战流程

虚拟机部署操作

  1. 准备CentOS7964,课前资料里有。
  2. 在虚拟机VMware中打开CentOS7964。
  3. 克隆CentOS,选择链接克隆(浅克隆省空间),命名为CentOS7964-docker。
  4. 打开虚拟机,用户名密码默认root。
  5. 打开终端检查网络指令:ifconfig,查出ip地址。
  6. 通过MobaXterm远程链接虚拟机系统,注意ip地址要与上面一致。
  7. 显示正常并成功进入系统即为成功。

Docker安装相关指令

卸载docker:

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

若安装过Docker可以通过此方式删除Docker的所有文件,若第一次安装则无需执行。

在线安装Docker(确保网络条件可以):

1.安装yum工具:

sudo yum install -y yum-utils

2.设置yum仓库地址:

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

3.更新yum缓存:

sudo yum makecache fast #yum 是包管理器

4.安装新版docker:

sudo yum install -y docker-ce docker-ce-cli containerd.io

离线安装Docker(网络欠佳推荐):

  1. 下载docker离线包,在docker官网上下载离线安装包:
    https://download.docker.com/linux/static/stable/x86_64/docker-20.10.6.tgz
  2. 也可以从课前资料中获取docker离线包,或者在docker官网下载指定版本。
  3. 下载离线安装工具,并解压。
    https://github.com/Jrohy/docker-install/
  4. 将下载好的资源放在一个目录,创建/root/setup/docker目录(利用MobaXterm)。
  5. 确认好文件一共有三个,bash文件和sh文件还有docker的tgz文件。


下面执行安装操作:

  1. 进入docker资源所在目标文件夹:
    cd /root/setup/docker
  2. 为install.sh添加执行权限:
    chmod +x install.sh
  3. 安装docker:
    ./install.sh -f docker-20.10.6.tgz

Docker服务基本操作(手动练习):

  1. 启动docker服务:
    systemctl start docker
  2. 查看Docker状态(查看是否启动,是否是运行状态):
    systemctl status docker
    若Active属性为active(running)则表示docker正在运行。
  3. 设置Docker开机自启:
    systemctl enable docker
  4. 禁用Docker开机自启:
    systemctl disable docker
  5. 重新启动Docker服务:
    systemctl restart docker
  6. 查看Docker信息:
    docker info
  7. 查看docker info 中具体key的信息,例如:
    docker info | grep ‘Docker Root Dir: ’
  8. 停止docker服务:
    systemctl stop docker
  9. Docker镜像加速问题:由于国内网络问题需要配置加速器来加速。
    修改配置文件 /etc/docker/daemon.json
    下面命令直接生成文件 daemon.json
cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
EOF

说明:在执行如上指令时,保证你的登录用户为 root 管理员用户,并且设置好以后重启 docker服务。

Docker镜像操作实践(手动练习):

  1. 下载镜像:
    docker pull 镜像名
  2. 浏览所有镜像文件:
    docker images
  3. 查看镜像详情:
    docker inspect 镜像名或镜像ID
  4. 查看镜像各个层的创建信息:
    docker history 镜像名
  5. 导出镜像文件:导出Linux的镜像文件下载到本地:
    docker save hello-world | gzip > hello-world.tar.gz
  6. 删除镜像文件:
    docker image rm 镜像名 (若还有容器使用则无法删除)
  7. 导入镜像操作:
    docker load < hello-world.tar.gz(注意命令要在.gz文件所在目录下执行)
  8. 运行镜像文件:
    docker run hello-world

Docker容器操作实践:

以下均已CentOS镜像为例

  1. 下载镜像:docker pull centos:7
    下载完成后查看是否成功:docker images
  2. 创建并启动容器:docker run -it centos:7 bash
    其中centos:7处代表镜像名或者镜像ID的前x位;
    -it 这是两个参数,-i 表示交互式操作 interactive ,-t 表示终端 terminal ;
    bash (bourne again shell)表示进入操作终端,基于交互式进行相关操作。
  3. 查看Docker中的容器(正在运行): docker ps
  4. 查看Docker中的所有容器(包括未运行的):docker ps -a
  5. 查看容器的详细信息: docker inspect centos:7 其中centos:7处代表镜像名或者镜像ID
  6. 查看容器日志信息:查看后台运行的容器输出结果:
    docker(container) logs centos:7 括号内可省略。
  7. 停止运行中的容器: docker(container) stop centos:7
  8. 重启容器:docker(container) restart centos:7
  9. 进入指定容器(在容器运行时需要进入容器进行操作时):docker exec -it centos:7 bash
  10. 删除容器:
    若容器不再使用,可执行删除:docker (container) rm centos:7
    若要删除运行中的容器,需添加-f参数:docker (container) rm -f centos:7
    若要清理所有中止状态的容器:docker (container)prune

Docker数据管理实践:

管理方式

挂载主机目录(Bind mounts)最常用的,命令:docker run -v 宿主机目录 : 容器目录
数据卷(Volumes)

数据卷

一个可供一个或多个容器使用的特殊目录,可以在容器之间共享和重用,一直存在即使容器被删除。

数据卷操作

  1. 创建数据卷:
    docker volume create container-vol
  2. 查看所有的数据卷:
    docker volume ls (-q)(只显示数据卷的名称)
  3. 查看指定数据卷的信息:
    docker volume inspect container-vol查询信息的Mountpoint为挂载点。
  4. 启动挂载数据卷的容器:
    docker run -it --mount source=container-vol,target=/root centos:7 bash
    又或者简写:
    docker run -it -v container-vol:/root centos:7 bash
    -v container-vol:/root 的意思是:把数据卷 container-vol 挂载到容器的 /root 目录
  5. 删除数据卷:
    docker volume rm container-vol(若数据卷正在被容器使用则无法删除)
  6. 清理无主数据卷:docker volume prune
  7. 查看Volume命令:docker volume help
    具体命令:docker volume 命令名 --help

挂载主机目录

在启动容器的时候,可以以目录直接挂载的方式进行数据操作
示例: docker run -it -v /usr/app:/opt/app centos:7 bash 其中:

  • /usr/app 为宿主机挂载目录
  • /opt/app 为启动的容器的一个目录
  • -v用于指定挂载目录,如果本地目录(即宿主机目录)不存在,则自动创建该挂载目录。
  • 查看挂载目录的信息:docker inspect 容器id
    (Source代表挂载目录,Destination代表容器目录)下图为mysql的挂载信息

Dockerfile及镜像制作实践

Dockerfile概述

Dockerfile 是用来构建镜像的文本文件,内容包含构建镜像所需的指令和说明。通常基于此文件创建docker镜像。

准备软件工作

  1. 准备centos:7镜像(作用为类似光盘和U盘启动盘的载体),所有的镜像文件创建时都需要一个空的centos镜像。
  2. JDK压缩包:可以从官网去下载或者课前资料里的 jdk-8u51-linux-x64.tar.gz ,基于此压缩包制作jdk镜像。

准备Dockerfile文件

需求:以centos7为基础构建jdk8的镜像,通过vim打开Dockerfile,在要构建的目录下创建。

完整代码示例:

FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz /usr/local/docker
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_51 \\
    PATH=/usr/local/docker/jdk1.8.0_51/bin:$PATH
CMD ['bash']

注意和创建步骤:

  1. Dockerfile 的文件名必须是 Dockerfile,大小写及拼写都不能有误。
  2. 编写时注意先按 i 进入编辑模式再复制,否则第一行前三个字母将会消失。
  3. 每一行的关键字一定大写(FROM,ADD,ENV等)
  4. 最后在 Dockerfile 构建镜像时要在 Dockerfile 所在目录执行 docker 指令
  5. 构建指令:docker build -t jdk-8 .
    (最后的.不能省略,代表当前目录,-t表示镜像名,标识 tag )
  6. 构建一般需要四步,最后显示 Successfully 即为成功。

运行试验(如何通过此镜像运行一个web服务,这里用sentinel为例)

  1. 运行镜像文件:docker run -it jdk-8 bash
  2. 进入镜像以后查看环境变量:echo $PATH
    查看JDK版本信息:java-version
  3. 将sentinel的jar包拷贝至宿主机的目录中,例如/root/servers目录(若不存在则创建)。
  4. 启动镜像容器,通过java执行运行web服务。

示例代码:

docker run -d  -p 8180:8080 --name sentinel  \\
-v /root/servers:/usr/sca  \\ 
jdk:8 java -jar /usr/sca/sentinel-dashboard-1.8.0.jar

句意:docker 基于 jdk-8 镜像启动运行 sentinel 服务,-d代表分离模式(detached),-p 8180:8080代表宿主机端口和容器端口,- -name sentinel代表服务名,-v代表挂载目录和容器数据目录。
5. 打开浏览器验证sentinel服务,访问地址为:宿主机的ip:宿主机端口(8180),测试成功即可。

容器内编写java程序练习

  1. 创建一个Hello.java(里面手写文字输出代码):
    vi Hello.java 注意这里用vim会报错因为容器内并不识别vim。
  2. 查看目录下的所有文件:ls 若java文件存在即可。
  3. 编译Hello.java:javac -d . Hello.java
    这里-d表示按照java文件中的定义的包结构去编译,点表示在当前目录创建。
  4. 运行Hello类:java pkg.Hello 若有输出即可成功。
    若出现错误则进入 pkg 目录查看是否有编译好的 .class 文件。

制作Sentinel镜像练习

  1. 定义Dockerfile文件,同时将jdk,sentinel也放到该目录下。

示例代码:

FROM centos:7
ADD jdk-8u51-linux-x64.tar.gz  /usr/local/
ADD sentinel-dashboard-1.8.0.jar  /usr/local/
ENV JAVA_HOME=/usr/local/jdk1.8.0_51 \\
    PATH=/usr/local/jdk1.8.0_51/bin:$PATH
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/sentinel-dashboard-1.8.0.jar"]
  1. 使用Dockerfile构建镜像,即在Dockerfile目录下执行docker命令:
    docker build -t sentinel-jdk-8
  2. 构建完成后,测试运行sentinel容器:
    docker run -d -p 8180:8080 sentinel-jdk-8
  3. 若要做目录挂载保存容器的日志,可参考一下代码启动:
docker run -d -p 8180:8080 --name sentinel  \\
-v /usr/local/docker/sentinel/logs:/root/logs/csp sentinel-jdk-8    
  1. 查看sentinel容器:docker ps
    若查看不到活动容器,可以通过 docker container logs 容器id 方式查看状态。
  2. 测试访问sentinel服务:访问地址为:宿主机ip:宿主机端口 连接成功即可。

Docker镜像安装实践

MySQL数据库

安装MySQL数据库

  1. 在hub.docker.com上搜索mysql镜像,或者导入课前资料中的mysql镜像
  2. 可以拉取指定版本的mysql:docker pull mysql:8.0.23
  3. 检查mysql镜像是否拉取成功: docker images
  4. 启动运行mysql镜像:

代码示例:

sudo docker run -p 3306:3306 --name mysql \\
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \\
-v /usr/local/docker/mysql/conf:/etc/mysql \\
-v /usr/local/docker/mysql/logs:/var/log/mysql \\
-v /usr/local/docker/mysql/data:/var/lib/mysql \\
-e MYSQL_ROOT_PASSWORD=root \\
-d mysql:8.0.23

博主吐槽:事实证明,别的都可以省略就是 mysql-files 不行,老齐自己挖坑还历历在目
若安装过程中安装失败,想通过docker ps -a查看所有容器。
若存在咋通过docker rm 镜像id删除重装即可。

登陆MySQL服务

  1. 进入容器:docker exec -it mysql bash 退出容器:exit
  2. 登陆MySQL:mysql -uroot -proot (默认密码是root,登陆之前一定先进入mysql所在的容器)
  3. 进入数据库进行操作(例如查表查数据等)测试mysql是否成功运行。
  4. 停止mysql服务:docker stop mysql
  5. 启动mysql服务:docker start mysql
  6. 查看mysql启动时的日志:docker (container) logs mysql 括号内可省略
  7. 设置mysql开机自启动:docker update mysql --restart=always

Redis数据库

安装Redis数据库

  1. 下载镜像文件:docker pull redis
  2. 准备配置文件,创建redis配置文件目录:mkdir -p /usr/local/docker/redis666/conf
  3. 在配置文件目录下创建redis.conf文件:touch /usr/local/docker/redis01/conf/redis.conf
  4. 创建redis实例并启动:

代码示例:

sudo docker run -p 6379:6379 --name redis01 \\
-v /usr/local/docker/redis01/data:/data \\
-v /usr/local/docker/redis01/conf/redis.conf:/etc/redis/redis.conf \\
-d redis redis-server /etc/redis/redis.conf 
  1. 查看正在运行的进程:docker ps 若有redis666则成功。

访问redis服务器

  1. 控制台直连redis测试(进入redis容器):docker exec -it redis666 bash

  2. 检测redis版本:redis-server -v 或者redis-cli -v

  3. 登陆redis(默认不需要密码):redis-cli

    以上13两步可以合为一个代码:docker exec -it redis666 redis-cli

  4. 停止redis服务:docker stop redis666

  5. 启动redis服务:docker start redis666

  6. 重启redis服务:docker restart redis666

Ngnix代理

安装nginx代理

  1. 拉取nginx镜像:docker pull nginx
  2. 查看所有镜像:docker images 若nginx存在即可
  3. 创建数据卷(对象会在宿主机直接创建一个目录):docker volume create nginx-vol
  4. 查看该数据卷对应的宿主机目录:docker inspect nginx-vol 里面的 mountpoint 即为挂载目录。
  5. 启动nginx服务:docker run --name nginx -p 80:80 -v nginx-vol:/etc/nginx -d nginx
    其中/etc/nginx为默认解压目录。

访问nginx服务

  1. 访问检测:访问地址为:宿主机ip:80/nacos 用户名密码默认为nacos
  2. 停止nginx服务:docker stop nginx
  3. 启动nginx服务:docker start nginx
  4. 重启nginx服务:docker restart nginx

Nacos组件

安装Nacos组件

  1. 拉取nacos:docker pull nacos/nacos-server:1.4.1
  2. 查看mysql的挂载目录:docker inspect mysql
  3. 将nacos-mysql.sql脚本文件拷贝在挂载目录中
  4. 在linux环境下启动mysql:docker start mysql
  5. 进入mysql容器:docker exec -it mysql bash
  6. 登陆mysql:mysql -uroot -p
  7. 通过指令运行容器目录下的sql文件:source /容器目录/nacos-mysql.sql
  8. 创建并启动nacos容器:

代码示例:

docker run  \\
-e TZ="Asia/Shanghai" \\
-e MODE=standalone \\
-e SPRING_DATASOURCE_PLATFORM=mysql \\
-e MYSQL_DATABASE_NUM=1 \\
-e MYSQL_SERVICE_HOST=你的ip地址 \\
-e MYSQL_SERVICE_PORT=3306 \\
-e MYSQL_SERVICE_USER=你的用户名 \\
-e MYSQL_SERVICE_PASSWORD=你的密码 \\
-e MYSQL_SERVICE_DB_NAME=nacos_config \\
-p 8848:8848 \\
--name nacos \\
--restart=always \\
-d nacos/nacos-server:1.4.1

参数说明:

MODE=standalone 单节点模式
MYSQL_SERVICE_HOST 你的宿主机IP地址
MYSQL_SERVICE_USER 你的用户名
MYSQL_SERVICE_PASSWORD 你的密码
MYSQL_SERVICE_DB_NAME 连接的数据库名
-p 8848:8848 端口映射

  1. 检查nacos服务是否启动:docker ps
  2. 若启动失败检查启动日志:docker container logs nacos
    其中nacos启动日志在/home/nacos/logs/start.out目录中。

访问nacos服务

  1. 访问浏览器地址:http://ip:port/nacos
  2. 停止nacos服务:docker stop nacos
  3. 启动nacos服务:docker start nacos
  4. 重启nacos服务:docker restart nacos

Docker容器互联实践

当Docker中的容器之间需要进行通讯时(例如nacos访问mysql,redis集群中的节点等)需要完成容器互联。

解决方案

一般有两种:
第一种:容器之间通过宿主机进行通讯(即容器中的端口会映射到宿主机上)
第二种:在容器之间直接通过虚拟网络进行连接(需要在Docker中创建网络)

虚拟网络连接实现容器互联

  1. 创建网络:docker network create -d bridge t-net
    t-net为自己起的网络名称,-d driver网络类型,默认bridge)。
  2. 列出所有网络:docker network ls
  3. 查看网络信息:docker inspect xxx (xxx为创建的网络id)
  4. 打开终端1创建容器:docker run -it --name app1 --network t-net centos:7
  5. 打开终端2创建容器:docker run -it --name app2 --network t-net centos:7
  6. 测试网络互通:两个终端分别执行:ping app1ping app2,若成功有数据就收则ping通了。

Docker实战三:docker指令练习

Docker服务基本操作

启动docker服务
查看Docker状态(查看是否启动,是否是运行状态)
设置Docker开机自启
禁用Docker开机自启
重新启动Docker服务
查看Docker信息
查看docker info 中具体key的信息
停止docker服务

Docker镜像操作

下载 hello-world 镜像
浏览所有镜像文件
查看 hello-world 镜像详情
查看 hello-world 镜像各个层的创建信息
导出 hello-world 镜像文件:导出Linux的镜像文件下载到本地
删除 hello-world 镜像文件
导入 hello-world 镜像文件
运行 hello-world 镜像文件

Docker容器操作(以centos:7为例)

下载镜像
下载完成后查看是否成功
创建并启动容器
查看Docker中的容器(正在运行)
查看Docker中的所有容器(包括未运行的)
查看容器的详细信息
查看容器日志信息
停止运行中的容器
重启容器
进入指定容器(在容器运行时需要进入容器进行操作时)
删除容器:
若容器不再使用时
若要删除运行中的容器时
若要清理所有中止状态的容器时

Docker数据管理实践

数据卷相关

创建数据卷
查看所有的数据卷
查看指定数据卷的信息
启动挂载数据卷的容器(完整和简写)
删除数据卷
清理无主数据卷
查看Volume命令
具体命令

直接挂载相关

启动容器,以目录直接挂载的方式进行数据操作
查看挂载目录的信息

Dockerfile及镜像制作实践

准备工作

提前准备好cent:7镜像和JDK压缩包
将sentinel的jar包拷贝至宿主机的目录中

需求:以centos7为基础构建jdk8的镜像。

通过vim打开Dockerfile,在要构建的目录下创建。
Dockerfile文件的代码可参照前面总结文档(就是不用背抄就完了)
构建名叫jdk-8的镜像
运行jdk-8镜像文件
进入镜像以后查看环境变量
查看JDK版本信息
启动镜像容器,通过java执行运行web服务

容器内编写java程序

创建一个Hello.java(里面手写文字输出代码)
查看目录下的所有文件
编译Hello.java
运行Hello类

制作Sentinel镜像

定义Dockerfile文件,同时将jdk,sentinel也放到该目录下(可参考上面文档代码)
使用Dockerfile构建镜像
构建完成后,测试运行sentinel容器
若要做目录挂载保存容器的日志,可参考一下代码启动
查看sentinel容器
若查看不到活动容器则通过日志查看状态

Docker镜像安装实践

MySQL数据库

拉取指定版本(8.0.23)的mysql
检查mysql镜像是否拉取成功
启动运行mysql镜像(可参考前面文档,注意修改必要信息)
若安装过程中安装失败,查看所有容器
若存在则删除
进入容器
退出容器
登陆MySQL
进入数据库进行操作(例如查表查数据等)测试mysql是否成功运行
停止mysql服务
启动mysql服务
查看mysql启动时的日志
设置mysql开机自启动

Redis数据库

下载镜像文件
准备配置文件,创建redis配置文件目录redis666
在配置文件目录下创建redis.conf文件
创建redis实例并启动(可参考前面文档)
查看正在运行的进程若有redis666则成功
控制台直连redis测试(进入redis容器)
检测redis版本
登陆redis(默认不需要密码)
以上进入和登陆两步可以合为一个代码
停止redis服务
启动redis服务
重启redis服务

Ngnix代理

拉取nginx镜像
查看所有镜像
创建数据卷(对象会在宿主机直接创建一个目录)
查看该数据卷对应的宿主机目录
启动nginx服务
浏览器访问检测
停止nginx服务
启动nginx服务
重启nginx服务

Nacos组件

拉取nacos(nacos-server:1.4.1)
查看mysql的挂载目录
将nacos-mysql.sql脚本文件拷贝在挂载目录中
在linux环境下启动mysql
进入mysql容器
登陆mysql
通过指令运行容器目录下的sql文件
创建并启动nacos容器(可参考上面文档,注意要更改自己的相关信息)
访问浏览器检测是否联通
停止nacos服务
启动nacos服务
重启nacos服务

Docker容器互联实践

创建网络t-net
列出所有网络
查看网络信息
打开终端1创建容器
打开终端2创建容器
测试网络互通:两个终端分别执行ping测试是否互相连通

关于Docker的相关内容就总结到这里,后续会补充相应图片完善笔记。因为此文档为本人在学习过程课程中的总结内容,所以涵盖的知识点可能并不全面,上面笔记内容若有错误请指正谢谢!

附上千反田萌照一张,祝大家越学越好!

以上是关于Docker 知识点总结 及 技术实战流程(附单独练习参考)的主要内容,如果未能解决你的问题,请参考以下文章

Docker最全教程——从理论到实战

Docker最全教程——从理论到实战

Docker容器化技术实战操作汇总(附开发环境搭建)

Docker最全教程——从理论到实战

Docker学习总结——Docker实战之入门以及Dockerfile

图书┃SaltStack技术入门与实战(内附书单)