一、什么是Docker

1.1 Docker 是一个开源的容器引擎

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

image.png

1.2 Docker 的优势?

在Docker没有出现以前(诞生于 2013 年初),在容器及虚拟化领域的解决方案,通常是以虚拟机实现,其中VMware最为出名。但是使用虚拟机,依然存在一些问题:
比如,性能问题,虚拟机几乎是均分宿主机的硬件资源,抽象了更多要素。
管理麻烦,管理一台虚拟机等同管理一台物理主机。
扩展麻烦,需要再装一个系统。
image.png

1.3 Docker与Vmware

image.png
image.png
image.png

二、Docker 架构

2.1 理解Docker架构

image.png

2.2 Docker 中的3个概念

image.png

2.3 更好理解的案例

image.png

image.png

image.png

2.4 获得Docker

image.png

2.5 Docker 支持的平台

image.png

实际工作场景中通常是 在服务器类型操作系统中 部署Docker 我们上课案例 选择Linux系统中安装Docker,其他系统的安装参考官网文档

2.6 Docker 版本

image.png

三、Docker 安装

参考官网https://docs.docker.com/engine/install/centos/

3.1 卸载旧版本

安装千先卸载旧版本和相关依赖,如果没有也可以不运行。

  1. yum remove docker \
  2. docker-client \
  3. docker-client-latest \
  4. docker-common \
  5. docker-latest \
  6. docker-latest-logrotate \
  7. docker-logrotate \
  8. docker-engine

3.2 安装yum源

安装yum工具和设置可用的安装镜像源(yum源).

yum install -y yum-utils

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

**

3.3 安装Docker

  1. 默认安装为最新的

    yum install docker-ce docker-ce-cli containerd.io
    
  2. 当然也可以选择版本

    yum list docker-ce --showduplicates | sort -r
    docker-ce.x86_64  3:18.09.1-3.el7                     docker-ce-stable
    docker-ce.x86_64  3:18.09.0-3.el7                     docker-ce-stable
    docker-ce.x86_64  18.06.1.ce-3.el7                    docker-ce-stable
    docker-ce.x86_64  18.06.0.ce-3.el7                    docker-ce-stable
    yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
    
  3. 启动Docker

    systemctl start docker
    
  4. 验证安装结果

    docker run hello-world
    

四、Docker 镜像加速

4.1 官方镜像加速

image.png

4.2 修改镜像加速地址

image.png

4.3 阿里云专属镜像加速器

image.png

五、Docker 命令

image.png

5.1 命令预览

  • 辅助类

帮助类命令,指的是获得一些提示信息,通常包括,
docker version 查看软件版本
docker info 运行时的信息
docker help 查看帮助信息

  • 镜像类

镜像类命令,指的跟镜像操作相关的命令,通常包括,
docker images 查看本地镜像
docker search 在仓库中搜索镜像
docker pull 从仓库中拉取镜像
docker rmi 删除本地镜像

  • 容器类

容器类命令,指的跟容器操作相关的命令,通常包括,
docker run 创建并启动容器
docker ps 查询当前所有正在运行的容器
exit 停止容器并退出
ctrl + p +q 退出终端 不停止容器
docker attach 连接到正在运行的容器
docker start 启动容器
docker restart 重启容器
docker stop 停止容器(先关闭资源)并退出
docker kill 强制退出容器(杀进程式)
docker rm 删除已经停止的容器
docker logs 查看日志
docker cp 复制容器中的文件
docker exec 执行容器中的命令
docker inspect 获取容器/镜像的元数据。

5.2 命令详解

image.png

OPTIONS说明:

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;  /bin/bash

--name="nginx-lb": 为容器指定一个名称;
--restart always:  自动重启

-e 环境变量

-v 数据卷


-P: 映射随机端口
-p: 映射指定端口 ,就是把容器内容软件的端口 与 宿主机的端口对于的过程。
docker run -d -p9999:8080 --name tom1 tomcat:8.5.68-jdk8 -- 后台启动容器

docker run -it  -p9999:8080 --name tom2 tomcat:8.5.68-jdk8 /bin/bash  --前台启动容器

image.png

docker ps  运行的

docker ps -a 全部

docker ps -aq 全部的容器编号(配合docker rm 批量删除)

image.png

