1.初识Docker
我们写的代码会接触好几个环境:开发环境,测试环境,生产环境
异常情况
解决
2.Docker的概念
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
inux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
3.Docker的安装
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本课程基于CentOS7安装Docker。官网: Docker: Accelerated Container Application Development
yum包更新到最新版本
yum update
安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
设置yum源,指定Docker下载路径
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker,出现输入界面输入y ce为社区免费版 ee为企业收费版
yum install -y docker-ce
查看Docker版本,验证是否安装成功
docker -v
4.Docker的架构
Docker镜像(images)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
容器(container):Docker利用容器独立运行一个或一组应用,就像Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动,启动,开始,停止,删除。每个容器都是相互隔离的,保证安全的平台。
仓库(reoisitory):是集中存放镜像文件的场所。类似于Maven仓库存放Jar包,Github仓库存放Git项目。
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库和私有仓库两种形式。
最大的公开仓库是Docker Hub http://hub.docker.com/
存放了数量庞大的镜像供用户下载,国内公开仓库包括阿里云,网易云等。
5.配置Docker镜像加速器
默认情况下,将来从Docker Hub上下载Docker镜像,速度过慢,所以都会配置镜像加速器。
这里使用阿里云的镜像加速器。
登陆阿里云官网,搜索 镜像 点击开通
选择对应的操作系统,这里使用Centos然后将下方蓝色区域的代码复制粘贴到Centos系统中即可完成配置。
6.Docker常用命令
完成Docker镜像加速器配置会自动重启Docker服务。
6.1Docker服务相关命令
启动Docker服务
systemctl start docker
关闭Docker服务
systemctl stop docker
重启Docker服务
systemctl restart docker
开启开机自启动Docker服务
systemctl enable docker
查看Docker服务状态
systemctl status docker
Docker服务的帮助命令
Docker 命令 --help
6.2Docker镜像相关命令
查看本地所有镜像
docker images
REPOSITORY :镜像名称
TAG:镜像版本
IMAGE ID:镜像ID
CREATED:镜像创建时间,而不是镜像下载时间
SIZE:镜像大小
查看远程仓库Docker Hub的镜像
docker serach 镜像名,如redis
NAME:镜像名称
DESCRIPTION:镜像描述
STARS:关注的人
OFFICIAL:是否官方
AUTOMATED:是否自动化
拉取镜像到本地,若未写版本号,默认拉取最新版--latest
docker pull 镜像名,如redis:版本号
删除本地镜像
docker rmi 镜像名:版本号 | 镜像ID
6.3Docker容器相关命令
运行容器
docker run -it --name=c7 centos:7 /bin/bash
-i:保持容器一直运行,因为容器没有客户端连接会自动关闭
-t:给容器分配伪终端接收命令
--name:给容器取名字
centos:7:容器运行的镜像名和版本号
/bin/bash:进入容器的初始化命令,这里相当于打开一个shell窗口
退出容器,该操作会关闭停止容器运行
exit
退出容器,该操作不会停止容器运行
ctrl+q+p
查看运行的容器
docker ps
查看所有容器
docker ps -a
CONTAINER ID:容器ID
IMAG:镜像名及版本号
COMMAND:命令
CREATED:容器创建时间
STATUS:容器状态,Up运行,Exited退出
PORTS:端口号
NAMES:容器名称
进入运行的容器
docker exec -it 容器id | 容器名 /bin/bash
再次进入容器时,使用exit指令不会将容器关闭
启动容器
docker start 容器名 | 容器id
关闭容器
docker stop 容器名 | 容器id
删除停止的容器
docker rm 容器名 | 容器id
强制删除容器
docker rm -f 容器名 | 容器id
查看容器日志
docker logs 容器名 | 容器id
7.容器的数据卷
Docker容器删除后,容器产生的数据还存在吗?
Docker容器和外部机器可以直接交换文件吗?
容器之间想要进行数据交互怎么办?
数据卷的概念
数据卷是宿主机中的一个目录或文件
当容器目录和数据目录绑定后,对方的修改会立即同步
一个数据卷可以被多个容器同时挂载
一个容器也可以被过载多个数据卷
作用
解决数据持久化问题
解决外部机器和容器的间接通讯问题
解决容器之间的数据交换
配置数据卷
在创建容器时,使用-v参数设置数据卷,目录路径必须为绝对路径,没有目录会自动创建目录,并且可以挂载多个数据卷。
docker run -i --name=c1 -v /宿主机目录:容器内目录 centos:7 /bin/bash
这样就将容器与数据卷绑定好了,并帮我们创建了目录。
此时目录中还没有数据,我们手动创建一个文件,查看容器内对应的文件夹内是否有该文件。
此时创建好了文件之后,我们前往容器中,使用命令进入。
docker exec -it c1 /bin/bash
可以看到此时该容器中也有了相同的文件,那我们尝试在容器中修改文件,然后前往宿主机查看是否有修改。
可以看到,在容器中编辑了内容在宿主机上也同步了,这样就配置好了数据卷。
8.Docker应用部署
8.1安装Mysql
从远程仓库拉取mysql镜像
docker pull mysql:5.7
运行Mysql容器
docker run -id --name=m1 -p 宿主机端口:容器端口 -e MYSQL_ROOT_PASSWORD=密码 镜像名:版本号
-p:表示宿主机的端口和容器内部端口映射
-e:表示环境设置
这里就启动了mysql,需要注意的是,如果在宿主机上开启了mysql服务,将会导致navicat工具连接不上mysql,会提示端口被占用。
解决方法:在宿主机上关闭mysql服务
systemctl stop mysqld
然后在window打开navicat工具连接容器的mysql服务
提示连接成功即可。
8.2安装Tomcat
从远程仓库拉取镜像
docker pull tomat:9.0
使用Docker运行容器
docker run -id --name=t1 -p 8081:8080 tomcat:9.0
如果安装9.0及以上版本,使用此命令运行容器
docker run -it --name=t1 -p 8081:8080 tomcat:9.0 /bin/bash
进入容器内部,将webapps目录删除
rm -rf webapps
然后将webapps.dist目录重命名为webapps
mv webapps.dist/ webapps
修改完成后,重启容器
docker restart t1
使用window访问8081端口
8.3安装Redis
从远程仓库拉取镜像
docker pull redis
运行容器,需要指定的目录有一份redis.conf配置文件
docker run -id --name=r1 -v /usr/local/soft/data/redis/redis.conf:/usr/local/soft/data/redis/redis.conf -v /usr/local/soft/data/redis/data/:/data -p 6378:6379 redis
第一个-v是使用数据卷绑定redis的配置文件,第二个-v是使用数据卷绑定redis的快照文件,可以使数据持久化,不丢失。
然后进入redis容器
docker exec -it r1 /bin/bash
连接redis客户端
redis-cli
随意设置几个值
set k1 v1
set k2 v2
save
save是用来保存快照文件,将这些操作保存到快照文件中。然后可以删除此容器
docker rm -f r1
然后再次运行容器,可以发现在redis客户端使用以下指令,数据还是存在
keys*
8.4安装RabbitMQ
从远程仓库拉取代码
docker pull rabbitmq:management
management表示图形化管理
运行容器
docker run -id --name=mq1 -p 5671:5672 -p 15671:15672 rabbit:management
第一个-p表示的是使用idea连接mq的端口,第二个-p是图形化端口
使用图形化端口访问rabbitmq。
8.5安装Nginx
从远程仓库拉取镜像
docker pull nginx
运行容器,需要指定的目录有一份nginx.conf配置文件
docker run -id --name=n1 -v /usr/local/soft/data/nginx/nginx.conf:/usr/local/soft/data/nginx/nginx.conf -p 8425:80 nginx
通过映射的端口访问nginx
出现该页面表示运行成功。
9.自定义镜像
9.1Dockerfile的概念
Dockerfile是一个文本,任意一个镜像都是通过dockerfile来制作的
文件包含了一条条的指令
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockefile文件构建一个新的镜像开始工作
对于运维人员:在部署时,可以实现应用的无缝跨平台移植
9.2Dockerfile的关键字
9.3创建Docker镜像
切换当前目录
cd /usr/local/soft
创建一个目录用于存放dookerfile
mkdir dockerfile && cd dockerfile
编辑镜像文件
vi centos_dockerfile
运行此镜像
docker build -f /usr/local/soft/dockerfile/centos_dockerfile -t mycentos:7 .
-f:表示的是dockerfile镜像文件的路径
-t:表示的是镜像的名称,之后一定一定要跟一个空格和一个点
修改一下镜像文件的内容,因为该配置会导致vim下载不下来。
FROM centos:7
MAINTAINER yzx
WORKDIR /usr
RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-Base.repo && \
sed -i 's|^#baseurl=http://mirror.centos.org/centos|baseurl=http://mirrors.aliyun.com/centos|g' /etc/yum.repos.d/CentOS-Base.repo && \ yum makecache
RUN yum install -y vim
CMD /bin/bash