Docker 容器基础介绍

一. 基础介绍

  1. 传统方式下:

a. 在没有虚拟技术时,我们发布一个项目首先要有物理服务器,安装系统,在系统上启动运行项目
b. 在微服务环境下,一个项目我们可能会做集群,同一个项目复制多份,进行不同的配置,分别在不同的物理服务器上运行,然后基于nginx,网关等拦截请求负载均衡,将请求打到指定的服务器上

  1. 传统方式下的弊端:

a. 成本比较高,可能一台服务器上,只能运行一个服务
b. 部署项目比较复杂,将不同的项目部署到不同的服务器上,需要进行大量的配置,发布时要获取指定的服务器,将指定的项目发布到指定的服务器
c. 扩展迁移成本比较大,假设后续需要迁移应用,或者当前服务集群不能承载当前的请求需要快速扩容,都会涉及到物理服务器的搭建,与项目的配置等等

  1. 解决以上问题提出了虚拟技术,与容器技术,基于Linux namespace实现内核资源隔离,基于Linux Cgroups 实现内核资源分配(简单理解就是通过隔离,容器实现了一个服务器上可以虚拟隔离出多个部分互不影响,将项目服务放在隔离的容器中运行,可以实现快速扩容等优点)
  2. Docker 分为客户端与服务端,客户端连接服务端,通过客户端访问服务端发送请求实现功能,几个组成部分:
  1. Host(Docker 宿主机),安装了Docker程序,也就是Docker 服务端
  2. Docker daemon 运行在Docker宿主机上的Docker程序的一个进程,通过该进程,客户端与服务端进行连接交互
  3. images 镜像,我们发布项目服务,一个服务需要环境配置,这个环境配置模板就相当于一个镜像,通过一个镜像可以创建多个容器,然后将在容器中运行项目
  4. Containers 容器: Docker根据一个镜像创建容器,容器与容器直接互不影响
  5. Docker Client 客户端: 也就是用户使用Docker时实际操作的部分,可以理解为一个命令行工具,连接Docker服务端,向服务端发送命令
  6. Registry 仓库服务注册,可以简单理解为一个存放项目代码的仓库,将镜像发布到该仓库中,后续通过该仓库获取镜像,库分为公开库与私有库,最大的向Docker Hub, 国内的向阿里云,时速云等等
  1. 参考

二. Docker 安装

  1. 参考博客
  2. 注意点: Linux 上安装Docker Linux内核要3.10版本以上,操作系统必须是64位,ContOS时建议使用7
//查看Linux 内核版本
uname -r
  1. 卸载Linux上旧版本Docker
yum remove docker docker-common docker-selinux docker-engine
yum remove docker-ce
//卸载后将保留 /var/lib/docker 的内容(镜像、容器、存储卷和网络等)
rm -rf /var/lib/docker
  1. 首先基于网络下载安装Docker需要用到的包
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装前可查看device-mapper-persistent-data和lvm2是否已经安装
rpm -qa|grep device-mapper-persistent-data
rpm -qa|grep lvm2
  1. 设置yum源(推荐使用国内的镜像地址),注意vim命令如果没有安装的话可能会报错,具体查看vim安装
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
//更改yum源地址
//1.切换到yum.repos.d 路径下,例如下方
cd /etc/yum.repos.d/
//2.ls 命令查看该路径下的文件
//3.打开 docker-ce.repo 文件
vim docker-ce.repo
//4.找到国内镜像网站,例如清华大学镜像站,该站中搜索docker,点击复制链接地址
//5.将doker-ce.repo文件中的所有https://download.docker.com/替换为复制的docker地址
//:%s@需要替换的数据@替换为的数据@ 替换完成后保存并退出
%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@

在这里插入图片描述
6. “vim docker-ce.repo"该命令执行后会进入文件中,点击:进入编辑模式, 输入上方的字符串”%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@“,然后进入ESC模式”:wq"保存退出即可
在这里插入图片描述
7. 更新yum软件包索引

yum makecache fast
  1. 安装docker-ce
