Docker基础
1 Docker概述
我们开发的代码会接触到不同环境:开发环境、测试环境以及生产环境:
1.1 Docker概述
- Docker 是一个开源的应用容器引擎
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上
- 容器是完全使用沙箱机制,相互隔离
- 容器性能开销极低
1.2 docker安装
本示例基于CentOS 7 安装演示Docker官网
1.2.1 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
1.3 docker架构
- 镜像(Image): Docker 镜像(Image),就相当于是 一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统.
- 容器(Container):镜像(Image)和容器(Contain er)的关系,就像是面向对象程序设计中的类和对象一 样,镜像是静态的定义,容器是镜像运行时的实体。容 器可以被创建、启动、停止、删除、暂停等.
- 仓库(Repository):仓库可看成一个代码控制中心, 用来保存镜像.
1.4 配置 Docker 镜像加速器
1 默认情况下,将来从docker hub(https://hub.docker.com/)上下载 docker镜像,速度太慢.
- USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
- 阿里云 : (https://www.aliyun.com/)
2 查看文件/etc/docker/daemon.json
# 执行如下命令:
cat /etc/docker/daemon.json
2 Docker命令
2.1 进程相关命令
# qido启动docker服务
systemctl start docker
# 停止docker服务
systemctl stop docker
# 重启docker服务
systemctl restart docker
# 查看docker服务状态
systemctl status docker
# 开机启动docker服务
systemctl enable docker
2.2 Docker 镜像相关命令
2.2.1 查看镜像
# 查看本地所有的镜像
docker images
docker images -q # 查看所用镜像的id
- REPOSITORY:镜像名称
- TAG:镜像标签
- IMAGE ID:镜像ID
- CREATED:镜像的创建日期
- SIZE:镜像大小
2.2.2 搜索镜像
docker search 镜像名称
- NAME:镜像名称
- DESCRIPTION:镜像描述
- STARS:用户评价,反应一个镜像的受欢迎程度
- OFFICIAL:是否官方
- AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
2.2.3 拉取镜像
# ()可选 如果不指定版本号,默认下载最新版本,可去docker hub查询镜像版本
docker pull 镜像名称(:版本号)
2.2.4 删除镜像
# 删除指定本地镜像
docker rmi 镜像id
# 删除所有本地镜像
docker rmi docker images -q
2.3 容器相关的命令
2.3.1 查看容器
docker ps # 查看正在运行的容器
docker ps –a # 查看所有容器,包括正在运行和停止的容器
2.3.2 创建并启动容器
docker run 参数
参数说明:
-
-i
:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭 -
-t
:为容器重新分配一个伪输入终端,通常与 -i 同时使用 -
-d
:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭 -
-it
创建的容器一般称为交互式容器,-id
创建的容器一般称为守护式容器 -
--name
:为创建的容器命名
1 交互式容器:
以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式 启动容器,如果退出容器,则容器会进入停止状态.
#创建并启动名称为 mycentos7 的交互式容器;
# 下面指令中的镜像名称 centos:7 也可以使用镜像id
# 使用的shell是/bin/bash
docker run -it --name=mycentos7 centos:7 /bin/bash
2 守护式容器:
创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器.
#创建并启动守护式容器 -id和di相等
docker run -di --name=mycentos2 centos:7
#登录进入容器命令为:docker exec -it container_name (或者 container_id) /bin/bash(exit退出 时,容器不会停止)
docker exec -it mycentos2 /bin/bash
2.3.3 进入容器
# docker exec -it container_name (或者 container_id) /bin/bash
#(exit退出 时,容器不会停止)
docker exec 参数
# eg:
docker exec -it mycentos2 /bin/bash
2.3.4 停止容器
docker stop 容器名称或者容器id
2.3.5 启动容器
docker start 容器名称或者容器id
2.3.6 删除容器
注意:如果容器是运行状态则删除失败,需要停止容器才能删除
#删除指定容器
docker rm 容器名称或者容器id
# 删除所有容器:
docker rm docker ps -a -q
2.3.7 查看容器信息
docker inspect 容器名称或者容器id
ps:
容器之间在一个局域网内,linux宿主机器可以与容器进行通信;但是外部的物理机笔记本是不能与容器直接通信的,如果需要则需要通过宿主机器端口的代理.
3 Docker容器的数据卷
3.1 数据卷概念
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
作用: - 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
3.2 配置数据卷
创建启动容器时,使用 –v 参数 设置数据卷
docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
注意事项:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 一个容器可以挂载多个数据卷
- 一个数据卷也可以被多个容器挂载
- 两个容器可以挂载同一个容器
# 如将容器的/root/data_container目录挂载到宿主机的/root/data目录
docker run -it --name=cl -v /root/data:/root/data_container centos /bin/bash
同时我们我们回到宿主机中,可以在data文件夹下创建一个文件cf.txt ,可以发现在容器中也会生成cf.txt文件.
总结:
- 数据卷的持久化:
- 当我们把c1容器删除后,宿主机中的数据卷依然存在。 所以当我们重新创建一个容器的同时依然可以挂载宿主机中的data文件夹,对应data里的数据依然同步到容器中.
- 一个容器可以挂载多个数据卷:
- 多个容器可以挂载同一个数据卷:
- 分别创建两个容器,两个容器都挂载宿主机中data目录,当 修改c3容器的data目录c4会实现同步,从而实现两个容器之间的交互.
3.3 配置数据卷容器
多容器进行数据交换
- 多个容器挂载同一个数据卷
- 数据卷容器
步骤: - 创建启动c3数据卷容器,使用 –v 参数 设置数据卷
docker run –it --name=c3 –v /volume centos:7 /bin/bash
- 创建启动 c1 c2 容器,使用 --volumes-from 参数 设置数据卷
docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash
总结:
- 数据卷: 宿主机的一个目录或文件
- 数据卷作用:
- 容器数据持久化
- 客户端和容器数据交换
- 容器间数据交换
- 数据卷容器
- 创建一个容器,挂载一个目录,让其他容器继承自该容器( --volume-from )
4. 应用部署
4.1 MySQL部署
步骤:
1 搜索mysql镜像
docker search mysql
2 拉取mysql镜像
docker pull mysql:5.6
3 创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/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.6
参数说明:
- -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=root:**初始化 root 用户的密码
4 进入容器,操作mysql
docker exec –it c_mysql /bin/bash
5 使用客户端连接数据库
4.2 Tomcat部署
步骤:
1 搜索tomcat镜像
docker search tomcat
2 拉取tomcat镜像
docker pull tomcat
3 创建容器,设置端口映射、目录映射
# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
参数说明:
-p 8080:8080:
将容器的8080端口映射到主机的8080端口-v $PWD:/usr/local/tomcat/webapps:
将主机中当前目录挂载到容器的webapps
4 在主机中/tomcat目录中上传一个html页面,使用外部机器访问tomcat
4.3 Redis部署
步骤:
1 搜索redis镜像
docker search redis
2 拉取redis镜像
docker pull redis:5.0
3 创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
4 连接redis数据库
- 使用client连接
./redis-cli.exe -h 192.168.149.135 -p 6379
- 使用redis桌面客户端连接
5. Docerfile
5.1 Docker 镜像原理
引入问题:
Q1: Docker 镜像本质是什么?
A1:是一个分层文件系统.
Q2:Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
A2:Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层.
Q3:Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
A3:由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB.
5.2 镜像制作
5.2.1 容器转为镜像
1 使用docker commit命令可以将容器保存为镜像
命令形式:docker commit 容器名称 镜像名称
docker commit 381827f60f70 my_tomcat:1.0
2 使用docker save命令可以将已有镜像保存为tar 文件
命令形式:docker save –o tar文件名 镜像名
docker save -o my_tomcat.tar my_tomcat:1.0
3 使用docker load命令可以根据tar文件恢复为docker镜像
命令形式:docker load -i tar文件名
# 加载恢复镜像
docker load -i my_tomcat.tar
# 在镜像恢复之后,基于该镜像再次创建启动容器
docker run -di --name=new_tomcat -p 8080:8080 my_tomcat:1.0
注意:新的镜像制作后,原本容器中挂载的目录将失效, 索引一般在恢复镜像创建容器容器的时候需要重新挂载。
5.3 Dockerfile 概念
Dockerfile 是一个文本文件,包含了一条条的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像.
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件
构建一个新的镜像开始工作了 - 对于运维人员:在部署时,可以实现应用的无缝移植
5.4 Dockerfile 入门案例
案例1
- 自定义centos7镜像
- 默认登录路径为 /usr
- 可以使用vim
实现步骤:
① 定义父镜像:FROM centos:7
② 定义作者信息:MAINTAINER itheima Michael@gmail.com ③ 执行安装vim命令: RUN yum install -y vim
④ 定义默认的工作目录:WORKDIR /usr
⑤ 定义容器启动执行的命令:CMD /bin/bash
⑥ 通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本
第1步 填写centos_dockerfile文件内容
vim ./centos_dockerfile
# 文件内容
FROM centos:7
MAINTAINER itheima <Michael@gmail.com>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
# 保存 退出
第2步 文件编写完成执行命令构建:
docker build -f ./centos_dockerfile -t my_centos:1 .
案例2
定义dockerfile,发布springboot项目
实现步骤:
实现步骤
① 定义父镜像:FROM java:8
② 定义作者信息:MAINTAINER itheima Michael@gmail.com ③ 将jar包添加到容器: ADD springboot.jar app.jar
④ 定义容器启动执行的命令:CMD java–jar app.jar
⑤ 通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本
第1步 填写java8_dockerfile文件内容
vim ./java8_dockerfile
# 文件内容
FROM java:8
MAINTAINER itheima <Michael@gmail.com>
ADD springboot.jar app.jar
CMD java–jar app.jar
# 保存 退出
第2步 文件编写完成执行命令构建:
docker build -f ./java8_dockerfile -t app .
6. 服务编排
6.1 服务编排概念
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大.
6.2 Docker Compose 概述
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建 ,启动和停止。使用步骤:
1 利用 Dockerfile 定义运行环境镜像
2 使用 docker-compose.yml 定义组成应用的各服务
3 运行 docker-compose up 启动应用
7. Docker 私有仓库
7.1 Docker 私有仓库
一、私有仓库搭建
# 拉取私有仓库镜像
docker pull registry
# 启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 修改daemon.json
vim /etc/docker/daemon.json
# 重启docker 服务
systemctl restart docker
docker start registry
** 二、将镜像上传至私有仓库**
# 1、标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器IP:5000/centos:7
# 2、上传标记的镜像
docker push 私有仓库服务器IP:5000/centos:7
三、 从私有仓库拉取镜像
#拉取镜像
docker pull 私有仓库服务器ip:5000/centos:7