1.为什么引入的Docker
1.某IT部门要上线一个项目,一般:上服务器,拷贝一个tomcat,改端口号,部署到webapps文件夹。
在服务器上,某个应用出现问题,可能服务器不能用
现在采用微服务,分别由不同团队开发,各团队水平不同,可能一个团队出现问题,导致服务器出现问题。
2.开发和线上问题,开发阶段一套软件环境,测试没有问题,运维进行部署。正式部署服务器发生问题(启动参数、环境问题、漏配了参数)
3.微服务问题
4.持续的软件版本发布/测试项目,到线上环境 的集成
2.Docker是什么
Docker是一个开源的应用容器引擎
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移值的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全 使用沙箱机制,相互之间不会有任何接口,容器性能开销极低。
3.Docker优点
1.简化程序
2.减少选择软件
3.节省开支
4.持续交付和部署
5.迁移方便
4.Docker的应用场景
Web应用的自动 化打包和发布
自动化测试和持续 集成、发布
在服务型环境中部署和调整数据 库或其他的后台 应用
从头编译或者扩展现有的OpenShift或CloudFoundry平到来搭建自己的Paas环境
IaaS:(Infrastructure-as-a-Service)(基础设施即服务)
PaaS:(Platform as a Service)(平台即服务)
SaaS:(Software-as-a-Service)(软件即服务)
5.Docker架构
Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器
Docker容器通过Docker镜像来创建
容器与镜像的关系类似 于面向对象编程中的对象 与类
Docker基本概念
镜像(Image)
容器(Container)
仓库(Repository)
理解了Docker的整个生命周期
Docker容器与镜像的关系
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
Docker镜像(Images) | Docker镜像是用于创建Docker容器的模板 |
---|---|
Docker容器(Container) | 容器是独立运行的一个或一组应用 |
Docker客户端(Client) | Docker客户端通过命令行或者其他工具使用Docker API与Docker的守护进程通信 |
Docker主机(Host) | 一个物理或者虚拟的机器用于执行Docker守护进程 和容器 |
Docker仓库(Registry) | Docker仓库用来保存镜像,可以理解为代码控制 中的代码 仓库。Docker Hub提供 了庞大的镜像集合供使用 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox , Digital Ocean , Microsoft Azure |
6.Docker仓库
Docker仓库用来保存镜像,代码控制 中 的代码仓库
Docker Hub(https://hub.docker.com)提供 了庞大的镜像集合供使用
公有Dcoker Registry
私有Dockers Registry
7.Docker安装
官方提供 的安装教程:
https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-repository
CentOS安装要求:
Docker支持以下的CentOS版本:
CentOS 7(64-bit)
CentOS 6.5(64-bit)或更高的版本
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为3.10 以上。Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431或者更高版本。
1.校验版本
[root@node1 ~]# uname -r
2.6.32-642.6.2.el6.x86_64
从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。本文介绍 Docker CE 的安装使用。
2.移除旧的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
3.安装一些必要的系统工具
安装所需的软件包。 yum-utils 提供了 yum-config-manager 应用,并 device-mapper-persistent-data 和lvm2 由需要 devicemapper 存储驱动程序。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4.添加软件源信息
源1:(官方推荐)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
源2:(阿里云源)
sudo yum-config-manager --add-repohttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.更新yum缓存
sudo yum makecache fast
6.安装Docker-CE
sudo yum -y install docker-ce
7.启动Docker后台服务
sudo systemctl start docker
8.重启Docker服务
sudo systemctl restart docker
9.安装成功后可通过查看
docker version
10.测试
通过运行hello-world 映像来验证是否正确安装了Docker Engine-Community
sudo docker run hello-world
卸载
执行以下命令来删除Docker CE:
$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker
7.Docker镜像加速器
Docker官方加速器
我们以 Docker 官方加速器进行介绍
https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror
通过命令查看:在
/etc/docker/daemon.json
中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启
重启Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
阿里云加速器
登录阿里云个人帐号。
管理中心–容器镜像服务–镜像加速器(直接搜索即可)
检查加速器是否生效
配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,
在命令行执行 docker info ,查看镜像地址是否匹配,如匹配,说明配置成功
docker info
8.Docker获取镜像
Docker命令使用
获取命令行帮助信息直接在命令行内输入docker 命令后敲回车
8.1Docker查找镜像
查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为:https://hub.docker.com/
也可以docker search 命令来搜索镜像
8.2Docker获取镜像
docker pull [选项] [Docker Registey 地址[:端口号]/] 仓库名[:标签]
[root@node1 ~]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
146bd6a88618: Pull complete
9935d0c62ace: Pull complete
db0efb86e806: Pull complete
e705a4c4fd31: Pull complete
3d3bf7f7e874: Pull complete
49371c5b9ff6: Pull complete
e7873a7ca0fd: Pull complete
925a95344b57: Pull complete
0448a86618da: Pull complete
71917b8caada: Pull complete
Digest: sha256:f8edbcba564eca1d3d6d5d73d993a661801b5a7c6542dff44bdab57d0bccc567
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest ed94f55483b8 13 days ago 507MB
docker启动tomcat镜像
docker run --rm -d -p 8080:8080 tomcat
查看有哪些容器在运行
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c8b86529fb7 tomcat "catalina.sh run" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp fervent_wescoff
9.CentOS7防火墙端口
开放8080端口(如下命令只针对CentOS7以上)
查看已经开放的端口
firewall-cmd --list-ports
开启端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
重启防火墙
firewall-cmd --reload 重启
systemctl stop firewalld.service 停止
systemctl disable firewalld.service 禁止firewall开机启动
10.虚悬镜像
镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为虚悬镜像
这个镜像原本是有镜像名和标签的,原来为 tomcat:8.0,随着官方镜像维护,发布了新版本后,重新 docker
pull tomcat:8.0 时,tomcat:8.0 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取
消,从而成为了 。除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜
像同名,旧镜像名称被取消,从而出现仓库名、标签均为 的镜像。这类无标签镜像也被称为 虚悬镜像
(dangling image) 。 一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删
除:
docker image prune
11.Docker 删除本地镜像
语法:
docker image rm [选项] <镜像1> [<镜像2>.....]
用 ID、镜像名、摘要删除镜像 其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。
如果要删除本地的镜像,可以使用 docker image rmi / rm 命令
docker image rmi 镜像ID //常用
要删除镜像必须确认此镜像⽬前没有被任何容器使⽤
Docker其它辅助命令
查看本地镜像的 IMAGE ID
docker images -q
查看⼀个镜像的制作历程
docker history 镜像名称
12.Docker 容器
容器是独立运行的一个或一组应用,以及它们的运行环境。
12.1查看容器状态
docker ps //查看运行的容器
docker ps –a //查看所有的容器(包含运行和退出)
docker container ls
docker container ls–a
docker history tomcat
12.2Docker 启动容器
启动容器有二种方式,一种是基于镜像新建一个容器并启动,一种是将在终止状态( stopped )的容器重新启动
docker run 参数 镜像名称:tag 执⾏的命令 常⽤参数:
-i 保持和 docker 容器内的交互,启动容器时,运⾏的命令结束后,容器依然存活,没有退出(默认是会退出,即停⽌的)
-t 为容器的标准输⼊虚拟⼀个tty-d 后台运⾏容器
--rm 容器在启动后,执⾏完成命令或程序后就销毁
--name 给容器起⼀个⾃定义名称
-p 宿主机:内部端口
docker run --rm -d --name tomcat1 -p 8080:8080 tomcat
12.33 查看正在运行的容器
docker ps
12.4 查看所有容器
docker ps -a
12.5停止容器
docker ps -a查找docker container id
docker stop 9be696a0c283 //停止正在运行容器(或Ctrl+c)
docker container stop tomcat1//停止正运行容器(ID或Names)
12.6 启动已终止容器
docker start 容器名/容器 ID
12.7 重启已关闭容器
docker restart 9be696a0c283//启动容器(根据ID或NAMES)
12.8 关闭和删除容器
docker rm 容器ID
12.9 Docker 守护态运行
如果使用了 -d 参数运行容器。此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs查看)。
查看控制台结果:
docker logs tomcat1//(ID或Names)
13 Docker 进入容器
某些时候需要进入容器进行操作,使用 docker exec 命令
-i -t 参数 docker exec 后边可以跟多个参数,这里主要说明 -i -t 参数。 只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。 当 -i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。
docker exec -it 容器ID(Names)bash
进入容器,对默认的tomcat进行页面修改,然后再访问查看效果。
注意默认容器内linux包是最小安装。只拥有最基本的命令
exit,不会导致容器的停止
docker exec -it tomcat1 bash //进入容器名称叫tomcat1
echo 'qfnj-weixin'>>index.jsp //对容器内的index.jsp进行字符串追加
14.在linux宿主机和Docker容器之间交互
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH //容器中 复制到 宿主机
docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH //宿主机 复制到 容器中
宿主机复制一个图片到容器中:将png图片复制到了容器指定目录下
docker cp test.png tomcat:/usr/local/tomcat/webapps/ROOT
将容器内的index.jsp 复制出来,修改再复制回去
docker cp tomcat1:/usr/local/tomcat/webapps/ROOT/index.jsp /root
15.Docker查看日志
docker logs 容器名称/ID
–since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
-f : 查看实时日志
-t : 查看日志产生的日期
-tail=10 : 查看最后的10条日志
tomcat8080 : 容器名称
16.Docker数据卷
问题:通过镜像创建一个容器。容器一旦被销毁,则容器内的数据将一并被删除。但有些情况下,通过服务器上传的图片出会丢失。容器中的数据不是持久化状态的。
什么是数据卷数据卷 :
是一个可供一个或多个容器使用的特殊目录
特性:
· 数据卷可以在容器之间共享和重用
· 对数据卷的修改会立马生效
· 对数据卷的更新,不会影响镜像
· 数据卷默认会一直存在,即使容器被删除
docker 引入了数据卷(volume) 机制。数据卷是存在于一个或多个容器中的特定文件或文件夹,这个文件或文件夹以独立于 docker 文件系统的形式存在于宿主机中
创建一个数据卷
docker volume create vol-test //test公共的文件夹资源静态资源
查看所有的 数据卷
docker volume ls
17.Docker配置Nginx
1.取最新版的 Nginx 镜像
docker pull nginx:latest
2.查看本地镜像
docker images
3.运行容器
docker run --name nginx-test -d -p 8080 nginx
4.检验安装是否成功
http://127.0.0.1/
17.1Nginx默认目录
输入 命令:
whereis nginx
即可看到类似如下的内容:
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx
以下是Nginx的默认路径:
(1) Nginx配置路径:/etc/nginx/
(2) PID目录: /var/run/nginx.pid
(3) 错误日志: /var/log/nginx/error.log
(4) 访问日志: /var/log/nginx/access.log
(5) 默认站点目录: /usr/share/nginx/html
事实上,中需知道Nginx配置路径,其他路径可在/etc/nginx/nginx.conf以及/etc/nginx/conf.d/default.conf中查询到。
17.2Nginx反向代理到tomcat
17.2.1docker 中安装vim
进入docker
docker exec -it nginx bash
接着执行:
apt-get update
apt-get install vim
如果不进行更新就会报错:
此时会报出bash: vi: command not found
出现问题:
Reading package lists… Done
Building dependency tree
Reading state information… Done
E: Unable to locate package vim
17.2.2测试Nginx
17.2.3配置反向代理
vim /etc/nginx/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;
upstream tomcat {
server 172.17.0.4(修改):8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat;
index index.html index.htm;
}
}
include /etc/nginx/conf.d/*.conf;
}
重新启动容器即可。
18.Docker配置MySQL
1.搜索镜像
docker search mysql
2.安装镜像
docker pull mysql:5.6
3.创建并启动MySQL容器
docker run -d --name mysql5.6-3306 -p 3306:3306 -e MYSQL_ROOT_PASSWORD='(密码)' mysql:5.6
4.访问测试
进入到容器内部
docker exec -it mysql5.6-3306 bash
连接MySQL数据库:
mysql -u root -p
输入数据 库密码即可完成
5.授权其他机器登陆
1、授权主机访问:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '(密码)' WITH GRANT OPTION;
2、刷新权限
FLUSH PRIVILEGES;
3、退出:
EXIT
18.Docker定制镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。• 1.从已经创建的容器中更新镜像,并且提交这个镜像
• 2.使用 Dockerfile 指令来创建一个新的镜像
1、对于开发人员,可以为开发团队提供一个完全一致的开发环境
2、对于测试人员,可以直接拿开发时所构建的镜像测试。
3、对于运维人员,在部署时,可以实现快速部署、移值。
Dockerfile 定制镜像