//该命令是默认安装最新版本,实际开发中需要指定安装哪个版本
yum install docker-ce -y
#安装指定版本docker-ce可使用以下命令查看
yum list docker-ce.x86_64 --showduplicates | sort -r
# 安装完成之后可以使用命令查看
docker version

#安装 19.03.9版本docker控制台示例
yum install -y docker-ce-3:19.03.9-3.el7.x86_64  docker-ce-cli-3:19.03.9-3.el7.x86_64 containerd.io

#安装docker 19.03.9版本docker核心示例 
yum install -y docker-ce-19.03.9-3  docker-ce-cli-19.03.9 containerd.io
  1. 在输入docker version命令进行查看时,首次会提示doker server 服务没有运行起来,在运行docker server服务需要用到仓库,由于docker hub 仓库比较慢,可以使用国内的,例如阿里云容器镜像服务,在阿里云注册账号,进入—>镜像中心—>镜像加速器—>加速器地址,复制该地址
  2. 找到 cd /etc/docker目录下的daemon.json文件,没有则直接 vi daemon.json,将加速器地址配置到该文件中例如下方

注意如果没有找到"/etc/docker"目录,则执行"mkdir /etc/docker/"先创建该目录,然后创建 daemon.json

#填写自己的加速器地址
{
"registry-mirrors": ["https://加速器地址.aliyuncs.com"]
}
  1. .通知systemd重载此配置文件
systemctl daemon-reload
  1. 重启docker服务
systemctl restart docker
  1. 设置开机自动启动 docker
systemctl enable docker
  1. 启动docker
systemctl start docker

linux 安装 vim

  1. linux上使用vim命令可能会报错返回
    在这里插入图片描述
  2. 解决上面vim的异常

1.查看系统是否安装完整vim执行一下命令:rpm -qa|grep vim
2. 如果已经正确安装的话,会显示如下三行:

vim-enhanced-7.0.109-7.el5
vim-minimal-7.0.109-7.el5
vim-common-7.0.109-7.el5

  1. 如果少了其中的某一条,比如 vim-enhanced 的,执行安装命令: yum -y install vim-enhanced
  2. 如果上面的三条一条都沒有返回,执行安装命令: yum -y install vim*

linux 安装 sudo

yum -y install sudo

三. Docker 常用操作命令

  1. 输入 docker 可以查看Docker的命令用法,输入 docker COMMAND --help 查看指定命令详细用法(lunux下直接输入doker 命令 即可)
  2. 镜像常用操作
  1. 查找镜像命令: docker search 关键词
  2. 下载镜像命令(Tag表示版本,有些镜像的版本显示latest,为最新版本): docker pull 镜像名:TAG
  3. 查找镜像命令,会显示当前下载的所有镜像文件: docker images
  4. 删除指定本地镜像命令-f 表示强制删除: docker rmi -f 镜像ID或者镜像名:版本号
  5. 获取镜像的元信息,详细信息:docker inspect 镜像ID或者镜像名:TAG
  6. 查看指定镜像的元信息: docker inspect 镜像名称或ID
  1. 有了镜像,就要有容器常用操作,基于镜像运行容器,可以理解为开辟一个单独的Linux系统,在这个Linux上安装当前镜像服务
  1. 运行容器(如果本地镜像中没有默认会去仓库中拉取一个镜像运行): docker run --name 容器名 -i -t -p 主机端口:容器端口 -d -v 主机目录:容器目录:ro 镜像ID或镜像名:TAG
    –name 指定容器名,可自定义,不指定自动命名
    -i 以交互模式运行容器
    -t 分配一个伪终端,即命令行,通常-it组合来使用
    -p 指定映射端口,当前Docker服务宿主机端口号:当前运行的容器端口号
    -d 后台运行容器(是防止linux中运行了指定容器后,阻塞了当前窗口的操作)
    -v 指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读
    例如: # docker run --name 自定义容器名称 -d -p Docker宿主机端口2222:容器端口号8082 镜像名称或id,此时如果访问linux中2222端口号(注意该端口号是docker的),会自动访问8082端口
  2. 容器列表:docker ps -a -q
    -docker ps查看正在运行的容器
    -a 查看所有容器(运行中、未运行)
    -q 只查看容器的ID
  3. 启动容器:docker start 容器ID或容器名
  4. 停止容器:docker stop 容器ID或容器名
  5. 删除容器-f 表示强制删除:docker rm -f 容器ID或容器名
  6. 查看日志:docker logs 容器ID或容器名
  7. 进入正在运行的容器并且开启交互模式终端:docker exec -it 容器ID或者容器名 /bin/bash,其中/bin/bash是固有写法,作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容器后启动bash。也可以用docker exec在运行中的容器执行命令
  8. 拷贝文件:docker inspect 容器ID或容器名
  1. Docker 对所有容器日志进行了整合,如果想查看容器日志,使用: docker logs 容器名称或id
  2. 上面运行容器后,每个容器就相当于一个单个的linux服务器,如果想要操作容器中的东西,需要分配一个终端: “docker container exec -it 容器名称或id /bin/bash” 可以简单理解为进入指定容器下也就是指定linux下
  3. 修改容器内部文件需要先执行上面的命令,进入容器内部,找到文件进行修改,由于容器内部不支持某些命令,例如vi等操作不太方便,通常情况下,我们会先将容器内部的文件挂载到容器外部,在外部修改挂载的文件,容器内部也会生效
