Docker的使用

1.Docker的概念

        Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker从17.03版本之后分为CE(社区版)和EE(企业版)。Docker是一种容器技术,解决软件跨环境迁移问题。

2.为什么是使用docker?

        项目在开发时面临的环境有:(1)开发环境 (2)测试环境 (3)线上环境

        在不同环境上部署项目时可能使用的jdk版本不一致,就可能导致项目部署不成功。

Docker的使用_第1张图片

        使用docker技术,解决项目的跨平台问题。

3.如何安装docker软件

        Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本次是基于CentOS7安装Docker。官网: Docker: Accelerated, Containerized Application Development  。

# 1、yum包更新到最新---因为现在的docker更新比较快,而现在我们使用的centos可能不是最新
yum update
#2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的  如果提示软件包已经安装   只需要把相应的安装包在命令中去掉即可
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置yum源---从哪个网址下载docker软件
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

         在输入查看版本号命令后,如下显示则表示安装成功,需注意版本号可能存在不同

 4.Docker架构

Docker的使用_第2张图片

  • 镜像(lmage) : Docker镜像(lmage),就相当于是—个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。

  • 容器(Container) :镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

    比如: 安装mysql====>下载mysql的镜像 【类】 ---->根据镜像可以创XQ [对象]

 5.配置镜像加速器

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

USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)

==阿里云== 网易云

腾讯云

        我们以阿里云为例:

Docker的使用_第3张图片

 Docker的使用_第4张图片

Docker的使用_第5张图片

 6.Docker中的常用命令

        6.1关于docker服务的命令

        (1)查看docker服务的状态:systemctl status docker

Docker的使用_第6张图片

         running为运行状态

        (2)关闭docker服务:systemctl stop docker

         (3)启动docker服务:systemctl start docker

Docker的使用_第7张图片

         (4)重启docker服务:systemctl restart docker

Docker的使用_第8张图片

         (5)开机启动docker服务:systemctl enable docker

Docker的使用_第9张图片

         6.2 关于docker镜像的命令

        (1)拉取指定的镜像到本地

docker pull centos #拉取centos镜像  如果没有使用版本默认为latest
docker pull centos:7 # :7表示版本号

         (2)查看本地镜像

docker images

Docker的使用_第10张图片

         (3)删除本地镜像

docker rmi imageID  #根据镜像id删除镜像
docker rmi name:tag #根据名称版本号删除镜像

         (4)搜索镜像-----》建议在镜像仓库搜索www.hub.docker.com

docker search 镜像名称

         6.3 关于docker容器的命令

        (1)根据镜像创建容器第一种方式:此种方式如果退出容器时,会关闭容器

docker run -it --name=a1 centos:7 /bin/bash

-i  保持容器一直运行  因为容器没有客户端链接会自动关闭

-t  给容器分配伪终端接收命令

--name  给容器取名字

centos:7 镜像加版本号

/bin/bash  进入容器的初始化指令   这里相当于打开一个shell窗口

         (2)查看所有容器

docker ps #查询正在运行的容器
docker ps -a  # 查询所有的容器

Docker的使用_第11张图片

         (3)根据镜像创建容器第二种:此种方式创建时不会进入容器内部

docker run -id --name=a2 centos:7  #根据镜像创建容器当不会进入容器内部

         (4)进入指定容器内部  进入该容器后再退出不会关闭容器

docker exec -it a2  /bin/bash

Docker的使用_第12张图片

         (5) 关闭容器

docker stop 容器id或名称

        (6)开启容器

 docker start 容器id或名称

Docker的使用_第13张图片

        (7)删除容器    需注意删除容器时该容器必须为关闭状态

 docker rm 容器id或名称

         此时容器a2没有关闭,删除时会报错

         先关闭容器a2,再删除容器a2时可以正常删除

Docker的使用_第14张图片

7.Docker中的数据卷

        7.1 数据卷的概念

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

        7.2 数据卷的作用

        在了解数据卷的作用前,我们思考三个问题:

        (1)docker容器删除后,容器中的数据还存在吗?

Docker的使用_第15张图片

        (2)docker容器和外部机器可以直接进行交互吗?

Docker的使用_第16张图片

        (3)容器之间可以进行数据共享吗?

Docker的使用_第17张图片

         为了解决以上问题,我们就要使用数据卷了,数据卷的作用正好解决以上问题。

        数据卷可以解决数据持久化的问题,解决外部机器和容器的间接通讯问题,也可以解决容器之间的数据交换。

        7.3 配置数据卷

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

docker run ....  -v 宿主机目录(文件):容器内目录(文件)....

        注意事项:

        (1)目录必须为绝对路径

        (2)如果目录不存在,会自动创建

          (3) 可以挂载多个数据卷

        演示:数据卷和容器中的目录内容会进行同步。

Docker的使用_第18张图片

        演示: 当容器被删除后,再次开启新容器时 只要和数据卷绑定 那么原来的数据不会丢失

Docker的使用_第19张图片

Docker的使用_第20张图片

        演示: 多个容器之间可以通过数据卷完成数据的共享

Docker的使用_第21张图片

8. 使用Docker安装软件(以MySQL,Tomcat,Redis,Nginx为例)

        8.1 安装mysql

Docker的使用_第22张图片

Docker的使用_第23张图片

 1.创建目录: mkdir -p /root/mysql
2.切换到mysql目录: cd  /root/mysql
3.拉取mysql镜像 docker pull mysql:5.7
4.创建mysql容器.
    docker run -id \
    -p 3307:3306 \
    --name=c_mysql \
    -v $PWD/conf:/etc/mysql/conf.d \
    -v $PWD/logs:/logs \
    -v $PWD/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    mysql:5.7Docker的使用_第24张图片