OPTIONS说明:
     --detach-keys string   重写用于分离容器的键序列
      --no-stdin                   不要附加标准输入
      --sig-proxy                 将所有接收到的信号代理给进程(默认为true )

image.png

image.png

image.png

image.png

image.png

docker exec -it  容器id /bin/bash

image.png

六、镜像原理

镜像就是一个可以在Docker引擎上独立运行的软件包,这个软件包 包含了各种软件,依赖,及配置文件等。镜像文件采用的是联合文件系统(Union File System),这个文件系统是要给分成的文件系统,他允许不同的文件目录挂在的同一个虚拟目录下下,并且把文件的一次修改提交作为一个新层记录到镜像中。

6.1 镜像层理解

image.png
一个镜像是通过层层叠加而来的,镜像的顶层可以读写,每次的修改就会形成新的一个新的镜像。

image.png

6.2 镜像修改

例子:
启动 tomcat  容器
docker run -it  -p 主机端口:容器端口  容器ID

修改tomcat
保存提交重命名镜像
docker commit -a=”作者” -m=”备注”  容器ID   镜像名:tag    

启动新的镜像

6.3 数据管理

容器中管理数据主要有两种方式:

数据卷(Data Volumes)
作用:主机容器共享数据
docker run -v /hostDir : /containerDir[:ro]  -it --name aliases  Image[/bin/bash]
:ro 是readonly的意思,表示容器只可读

数据卷容器(Data Volumes Containers)
作用:容器之间共享数据
docker run  -v /hostDir : /containerDir  -it   --name aliases Image 
docker run  --volumes-from targetContainer  --name aliases  Image

6.4 构建镜像

6.4.1.DockerFile 文件

Docker可以通过从Dockerfile中读取指令来自动构建镜像。Dockerfile是一个文本文档,包含用户可以在命令行上调用的所有命令,以组合镜像。 使用docker build,docker 即可启动构建工作,构建过程为连续执行DockerFile中的多个命令行指令。

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20201113" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"]

6.4.2 DockerFile语法和流程

  • DockerFile 基础语法
  • 关键字指令 必须为大写字母,且至少需要一个参数
  • 关键字指令 从上到下顺序执行
  • #表示注释
  • [x] 每条指令执行都会创建一个镜像层

  • DockerFile 执行流程

  • docker 从基础镜像 运行一个容器。
  • 执行一条指令并对容器做出修改。
  • 执行类似docker commit 的操作 提交一个新的镜像层。
  • docker再基于刚刚提交的镜像 运行一个新容器。
  • 执行dockerfile中的下一条指令直到所有的指令都执行完成。

6.4.3 DockerFile 指令详解

DockerFile 关键字指令
FROM : FROM指令初始化新的构建阶段,并为后续指令设置基本镜像。
MAINTAINER(过期):维护者指令设置生成镜像的作者字段,使用Label。
RUN:将在当前镜像之上的新层中执行任何命令,并提交结果。
EXPOSE:容器在运行时监听指定的网络端口。EXPORT不会让主机访问容器的端口。
WORKDIR:为文件中跟随它的任何RUN、CMD、ENTRYPONT、COPY和ADD指令设置工作目录。
ENV:设置环境变量
ADD: 复制文件,并将它们添加到镜像文件系统的指定目录。
COPY:类似ADD
VOLUME:设置数据卷
CMD:一个文件中只能有一条CMD指令。如果您列出了多个CMD,则只有最后一个CMD会生效。
ENTRYPOINT:类似CMD
ONBUILD :当镜像被用作另一个构建的基础时,ONBUILD指令在镜像中添加了一个稍后要执行的触发指令。

6.4.4 自定义镜像 centos

1、编写DockerFile 文件
2、使用docker build 构建镜像
3、使用docker run 创建容器

FROM  centos
LABEL author="lianghui@qq.com"
ENV  myhome /tmp
WORKDIR $myhome
RUN yum -y install vim
RUN mkdir /datavolume
VOLUME  /datavolume
CMD /bin/bash

构建镜像 docker build -f dockerfile_path -t image:tag .

6.4.6 构建centos+vim+tomcat镜像

#选择基础镜像
FROM  centos
#设置描述信息
LABEL maintainer="lianghui@qq.com"
#测试COPY从主机拷贝文件到容器
COPY testcp.txt /usr/local/testcp.txt
#在基础镜像上安装软件 apache-tomcat-9.0.13.tar.gz 和  jdk-8u181-linux-x64.tar.gz
ADD jdk-8u181-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.13.tar.gz /usr/local/
#安装  vim 编辑器
RUN yum -y install vim
#设置 容器数据卷
RUN mkdir /dataVolume
VOLUME  /dataVolume