//查看挂载目录(随机生成不可更改的)
docker container inspect 容器名称或id
//进去以后会显示一堆json数据,找到"Mounts" 里面的 "Source" 表示容器外部的挂载路径随机生成不可更改,里面的"Destination"是对应容器内部的挂载路径
  1. 以安装mysql镜像服务为例
//1.下载mysql镜像,指定5.7版本
docker pull mysql:5.7
//2.运行容器(如果没有下载会自动去下载)
//注意点:在运行时由于mysql启动需要密码,比普通容器的运行多了"-e MYSQL_ROOT_PASSWORD=密码"
docker run --name mysql-name -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root1234  mysql:5.7
//3.进入mysql-name容器中
docker container exec -it mysql-name /bin/bash
//4.修改mysql配置文件,由于容器内部不支持某些命令,将文件拿到容器外更改
//5.在容器内部找到需要更改的配置文件
ls //查看容器下的文件夹
cd /etc/mysql/ //进入etc/mysql目录下
cd conf.d //通常mysql配置文件在etc/mysql/conf.d 文件夹下
//6.容器外部创建三个要挂载的目录
mkdir -p /my/mysql/conf
mkdir -p /my/mysql/data
mkdir -p /my/mysql/logs
//7.进入容器内部依次复制文件到容器外部创建的目录中
docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf /my/mysql/conf/
//8.容器外部依次修改挂载的文件
vi /my/mysql/conf/mysqld.conf
character-set-server=utf8
//9.最终启动命令
docker run \
--name mysql \
-p 3306:3306 \
-v /my/mysql/conf:/etc/mysql/mysql.conf.d/ \
-v /my/mysql/data:/var/lib/mysql \
-v /my/mysql/logs:/logs \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5
  1. docker start 命令与docker run 命令的区别: start是通过镜像直接运行容器,run是运行指定容器

1. Docker windows版本安装

  1. 参考博客
  1. 参考博客1
  2. 参考博客2
  3. 参考博客3
  1. windows进行相关设置: 点击“设置”—>搜索“Windows功能”—>启用或关闭Windows功能—>勾选Hyper-v,启用后电脑会重启,安装环境配置成功
    在这里插入图片描述
  2. 下载docker安装包,下载完成后,双击安装docker windows版本安装包下载地址
  3. docker安装完成后双击运行,可能会弹出异常窗口,提示"WSL2 installations is incomplete",这是系统中没有安装WSL2内核的原因,打开 https://aka.ms/wsl2kernel, 在打开的页面中有一个"适用于x64计算机的WSL2 Linux内核更新包"链接,点击下载安装
  4. 重启Docker Desktop即可正常使用。可在cmd或者PowerShell命令行中使用docker或者docker-compose等相关命令了。
    PS: 如果您在安装WSL2的过程中遇到了问题,可能是您的系统版本较低等原因,您可按照 https://aka.ms/wsl2wkernel 页面的相关提示更新系统。该Docker Desktop的安装方法基于Windows10的WSL2,如果您的系统没有或者不能安装WSL2,可能不能使用该方法安装Docker Desktop
  5. 此时Docker安装运行成功(显示绿色)
    在这里插入图片描述

