一、安装
官网:www.docker.com
安装步骤(CenteOS 7)
-
yum包更新到最新
yum update
-
安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
# -y:意思是需要输入Y运行下一步的自动帮我们键入Y yum install -y yum-utils device-mapper-persistent-data lvm2
-
设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce/repo
-
安装docker,出现输入的界面都按 y
yum install -y docker-ce
-
查看docker版本,验证是否安装成功
docker -v
二、初识Docker
Docker架构
架构图
解析
- 镜像(Image):Docker镜像,相当于是一个root文件系统。比如官方镜像Ubuntu:16.04 就包含了完整的一套Ubuntu16.01最小系统的root文件系统。
- 容器(Container):镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像时静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可以看成是一个代码控制中心,用来保存镜像。
配置Docker镜像加速器
从docker hub(https://hub.docker.com)下载docker镜像,太慢,一般都会配置镜像加速器:
- USTC
- 阿里云
- 腾讯云
- 。。。。。。
以阿里云为教程配置
- 登录阿里云
- 搜索【容器镜像服务】
- 选择【镜像加速器】
- 选择需要的配置代码复制粘贴即可
- 查看是否配置成功
# 查看配置文件是否配置加速器地址成功
cat /etc/docker/daemon.json
三、Docker命令
1. Docker服务相关命令
-
启动Docker服务
systemctl start docker
-
停止Docker服务
systemctl stop docker
-
重启Docker服务
systemctl restart docker
-
查看Docker服务状态
systemctl status docker
2. Docker镜像相关命令
-
查看镜像:查看本地所有的镜像
docker images # 查看所有镜像的ID docker images -q
-
搜索镜像:从网络中查找需要的镜像
docker search <镜像名称>
-
拉取镜像:从Docker仓库下载镜像到本地
- 镜像名称格式:名称:版本号
- 如果版本号不指定则获取最新的版本
- 如果不知道镜像版本,可以去 docker hub 搜索对应镜像查看
docker pull <镜像名称>[:版本号]
-
删除镜像:删除本地Docker镜像
# rmi:remove image # 按ID删除 docker rmi <id> # 按镜像名称和版本号删除 docker rmi <镜像名称:版本号> # 删除全部镜像,删除所有查询到的镜像ID docker rmi `docker images -q`
3. Docker容器相关命令
-
查看容器
# 查看正在运行的容器 docker ps # 查看所有容器 docker ps -a
-
创建并启动容器
docker run <参数> # 例子1: docker run -it --name=<容器名称> <镜像名称><:版本号> [/bin/bash] # /bin/bash 进入终端 docker run -it --name=c1 centos:7 /bin/bash # 例子2: # 创建容器 docker run -id --name=c2 centos:7 # 进入容器: docker exec -it <容器名称> /bin/bash docker exec -it c2 /bin/bash
参数说明:
-
-i:保持容器运行。通常与【-t】同时使用。加入【it】两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
-
-t:为容器重新分配一个伪输入终端,通常与【-i】同时使用。
# 退出终端命令 exit
-
-d:以守护(后台)模式运行容器。创建一个容器,在后台运行,需要使用docker.exe进入容器。推出后,容器不会关闭。
-
-it:创建的容器一般称为交互容器
-
-id:创建的容器一般称为守护式容器
-
--name:为创建的容器命名
-
-
启动容器
docker start <容器名称>
-
停止容器
docker stop <容器名称>
-
删除容器:未停止容器无法删除
# 按名称删除 docker rm <容器名称> # 按ID删除 docker rm <容器ID> # 按ID删除所有容器 docker rm `docker ps -aq` # 查看所有容器ID docker ps -aq
-
查看容器信息
docker inspect <容器名称>
四、Docker容器的数据卷
概念及作用
概念
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,修改会立即同步(与共享文件夹/目录类似)
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以挂载多个数据卷
作用
- 容器数据持久化
- 外部机器和容器间接通信
- 同期之间数据交换
配置数据卷
-
创建启动容器时,使用-v参数设置数据卷,需要挂载多个就写多个 -v
注意:
- 目录必须绝对路径
- 如果目录不存在会自动创建
- 可以挂载多个数据卷,写多个 -v
- 宿主目录可不写,但会自动分配生成创建目录
docker run ... -v 宿主机目录(文件):容器内目录(文件)...
# 例子
docker run -it --name=c1 -v /root/data:/root/data_container center:7 /bin/bash
配置数据卷容器
概念
- 创建一个容器,挂载一个目录,让其他容器继承该容器(--volume-from)
- 通过简单的方式实现数据卷配置
- 其原理都是挂载到数据卷,即使数据卷容器挂了,也是可以使用
配置
-
创建启动c3数据卷容器
docker run --name=c3 -v /volume centos:7 /bin/bash
-
创建启动c1、c2容器,使用--volumes-from 参数 设置数据卷
# 创建启动c1容器,并挂载c3数据卷容器 docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash # 创建启动c2容器,并挂载c3数据卷容器 docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
-
查看容器细节,查看数据卷挂载情况
docker inspect c1
HostConfig:
- Binds :可看到挂载信息
Mounts:
- Source:挂载宿主机目录
- Destination:容器挂载目录
小结
- 数据卷概念
- 宿主机的一个文件或目录
- 数据卷作用
- 容器数据持久化
- 客户端和容器数据交换
- 容器间数据交换
- 数据卷容器
- 创建一个容器,挂载一个目录,让其他容器继承该容器(--volume-from)
- 通过简单的方式实现数据卷配置
- 其原理都是挂载到数据卷,即使数据卷容器挂了,也是可以使用
五、Docker应用部署
部署Mysql
因容器与外部机器不能通信,只能通过宿主机进行容器端口映射进行通信。
需要注意宿主机器的防火墙配置,需要开放相应端口外部机器才能访问。
步骤
-
搜索Mysql镜像
docker search mysql
-
拉取Mysql镜像
docker pull mysql:5.6
-
创建容器,设置端口映射,目录映射
# 在/root目录下创建muysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysql
# \:表示未输入完全,进入下一行接着输入 docker run -id \ # 端口映射,将容器的3306端口映射到宿主机的3307端口一般不需要修改直接使用原端口 -p 3307:3306 \ # 设置容器名称 --name=c_mysql \ # 挂载文件,$PWD的意思是获取当前所在路径 -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ # 设置mysql密码 -e MYSQL_ROOT_PASSWORD=123456 \ # 启动运行的镜像名称和版本号 mysql:5.6
-
操作容器中的Mysql
部署Tomcat
步骤
-
搜索镜像
docker search tomcat
-
拉取镜像
docker pull tomcat
-
创建容器,设置端口映射,目录映射
# 在/root目录下创建tomcat目录用于存储tomcat数据信息 mkdir ~/tomcat cd ~/tomcat
docker run -id --name=c_tomcat \ -p 8080:8080 -v $PWD:/usr/local/tomcat/webapps \ tomcat
-
外部机器访问Tomcat
部署Nginx
步骤
-
搜索镜像
docker search nginx
-
拉取镜像
docker pull nginx
-
创建容器,设置端口映射、目录映射,需要注意,Nginx需要在宿主机中创建nginx.conf配置文件
mkdir ~/nginx cd ~/nginx mkdir conf cd conf # 在nginx/conf/下创建nginx.conf配置文件 vim nginx.conf
# 一下内容未nginx.conf的配置文件信息 # 此处未贴出,可直接下载nginx后复制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
-
外部机器访问Nginx
部署Redis
步骤
-
搜索镜像
docker search redis
-
拉取镜像
docker pull redis:5.0
-
创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
-
外部机器访问Redis
# 外部机器客户端访问redis:redis-cli.exe -h <宿主机IP> -p <宿主映射端口> redis-cli.exe -h 192.168.149.135 -p 6379
六、Dockerfile
镜像原理
Linux系统组成
Tomcat镜像组成
Docker镜像的本质
就是一个分层文件系统。docker镜像是由特殊的文件系统叠加而成。
Docker中一个centos镜像为什么只有200MB而一个操作系统的ISO文件要几个G
Centos的ISO镜像文件包含了bootfs和rootfs,而docker的centos镜像复用了操作系统的bootfs,只有rootfs和其他镜像层,所以更小。
也就是说内核是共用的。
Docker中一个Tomcat镜像有500MB而一个Tomcat安装包只有70MB
由于docker中镜像是分层的,tomcat虽然只有70MB,但是他需要依赖父镜像和基础镜像,所以整个对外暴露的tomcat镜像大小是500MB
镜像制作
-
容器转换为镜像
# 容器转镜像 docker commit <容器ID> <新镜像名称:新版本号> # 镜像转压缩包 docker save -o <压缩文件名称> <新创建的镜像名称:版本号> # 压缩包转镜像 docker load -i <压缩文件名称>
概念
概念
- Dockerfile是一个文本文件
- 包含了而一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
dochub网址:https://hub.docker.com
关键字
都是大写
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于哪个iamge构建,如果该镜像没有会自动下载,如果已有会直接使用镜像 |
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 | 环境变量 | |
ARG | 构建参数 | |
VOLUME | 定义外部可以挂载的数据卷 | 指定guild的image那些目录可以启动的时候挂载到文件系统中,启动容器的时候使用-v绑定,格式VOLUME ["目录"] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口,启动容器的使用-p来绑定暴露端口,格式:EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录,如果没有创建则自动创建,如果指定/使用的时绝对地址,如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | |
。。。。。。 |
案例
案例一
需求
自定义centos7镜像。要求:
- 默认登录路径为:/usr
- 可以使用vim(默认安装的centos没有vim)
步骤
- 创建文件
- 定义父镜像:FROM centos:7
- 定义作者信息:MAINTAINER itherma itherma@itheima.cn
- 执行安装vim命令:RUN yum install -y vim
- 定义默认的工作目录:WORKDIR /usr
FROM centos:7
MAINIAINER itherma <itherma@itheima.cn>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
docker build -f ./<文件名称> -t <镜像名称>:<版本号> .
案例二:
需求
dockerfile,发布springboot项目
步骤
- 项目打包
- 把包发送到宿主机器
- 创建文件:springboot_dockerfile
- 定义父镜像:FROM java:8
- 定义作者信息:MAINTAINER itherma itherma@itheima.cn
- 将jar包添加到容器:ADD springboot.jar app.jar=>ADD <包名> <创建镜像名称>
- 定义容器启动执行的命令:CMD java -jar app.jar
- 通过dockerfile构建镜像:docker build -f <dockerfile文件路径> -t <镜像名称:版本号>
FROM java:8
MAINTAINER itherma <itherma@itheima.cn>
ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
- 运行镜像
- 端口映射
- 外部机器访问
七、Docker服务编排
服务编排概念
当部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。
服务编排:按照一定的业务规则批量管理容器
Docker Compose概述
一个编排多个容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
- 利用Dockerfile定义运行环境镜像
- 使用docker-compose.yml定义组成应用的各服务
- 运行docker-compose up 启动应用
安装Docker Compose
一、安装Docker Compose
# Compose 目前已经完全支持Linux、Mac OS、Windows,在我们安装Compose之前,需要先安装Docker,下面我们一边一号的二进制包方式安装在Linux系统中。
curl -Lhttps://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
二、卸载Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
三、使用docker compose编排nginx+springboot项目
-
创建docker-compose目录
mkdir ~/docker-compose cd ~/docker-compose
-
编写 docker-compose.yml文件
version: '3' services: # 自定义名称 nginx: # image镜像名称 image: nginx # 映射端口 ports: - 80:80 # 链接镜像 linkes: - app # 数据卷挂载配置 volumes: - ./nginx/conf.d:/etc/nginx/conf.d app: image: app # 暴露端口 expose: - "8080"
-
创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
-
在./nginx/conf.d目录下,编写itheima.conf文件,也就是nginx.conf配置文件内容
server{ listen 80; access-log off; location / { proxy_pase http://app:8080; } }
-
在~/docker-compose目录下,使用docker-compose启动容器
docker-compose up
-
测试访问
http://192.168.149.135/hello
八、Docker私有仓库
一、私有仓库搭建
# 1.拉取私有仓库镜像
# 2.启动私有仓库容器
# 3.打开浏览器输入地址:http://私有仓库服务器IP:5000/v2/_catalog,看到{”repositories“:[]}表示私有仓库搭建成功
# 4.修改daemon.json
# 在上述文件中添加一个key,保存退出,此步用于让docker信任私有仓库地址,注意将私有仓库服务器IP修改为自己私有仓库服务器真实IP
{"insecure-registries":["私有仓库服务器IP:5000"]}
# 5.重启docker服务
systemctl restart docker
docker start registry
二、将镜像上传至私有仓库
# 1.标记镜像为私有仓库的镜像
docker tag centos:7 <私有仓库服务器IP:5000>/centos:7
# 2.上传标记的镜像
docker push <私有仓库服务器IP:5000>/centos:7
三、从私有仓库拉取镜像
九、Doker相关概念
docker容器虚拟化和传统虚拟机对比
- 容器镜像时轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件在任何环境中都能够始终如一的运行
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
对比
- 相同
- 容器和虚拟机具有相似的资源隔离和分配优势
- 不同
- 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件
- 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统(因为核心复用的是宿主机核心)。