参数说明:

  • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。

  • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录

  • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录

  • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录

  • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

        验证是否可以连接到mysql 

Docker的使用_第25张图片

         8.2 安装tomcat

Docker的使用_第26张图片

 1.创建目录: mkdir -p /root/tomcat
2.切换到tomcat目录: cd  /root/tomcat
3.拉取tomcat镜像 docker pull tomcat
4.创建容器: 
   docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD/webapps:/usr/local/tomcat/webapps \
tomcat

Docker的使用_第27张图片

         验证:在宿主机中webapps目录下创建test目录 并在test目录下创建一个网页index.html

Docker的使用_第28张图片

Docker的使用_第29张图片

         8.3 安装redis

Docker的使用_第30张图片

         搜索redis镜像 docker search redis

        拉取redis镜像 docker pull redis:5.0

         创建容器,设置端口映射

docker run -id --name=c_redis -p 6379:6379 redis:5.0

         使用外部机器连接redis

Docker的使用_第31张图片

         8.4 安装nginx

Docker的使用_第32张图片

         搜索nginx 

        拉取nginx镜像

         创建容器设置端口映射,目录映射

# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vi nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
worker_connections  1024;
}


http {
include       /etc/nginx/mime.types;
default_type  application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

sendfile        on;
#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;

include /etc/nginx/conf.d/*.conf;
}

 docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx

参数说明:

  • -p 80:80:将容器的 80端口映射到宿主机的 80 端口。

  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录

  • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录

        使用外部机器访问nginx

        在html容器卷目录下创建index.html文件

9. 自定义镜像

        上面讲解的内容需要的镜像 都是从远程仓库拉取,我们能否把自己写的工程也变成一个镜像。可以的。 需要自定义镜像

        9.1 Docker镜像的原理

思考:

  • Docker镜像本质是什么?

  • Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?

  • Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有10多MB?

操作系统组成部分: 计算机组成原理

  • 进程调度子系统

  • 进程通信子系统

  • 内存管理子系统

  • 设备管理子系统

  • ==文件管理子系统==

  • 网络通信子系统

  • 作业控制子系统

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

  • bootfs:包含bootloader (引导加载程序)和kernel(内核)

  • rootfs: root文件系统,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件

  • ·不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等

Docker的使用_第33张图片

  • Docker镜像是由特殊的文件系统叠加而成

  • 最底端是bootfs,并使用宿主机的bootfs

  • 第二层是root文件系统rootfs,称为base image: 基础镜像

  • 然后再往上可以叠加其他的镜像文件

  • 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。

  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

Docker的使用_第34张图片

         9.2 镜像制作

        自定义镜像:提供了两种方式: 第一种:基于容器来制作 第二种: 通过dockerfile文件来制作,第二种重点。

        第一种 容器转为镜像:

Docker的使用_第35张图片

 步骤: 把现有的镜像--运行成一个容器---修改容器中的内容--->变成镜像---把镜像压缩文件--->交给其他人---变成本地镜像

Docker的使用_第36张图片

Docker的使用_第37张图片

Docker的使用_第38张图片

docker commit 容器id 镜像名:版本号 [把指定的容器变成镜像]

docker save -o 压缩文件名 镜像名:版本号 [把指定的镜像压缩为一个压缩文件]

docker load -i 压缩文件名 【把压缩文件变成本地镜像】

        9.3 dockerfile的概念

  • Dockerfile是一个文本---任意一个镜像都是通过dockerfile来制作

  • 文件包含了一条条的指令

  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境

  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了

  • 对于运维人员:在部署时,可以实现应用的无缝跨平台移植

Docker的使用_第39张图片

         9.4 Dockerfile的关键字

        注意:命令dou'x

关键字 作用 备注
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 执行命令的时候 使用的shel

        9.5 Dockerfile案例

        9.5.1 案例1Docker的使用_第40张图片

        编辑dockerfile文件

[root@localhost docker-files]# vi centos_dockerfile

FROM centos:7
MAINTAINER aaa <[email protected]>
RUN yum install -y vim 
WORKDIR /usr
CMD ["/bin/bash"]

        构建镜像

[root@localhost docker-files]# docker build -f centos_dockerfile -t zz_centos:1.0 .
-f:表示dockerfile文件
-t: 镜像名称版本号 
.: 必须加上

Docker的使用_第41张图片

        创建容器

[root@localhost docker-files]# docker run -it --name=zz_centos zz_centos:1.0 /bin/bash

         9.5.2 案例2

Docker的使用_第42张图片

         准备好springboot jar包并传至宿主机根目录

         创建dockerfile文件并编辑

FROM java:8
MAINTAINER zzz<[email protected]>
ADD 11.jar app.jar
CMD java -jar app.jar

        根据dockerfile制作镜像

[root@localhost ~]# docker build -f ./springboot_dockerfile -t app:1.0 .

        启动并作端口映射

docker run -id -p 9000:8080 app:1.0

Docker的使用_第43张图片

        测试

Docker的使用_第44张图片

        9.6 如何把本地镜像上传到案阿里远程镜像仓库

作为开发: 我们需要把自己的项目----通过dockerfile 变成一个镜像----上传到远程仓库【hub.docker或者阿里云镜像仓库】

作为测试:

作为运维: 从远程仓库下载镜像---通过镜像运行容器。部署项目。

采用:阿里云镜像仓

Docker的使用_第45张图片 Docker的使用_第46张图片

 Docker的使用_第47张图片

Docker的使用_第48张图片

Docker的使用_第49张图片

Docker的使用_第50张图片

Docker的使用_第51张图片

 

 

你可能感兴趣的:(docker,linux,运维)