2. 设置Docker镜像加速器

  1. 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务例如:
  1. 科大镜像:https://docker.mirrors.ustc.edu.cn/
  2. 网易:https://hub-mirror.c.163.com/
  3. 阿里云:https://<你的ID>.mirror.aliyuncs.com
  4. 七牛云加速器:https://reg-mirror.qiniu.com
  1. 配置镜像加速器步骤以阿里云为例
  1. 注册阿里云账号: https://dev.aliyun.com/
  2. 进入阿里云加速器页面,根据系统版本等信息获取对应的加速器地址: https://cr.console.aliyun.com/#/accelerator
  3. 复制对应地址粘贴到Docker–>setting–>docker Engine
    在这里插入图片描述
//可用示例
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  },
  //镜像加速地址
  "registry-mirrors": [
    "https://epap466m.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com/"
  ]
}
  1. cmd命令窗口执行: “docker pull centos” 下载linux按照包, 安装运行
    在这里插入图片描述

3. Docker 其它镜像相关

  1. Docker镜像库官方地址
  2. 道客云镜像库(国内比较快)
  3. 在使用镜像时可以先去镜像仓库查看是否有需要的镜像,根据系统版本等信息选择下载指定的版本镜像

以Docker安装redis为例

  1. 先去镜像仓库搜索查看是否存在
    在这里插入图片描述
  2. 版本选择: 可以通过SortBy自定排序, 其中lastest是最新版本镜像, 直接复制后面的"docker pull redis:latest"命令下载即可
    在这里插入图片描述
  3. 也可以直接在cmd窗口执行"docker search redis" 查看可用版本
    在这里插入图片描述
  4. 此处在cmd窗口执行" docker pull redis:latest" 拉取redis最新镜像
    在这里插入图片描述
  5. 镜像下载完成后可以通过"docker images" 命令查看本地镜像
    在这里插入图片描述
  6. 也可以在Docker可视化平台images页面查看
    在这里插入图片描述
  7. 安装完成后,我们可以使用以下命令来运行 redis 容器
//-p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务
docker run -itd --name redis-test -p 6379:6379 redis

在这里插入图片描述

  1. 最后我们可以通过 “docker ps” 命令查看容器的运行信息:
    在这里插入图片描述

docker ps -a # 查看所有容器
docker ps # 查看正在运行的容器
docker rm $(docker ps -a -q) #移除掉所有容器
docker restart container-id # 重启某个容器

  1. 接着我们通过 redis-cli 连接测试使用 redis 服务
docker exec -it redis-test /bin/bash

在这里插入图片描述
10. 本机连接测试
在这里插入图片描述

四. 更新镜像

  1. 基于容器更新镜像: 上面修改配置是在容器上修改的不会对镜像有影响,可以对修改后的容器生成新的镜像
docker commit -m="描述消息" -a="作者" 容器ID或容器名 镜像名:TAG
# 例:
# docker commit -m="修改了首页" -a="ws" mytomcat ws/tomcat:v1.0
#使用新镜像运行容器
docker run --name tom -p 8080:8080 -d ws/tomcat:v1
  1. Dockerfile构建镜像,可以理解为用来构建镜像的源码,假设一个服务项目采用Docker容器方式在服务器上运行,就需要构建这个项目的镜像(也就是在Dockerfile文件中编写命令,Docker读取该文件根据命令创建镜像)
  2. Dockerfile 的格式要求: "#"代表注释, 第一行有效命令以"FROM"开头,命令大小,通常会单独创建一个文件夹用来存放构建镜像所需要的文件,否则防止Docker扫描到不需要的文件,使用ignore排除
  3. 假设构建一个SpringBoot项目镜像,实现步骤