#设置工作路径
ENV MYPATH /usr/local
WORKDIR $MYPATH
#设置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.13
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.13
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器监听端口
EXPOSE 8080
#启动时运行 tomcat
CMD /usr/local/apache-tomcat-9.0.13/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.13/bin/logs/catalina.out

七、DockerCompose 服务编排

服务编排的作用是,把多个容器纳入统一管理,比如一个应用的运行环境需要tomcat 、mysql、nginx、redis 、MQ 等软件,如果通过Dokcer 单独启动会很繁琐。其实这是可以有多种思路解决这个问题,比如 把启动多个docker容器 编写成 shell脚本,通过执行脚本可以一次性启动全部软件, 或者可以编写DockerFile把全部软件集成到一个镜像中,docker-compose 的做法是不写脚本,但是编写 yml文件,在文件中集中生命全部需要执行的镜像。同样达到统一管理软件环境的效果 。

7.1 安装Docker-compose 软件

1. 下载软件

https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64

2.重命名与修改权限

mv ocker-compose-Linux-x86_64 docker-compose
chmod -R 777 docker-compose

3.移动到 /usr/local/bin

mv docker-compose /usr/local/bin

4.配置环境变量

vi /etc/profile

JAVA_HOME=/opt/jdk8
PATH=$JAVA_HOME/bin:/usr/local/bin:$PATH
export PATH

source /etc/profile

5 运行docker-compose

docker-compose

7.2 编写docker-compose.yml

1 docker-compose.yml

docker-compose 的核心就是编写 docker-compose.yml 配置文件,这个配置文件就是一个编排计划,这就是给
docker-compose 的执行任务。名字固定 ,在此文件同级启动 docker-compose 即可。

2 语法要求

  • version: ‘3.1’ 声明版本
  • services: 配置服务,它下面可以声明多个服务,实际上一个服务就对应一个需要启动的镜像实例。
  • 每个服务名字自定义,但是不可以重复,下一级声明需要缩进两格。
  • restart 表示随docker 启动自动启动
  • image 表示对应的镜像
  • container_name 表示容器
  • ports 表示端口映射
  • environment 表示初始化环境变量
  • volumes 表示数据卷挂载

3 编写一个文件

version: '3.1'
services:
  mysql:           # 服务的名称
    restart: always   # 代表只要docker启动,那么这个容器就跟着一起启动
    image: daocloud.io/library/mysql:5.7.4  # 指定镜像路径
    container_name: mysql  # 指定容器名称
    ports:
      - 3306:3306   #  指定端口号的映射
    environment:
      MYSQL_ROOT_PASSWORD: root   # 指定MySQL的ROOT用户登录密码
      TZ: Asia/Shanghai        # 指定时区
    volumes:
     - /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql   # 映射数据卷
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:8.5.15-jre8
    container_name: tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
      - /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs

7.3 管理命令

在使用docker-compose的命令时 ,默认会在当前目录下找docker-compose.yml文件

# 1. 基于docker-compose.yml启动管理的容器
docker-compose up -d

# 2. 关闭并删除容器
docker-compose down

# 3. 开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart

# 4. 查看由docker-compose管理的容器
docker-compose ps

# 5. 查看日志
docker-compose logs -f

八、Docker 软件安装

1. 项目运行所需要的软件

这些软件构成了整体软件运行环境,这个环境可以是生产环境 开发环境 测试环境。常见的 tomcat mysql redis nginx rabbitMQ
具体的安装过程已经了解,找对镜像run 可以了。

2 项目代码管理软件

比如需要管理 jar 包,目前都是通过 aliyun的镜像仓库下载,只能下载公共的jar , 无法共享公司内部jar 。再比如说 代码厂库使用的是 gitee 或者 gitbub ,存在不可访问和代码泄露的风险,再比如所需要做代码的持续集成和交付,也需要jenkins。

附录:其他问题

IPv4 forwarding is disabled. Networking will not work

1、编辑 vi /etc/sysctl.conf
2、添加 net.ipv4.ip_forward=1
3、重启network服务 systemctl restart network