微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

docker

docker

一 Docker介绍

1 Docker初识

一款产品(软件)至少经过:开发和生产(线上)这两套环境

  • 开发人员:写好的代码本机可以运行
  • 运维人员:部署代码时却无法运行

专治水土不服.

2 Docker概念

  • Docker 是一个开源的应用容器引擎,官网:https://www.docker.com
  • 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
  • Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
  • 容器是完全使用沙箱机制,相互隔离
  • 容器性能开销极低。

3 Docker架构

镜像(Image):

  • 就是一个只读模板,比如:一个镜像可以包含一个完整的CentOS,里面仅安装jdk或用户的其他应用。
  • 镜像可以用来创建docker容器。

容器(Container):

  • 镜像和容器的关系,就像是面向对象程序设计中的类和对象一样。
  • 容器是从镜像创建的运行实例,它可以被启动、停止、 删除
  • 每个容器都是相互隔离的、保证安全的平台。
  • 可以把容器看做是一个简易版的Linux 环境(包括root用户权限、进程空间、用户空间)和运行在其中的应用程序。

仓库(Repository):

  • 仓库是集中存放镜像文件的场所。
  • 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

4 导入linux镜像

安装好centos之后,需要关闭防火墙

在资料中提供了linux镜像压缩包的种子, 大家下载后 , 解压到非中文路径

也可以自己安装linux虚拟机,然后再安装docker

进入解压目录,双击docker.vmx启动VMware

开启此虚拟机

虚拟机用户名:root、密码:123456

ifconfig查看ens33网卡的ip地址

通过客户端实现远程连接 (CRT或者MobaXterm)

5 Docker安装【已完成】

Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上

本课程基于CentOS 7 安装Docker:

# 1、yum 包更新到最新 
yum update

# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 
yum install -y yum-utils device-mapper-persistent-data lvm2

# 3、设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 4、安装docker,出现输入的界面都按 y 
yum install -y docker-ce

# 5、查看docker版本,验证是否验证成功
docker -v

# 6、启动docker环境
systemctl start docker

# 7、设置开机自启动
systemctl enable docker

每次使用docker务必保证防火墙是关闭状态

  1. 查看防火墙状态

systemctl status firewalld

  1. 若是active(激活状态)就需要关闭防火墙

systemctl stop firewalld

6 配置镜像加速器【已完成】