//1.将SpringBoot项目打为jar包
//2.linux服务器上创建构建该项目的文件夹,用来存放构建该项目镜像时需要的文件,jar包等
mkdir dockerfiles //创建dockerfiles文件夹
//3.将打包好的SpringBoot项目jar包上传到创建的文件夹中
//4.该文件夹下创建Dockerfile文件,编写构建镜像指令
vim Dockerfile //注意点,如果不使用该名字,在构建时需要手动指定与当前创建的名字一致
  1. 一个基础的的Dockerfile文件
#第一行命令必须是"FROM"
#指定基础镜像,本地没有会从dockerHub pull下来
FROM java:8
#作者
MAINTAINER xxx作者名称
# 把可执行jar包复制到基础镜像的执行路径下,"/"后直接是项目名称表示上传到基础镜像的跟目录
ADD 当前项目名称.jar /上传到镜像后的项目名称.jar
# 镜像要暴露的端口,如要使用端口,在执行docker run命令时使用-p生效
#端口号要与项目中的一致,可以设置传输协议,默认使用TCP,例如EXPOSE 80/tcp
EXPOSE 80
# ENTRYPOINT 表示后续根据当前Dockerfile创建的镜像,根据该镜像创建容器后,默认执行的第一条命令
# 此处第一条命令时可以理解为 java -jar 指定jar项目,"/"后直接是项目.jar表示在基础镜像的根目录下查找该项目
ENTRYPOINT ["java","-jar","/项目名称.jar"]

# 构建,不要忘了pro 后的".",表示上下文
docker build -t 构建的镜像名称 .
# 根据当前创建的镜像生成容器
docker run --name 容器名称 -d -p 端口映射,容器端口:镜像(项目)暴露的端口 镜像名称或镜像id
#启动容器后,查看容器日志,docker默认对日志进行了整合
docker logs 当前容器名称

Dockerfile常用指令解释

构建镜像需要创建Dockerfile文件,文件中编写构建指令,然后Docker服务读取该文件根据指令进行构建

  1. FROM 指令,在Dockerfile文件中第一行有效指令必须是FROM,表示当前构建的镜像使用的基础镜像,也可以理解为当前构建的镜像基础环境,例如上面构建一个SpringBoot项目的镜像,SpringBoot依赖与java环境,所以需要指定当前构建的项目依赖的基础镜像
#如果当前容器中没有java镜像,会自动下载,":"后是指定基础镜像的版本
FROM java:8
FROM 镜像名称或id:镜像版本号
  1. MAINTAINER : 设置制作当前镜像的作者名称,任意文本字符串(不推荐用后面被标识了过时)
  2. LABEL : 可以代替上面设置制作进行作者名称的命令,该命令是给镜像指定各种元数据
LABEL <作者名称>=<aaaa> <key>=<value> <key>=<value>...
  1. COPY 与 ADD : 都可以用于从宿主机复制文件到创建的新镜像文件中,区别是使用COPY命令复制文件到进行中不会解压,使用ADD命令复制文件到进行中会自动根据文件名创建目录自动解压(注意点如果使用ADD命令去网络上下载压缩包时不会解压)
#COPY 命令:
# <src>:要复制的源文件或者目录,可以使用通配符
# <dest>:目标路径,即正在创建的image的文件系统路径;建议<dest>使用绝对路径,
#否则COPY指令则以WORKDIR为其起始路径
COPY <src>...<dest>
COPY ["<src>",..."<dest>"]
规则:
<src> 必须是build上下文中的路径,不能是其父目录中的文件
如果 <src> 是目录,则其内部文件或子目录会被递归复制,但 <src> 目录自身不会被复制
如果指定了多个 <src> ,或在 <src> 中使用了通配符,则 <dest> 必须是一个目录,则必须以/符号结尾
如果 <dest> 不存在,将会被自动创建,包括其父目录路径

#ADD命令用法和COPY指令一样,ADD支持使用TAR文件和URL路径
ADD <src>...<dest>
ADD ["<src>",..."<dest>"]
规则:
和COPY规则相同
如果 <src> 为URL并且 <dest> 没有以/结尾,则 <src> 指定的文件将被下载到 <dest>
如果 <src> 是一个本地系统上压缩格式的tar文件,它会展开成一个目录;但是通过URL获取的tar文件不会自动
展开
如果 <src> 有多个,直接或间接使用了通配符指定多个资源,则 <dest> 必须是目录并且以/结尾
  1. WORKDIR : 为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录,后续的操作都是在WORKDIR 设置的目录下完成的,并且例如构建了一个tomcat容器,执行启动容器后,执行"docker exec -it 容器ID或者容器名 /bin/bash" 命令进入指定容器,默认会进入一个目录,但是当使用WORKDIR指定目录后,默认进入的是WORKDIR指定的目录
WORKDIR /目录地址
  1. VOLUME : 创建挂载点,可以挂在宿主机上的卷或者其它容器上的卷,注意点不能指定宿主机目录,使用的是自动生成的
VOLUME <mountpoint>
VOLUME ["<mountpoint>"]
  1. EXPOSE : 设置容器对外暴露的端口,通过该端口实现与外部通信
#<protocol> 用于指定传输层协议,可以是TCP或者UDP,默认是TCP协议
#EXPOSE可以一次性指定多个端口,例如: EXPOSE 80/tcp 80/udp
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]
  1. ENV 与 ARG 命令 : 用来给镜像定义所需要的环境变量,并且在Dockerfile文件中使用其它命令时用到了该环境变量,例如ENV、ADD、COPY等需要使用通过ENV或ARG定义的环境变量,可以通过调用的方式获取,调用格式: k e y 或者 key或者 key或者{variable_name}, ARG与ENV相同,区别在于在使用ARG定义的环境变量时,可以在外部传参数
#ENV 命令: 
#第一种格式中, <key> 之后的所有内容都会被视为 <value> 的组成部分,所以一次只能设置一个变量
#第二种格式可以一次设置多个变量,如果 <value> 当中有空格可以使用\进行转义或者对 <value> 加引号进行标识;
另外\也可以用来续行
ENV <key> <value>
ENV <key>=<value>...

#ARG命令:
#指定一个变量,可以在docker build创建镜像的时候,使用 --build-arg <varname>=<value> 来指定参数
ARG <name>[=<default value>]
  1. RUN : 用来指定docker build过程中运行指定的命令,也就是在构建容器时,默认执行的一段代码
#例如通过RUN命令安装vim,容器中默认是不支持vim命令的,假设后续进入容器的操作中想要使用vim命令,可以在该命令,指定在build容器只执行下载安装vim
RUN yum install -y vim

第一种格式里面的参数一般是一个shell命令,以 /bin/sh -c 来运行它
第二种格式中的参数是一个JSON格式的数组,当中 <executable> 是要运行的命令,后面是传递给命令的选项或者
参数;但是这种格式不会用 /bin/sh -c 来发起,所以常见的shell操作像变量替换和通配符替换不会进行;如果你运
行的命令依赖shell特性,可以替换成类型以下的格式

RUN <command>
RUN ["<executable>","<param1>","<param2>"]
RUN ["/bin/bash","-c","<executable>","<param1>"]
  1. CMD : 容器启动时运行的命令, RUN和CMD区别:

RUN指令运行于镜像文件构建过程中,CMD则运行于基于Dockerfile构建出的新镜像文件启动为一个容器的时候
CMD指令的主要目的在于给启动的容器指定默认要运行的程序,且在运行结束后,容器也将终止;不过,CMD命令可以被docker run的命令行选项给覆盖
Dockerfile中可以存在多个CMD指令,但是只有最后一个会生效

CMD <command>
CMD ["<executable>","<param1>","<param2>"]
CMD ["<param1>","<param2>"]
  1. ENTRYPOINT : 类似于CMD指令功能,用于给容器指定默认运行程序, 和CMD不同的是

ENTRYPOINT启动的程序不会被docker run命令指定的参数所覆盖,而且,这些命令行参数会被当
做参数传递给ENTRYPOINT指定的程序(但是,docker run命令的–entrypoint参数可以覆盖ENTRYPOINT)
docker run命令传入的参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用,同样,Dockerfile中可以存在多个ENTRYPOINT指令,但是只有最后一个会生效
ENTRYPOINT 与 CMD 的区别是: 假设在执行"docker run 其它命令"时,CMD 命令会被run后面添加的命令覆盖掉,ENTRYPOINT 不会,如果两个命令同时存在,谁在最后谁生效