认情况下,将来从docker hub(https://hub.docker.com/)上下载docker镜像,太慢。一般都会配置镜像加速器:

创建或修改 /etc/docker/daemon.json文件修改为如下形式:

# 中国科技大学镜像地址
{
 "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

或者

# 网易云镜像地址
{
 "registry-mirrors":["http://hub-mirror.c.163.com"]
}

或者

使用阿里云镜像,不过需要自己手动生成加速地址  https://cr.console.aliyun.com/

# 重启docker
systemctl restart docker

# 查看是否成功
docker info

二 Docker常用命令【掌握】

1 进程(应用)相关命令

# 启动服务
systemctl start docker 

# 停止服务 
systemctl stop docker

# 重启服务	
systemctl restart docker

# 查看服务的状态	
systemctl status docker 

# 设置开机自启动 
systemctl enable docker

2 镜像相关命令

# 查看本地镜像 
docker images

# 搜索镜像仓库,推荐:https://hub.docker.com/
docker search 镜像名称 

# 下载(拉取)镜像,镜像名称格式为 名称:版本号
docker pull 镜像名称

# 删除镜像(慎重)
docker rmi 镜像名称

3 容器相关命令

# 查看本地容器
docker ps 	  # 能查看正在运行
docker ps -a  # 能查看所有的容器(运行的和停止的)

# 创建一个新的容器并运行(交互式)
docker run -it --name=容器名 镜像名称 /bin/bash

# 启动容器
docker start 容器名称

# 停止容器
docker stop 容器名称

# 删除容器
docker rm 容器名称


# 创建一个新的容器并运行(守护式)
docker run -d --name=容器名 镜像名称
# 进入容器内部
docker exec -it 容器名称 /bin/bash


# 查看容器信息
docker inspect 容器名称

# 退出容器
exit

参数说明:

  • -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭
  • -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
  • -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭
  • -it 创建的容器一般称为交互式容器,-d 创建的容器一般称为守护式容器
  • –name:为创建的容器命名。

4 小结

应用的命令

  • systemctl start|stop|restart|status docker

镜像的命令

  • docker search 镜像名称
  • docker pull 镜像名称:版本
  • docker rmi 镜像名称:版本
  • docker images

容器的命令

  • docker ps -a
  • 创建
    • 交互式: docker run -it --name=容器名字 /bin/bash
    • 守护式: docker run -d --name=容器名字
  • docker start 名字(id)
  • docker stop 名字(id)
  • docker rm 名字(id)
  • docker ps -qa :查询所有容器id
  • 批量进行操作
    • docker stop docker ps -qa

三 Docker应用部署【作业】

1 部署MysqL

外部机器访问宿主机的端口号的时候,就可以访问容器

-p 宿主机端口号:容器端口号

# 搜索MysqL镜像
docker search MysqL

# 拉取MysqL镜像
docker pull MysqL:5.7

# 创建并启动容器
docker run -d -p 3306:3306 --name=MysqL5.7 -e MysqL_ROOT_PASSWORD=root MysqL:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

# 操作容器中的MysqL  可以不操作
docker exec -it MysqL5.7 /bin/bash

# 退出容器 
exit

2 部署Tomcat

# 搜索tomcat镜像
docker search tomcat

# 拉取tomcat镜像
docker pull tomcat:8.5

# 创建并启动容器
docker run -d --name=tomcat8.5 -p 8080:8080 tomcat:8.5

# 操作容器中的tomcat 
docker exec -it tomcat8.5 /bin/bash

# 在webapps下创建ROOT目录
cd /usr/local/tomcat/webapps
mkdir ROOT

# 退出容器
exit

# 从宿主机复制文件到容器
# docker cp 宿主机路径 容器名称:容器路径
docker cp /root/index.html tomcat8.5:/usr/local/tomcat/webapps/ROOT

3 部署Redis

# 搜索redis镜像
docker search redis

# 拉取redis镜像
docker pull redis:5.0

# 创建并启动容器
docker run -d --name=redis5.0 -p 6379:6379 redis:5.0

# 操作容器中的redis  可以不操作
docker exec -it redis5.0 /bin/bash

4 部署Nginx

# 搜索Nginx镜像
docker search Nginx

# 拉取tomcat镜像
docker pull Nginx:1.16.1

# 创建并启动容器
docker run -d --name=Nginx -p 80:80 Nginx:1.16.1

# 操作容器中的Nginx  可以不操作
docker exec -it Nginx /bin/bash

四 Docker数据卷【理解】

1 数据卷概念

思考:

  • Docker 容器删除后,在容器中产生的数据也会随之销毁
  • Docker 容器和外部机器可以直接交换文件吗?
  • 容器之间想要进行数据交互?

数据卷:

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以被挂载多个数据卷

2 配置数据卷

# 创建启动容器时,使用 –v 参数 设置数据卷
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...

注意事项:

  1. 目录必须是绝对路径
  2. 如果目录不存在会自动创建
  3. 可以挂在多个数据卷
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir -p /root/tomcat/webapps

# 创建容器,设置端口映射、目录映射
docker run -d --name=tomcat1 -p 8081:8080 --privileged=true \
-v /root/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat:8.5


docker run -d --name=tomcat2 -p 8082:8080 --privileged=true \
-v /root/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat:8.5

五 Docker镜像【了解】

1 镜像原理

思考

  • Docker 镜像本质是什么?
  • Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要4个G?
  • Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有10多MB?

我们现在的docker是运行在linux系统,这边我们就拿linux系统举例

Linux文件系统由bootfs和rootfs两部分组成

  • bootfs:包含bootloader(引导加载程序)和 kernel(内核)
  • rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
  • 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等

Docker 镜像原理

  • 一个分层文件系统
  • 最底端是 bootfs,并使用宿主机的bootfs
  • 第二层是 root文件系统rootfs,称为base image
  • 然后再往上可以叠加其他的镜像文件
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

2 镜像制作

容器转为镜像(了解)

# 1、将容器制作镜像
docker commit 容器id 镜像名称:版本号

# 2、将镜像进行压缩  压缩文件使用tar即可
docker save -o 压缩文件名称 镜像名称:版本号

# 3、解压文件获得镜像
docker load –i 压缩文件名称

Dockerfile

  • Dockerfile 是一个用于生产docker镜像的文本文件
  • 包含了一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
  • 对于运维人员:在部署时,可以实现应用的无缝移植
关键字作用备注
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

3 Dockerfile案例

自定义centos7镜像

需求:

  1. 登录路径为 /usr
  2. 可以使用vim文本编辑器

镜像制作

# 1. 创建并进入docker-files目录下
mkdir /root/docker-files
cd /root/docker-files

# 2. 编辑centos的dockerfile文件
vim centos-dockerfile

# 3. 编写自定义镜像文件内容
FROM centos:7
MAINTAINER  itheima <itheima@itcast.cn>
RUN yum install -y vim
workdir /usr
CMD /bin/bash

# 4. 通过dockerfile构建镜像  别漏掉了最后的"."
docker build -f ./centos-dockerfile -t centos-itheima:7 .

# 5. 创建容器并测试
docker run -it centos-itheima:7 /bin/bash

自定义springboot容器

需求:

基于jdk1.8环境运行springboot项目,打包为镜像

镜像制作

# 1. 将springboot-hello-0.0.1-SNAPSHOT.jar上传到linux
# 2. 编辑springboot的dockerfile文件
vim springboot-dockerfile

# 3. 编写自定义镜像文件内容
FROM java:8
MAINTAINER  itheima <itheima@itcast.cn>
ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar

# 4. 通过dockerfile构建镜像
docker build -f ./springboot-dockerfile -t app-itheima .

# 5. 创建容器并测试
docker run -id -p 18080:8080 --name=app app-itheima


六 Docker服务编排【了解】

1 什么是服务编排

微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大:

  • 要从Dockerfile build image 或者去dockerhub拉取image
  • 要创建多个container
  • 要管理这些container(启动停止删除

2 Docker Compose

Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。

使用步骤:

  • 利用 Dockerfile 定义运行环境镜像
  • 使用 docker-compose.yml 定义组成应用的各服务
  • 运行 docker-compose up 启动应用

安装

# 安装docekr compose 工具-- 已完成
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

3 编排运行多个容器

需求

使用docker compose编排Nginx+springboot项目

代码实现

  1. 创建/root/docker-compose 目录
mkdir /root/docker-compose

cd /root/docker-compose

  1. 编写 docker-compose.yml 文件
version: '3'
services:
  Nginx:
   image: Nginx:1.16.1
   ports:
    - 80:80
   links:
    - app
   volumes:
    - /root/Nginx/conf.d:/etc/Nginx/conf.d
   privileged: true
  app:
    image: app-itheima
    expose:
      - "8080"

  1. 创建./Nginx/conf.d目录
mkdir -p /root/Nginx/conf.d
cd /root/Nginx/conf.d

  1. 在/root/Nginx/conf.d目录下 编写itheima.conf文件
server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://app:8080;
    }   
}

  1. 在/root/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
或者以守护进程方式启动
docker-compose up -d  

  1. 测试访问

七 Docker和VM对比【理解】

相同:

  • 容器和虚拟机具有相似的资源隔离和分配优势

不同:

  • 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
  • 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统
特性容器虚拟机
启动秒级分钟级
硬盘使用一般为MB一般为GB
cpu/内存消耗
系统支持单机支持上百个容器一般十几个

八 总结

docker命令:

systemctl start|stop|restart|status docker

镜像命令:

查看:

​ docker images

搜索:

​ docker search 镜像名称

拉取镜像:

​ docker pull 镜像名称:版本

删除镜像:

​ docker rmi 镜像名称:版本

容器命令:

查看:

​ docker ps [-a]

创建容器且启动(一旦需要挂载数据卷的时候,注意权限问题 --privileged=true)

​ 交互式: docker run -it --name=容器名称 -p 宿主机端口号:容器端口号 -v 宿主目录:容器目录 镜像:版本 /bin/bash

​ 守护式: docker run -d -name=容器名称 -p 宿主机端口号:容器端口号 -v 宿主目录:容器目录 镜像:版本

进入容器:

​ docker exec -it 容器名称 /bin/bash

容器启动|停止|删除

​ docker start|stop|rm 容器名称
查看某个容器具体信息

​ docker inspect 容器名称

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