ENTRYPOINT<command>
ENTRYPOINT["<executable>","<param1>","<param2>"]
  1. ONBUILD : 用来在Dockerfile中定义一个触发器

Dockerfile用来构建镜像文件,镜像文件也可以当成是基础镜像被另外一个Dockerfile用作FROM指令的参数,在后面这个Dockerfile中的FROM指令在构建过程中被执行的时候,会触发基础镜像里面的ONBUILD指令
ONBUILD不能自我嵌套,ONBUILD不会触发FROM和MAINTAINER指令
在ONBUILD指令中使用ADD和COPY要小心,因为新构建过程中的上下文在缺少指定的源文件的时候会失败

ONBUILD <instruction>

构建一个基础的centOS镜像示例

  1. linux下执行"mkdir 存放构建centOS镜像构建所需要的文件目录" 命令创建目录
  2. 当前构建的centOS镜像需要使用到Tomcat,JDK等jar,将这两个jar包上传到该目录下
  3. 注意点jar包解压前解压后的名称是否一致,如果不一致,在使用ENV配置环境变量时以解压后的为准,可以通过tar zxvf 包名称.jar 解压一下看看
  4. 编写Dockerfile文件命令
#1.FROM指令设置构建当前镜像使用的基础镜像
FROM centos:版本
#2.ADD命令解压Tomcat/usr/local目录下(由于已经将文件上传到了指定的目录下所以ADD命令不需要再次复制了)
ADD 上传上来的tomcat包 /usr/local
#.ADD命令解压JDK
ADD 上传上来的JDK包 /usr/local

#3.ENV 命令配置JAVA_HOME环境变量示例,
#也就是设置JAVA_HOME指向上传的JDK(主要上传的JDK包名与解压后的是否一致)
ENV JAVA_HOME=/usr/local/解压后的JDK名称
#4.ENV 命令配置CLASSPATH,可以直接通过"$"方式使用上面通过ENV配置的JAVA_HOME,
#连起来也就是配置CLASSPATH指向上传的JDK解压后的lib目录
ENV CLASSPATH=.$JAVA_HOME/lib

#5.Env 命令配置tomcat的catalina
ENV CATALINA_HOME=/user/local/上传的tomcat包解压后的名字

#6.将配置好的环境变量设置到contOS的path上
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

#7.使用WORKDIR 
WORKDIR $CATALINA_HOME

#8.使用RUN命令,设置一个docker build容器时指定执行的命令
#此处用来安装一个vim,当根据当前镜像创建容器时,默认执行该命令,安装了一个vim指令
RUN yum install -y vim

#9.使用EXPOSE命令设置当前镜像创建容器时对外暴露的端口(可以指定多个,指定连接协议等)
EXPOSE 8080

#10.使用VOLUME命令,设置挂载目录,也就是指定容器中的指定目录下的文件会生成到宿主机上的对应的挂载目录
#例如当前: 在上面使用WORKDIR 指令设置了工作目录为CATALINA_HOME,在该目录下有一个webapp目录
#当容器运行时在该目录下创建或修改该目录下的文件,都会将文件的变动设置到当前Docker宿主机的对应挂载目录下
#也就是"Mounts"中的"Source"指向宿主机的目录
VOLUME /webapp 

#11.使用ENTRYPOINT命令,设置启动容器时执行的命令,此处设置启动容器时执行该命令启动Tomcat
ENTRYPOINT ["catalina.sh","run"]
  1. 执行构建命令不要忘记后面的",": docker build -t 构建的镜像名称:版本 .
  2. 根据镜像运行容器: docker run --name 容器名称 -d -p 端口映射,容器端口:镜像(项目)暴露的端口 镜像名称或镜像id
  3. 例如构建一个SpringBoot项目镜像,在FROM时就可以基于当前自己的centOS进行构建

五. Docker 安装并配置 Centos

安装Centos

  1. 参考博客
  2. 参考上面Docker安装配置镜像加速器成功后,cmd窗口执行"docker search centos" 命令,或进入docker镜像仓库查询centos镜像版本,获取指定版本进行,执行命令下载镜像"docker pull centos:centos7"
  3. 执行"docker images"命令可以查看当前本地保存的镜像,也可以在ui页面查看
  4. 在Docker操作页面运行centos
    在这里插入图片描述
  5. 或通过cmd命令行方式运行:
  1. 注意Centos 系统默认 ssh 连接端口是 22 ,在一些特定的条件中,22 端口被禁用或者被屏蔽,因而无法使用 22 端口进行 ssh 连接,此时把 22 端口映射为其他端口进行 ssh 连接、访问,参考博客
  2. 防止后续重启ssh报错问题
//启动centos容器,并指定容器名称为k8s-master,并指定把docker上centos的50001端口映射到本机50001端口
docker run -it --name k8sMaster -p 50001:22 --privileged=true centos:centos7 /usr/sbin/init
  1. 运行后,执行"docker ps"查看当前运行的容器,获取到容器id,也就是"CONTAINER ID"位置数据
    在这里插入图片描述
  2. 执行命令"docker exec -it 容器ID /bin/bash"进入到运行的centos中,或通过ui进入
    在这里插入图片描述
  3. 会弹出另外一个命令行窗口,该窗口就是centos系统
    在这里插入图片描述

配置 Centos

  1. 上面启动并进入到centos系统后,安装ssh服务和网络必须软件,执行命令:
 yum install net-tools.x86_64 -y
 yum install -y openssh-server
  1. 安装过程中可能会报错"Failed to download metadata for repo ‘AppStream’ [CentOS] Failed to set locale, defaulting to C warning message on CentOS Linux when running yum", 需要更新你的 CentOS,你需要改变镜像的 vault.CentOS.org ,它们将被永久存档。或者,您可能想要升级到 CentOS Stream, 执行命令:参考文档,执行以下命令(执行完后后重新执行上面报错的命令)
# cd /etc/yum.repos.d/
# sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
# yum update -y
  1. 安装passwd软件(用于设置centos用户密码,便于用Xshell连),执行命令:
yum install passwd -y 
  1. 注意点在安装passwd软件时可能会报"Package passwd-0.79-6.el7.x86_64 already installed and latest version
    Nothing to do" 表示已经安装了该软件,此时就需要修改密码
    在这里插入图片描述
  2. 设置root用户密码与修改root密码指令::(两种中间都会提示输入两次密码)
#如果第一次安装passwod没有报错,执行设置root指令
passwd root
#如果第一次安装报错,提示已安装了,执行以下命令
passwd
  1. 重启ssh,执行以下命令
systemctl restart sshd
  1. 使用Xshell连接登录前首先要获取到本机的ip地址,cmd窗口执行"ipconfig"获取到ipv4地址就是本机ip
    在这里插入图片描述
    在这里插入图片描述
  2. 注意如果宿主机重启,不设置固定ip的话ip地址可能会变,使用Xshell连接时可能会返回一下错误,需要再次通过ipConfig获取宿主机ip
Connecting to ip地址:端口号...
Could not connect to '172.26.64.1' (port 50001): Connection failed.

CentOS 7 端口与防火墙相关设置

  1. CentOS升级到7之后,使用firewalld代替了原来的iptables,例如以下查看是否开放80端口命令
firewall-cmd --zone=public --add-port=80/tcp --permanent
  1. 注意在执行firewall相关命令时可能会报一下错误,表示没有安装firewall, firewall是防火墙
sh: firewall-cmd: command not found
Unit firewalld.service could not be found.
  1. 安装firewall 防火墙
yum install firewalld 
  1. 安装后,启动防火墙
systemctl start firewalld
  1. 关闭防火墙
systemctl stop firewalld
  1. 查看状态
systemctl status firewalld
  1. 开机禁用
systemctl disable firewalld
  1. 开机启用
systemctl enable firewalld
  1. 不中断服务的重新加载
firewall-cmd --reload
  1. 查看是否开启80端口
firewall-cmd --query-port=80/tcp
  1. 查看开放的端口
firewall-cmd --list-port
  1. 添加端口
//格式为:端口/通讯协议 permanent永久生效,没有此参数重启后失效
firewall-cmd --add-port=8080/tcp --permanent
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值