Docker的应用部署
MySQL部署
在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server。
1.容器内部的网络服务和外部机器不能直接通信
2.外部机器和宿主机可以直接通信
3.宿主机和容器可以直接通信
将容器中的3306端口与宿主机的3307端口 进行映射 然后让外部机器访问 宿主机的端口
实现步骤
#1.搜索mysql镜像
docker search mysql
#2.拉取mysql镜像
docker pull mysql:5.7
创建容器,设置端口映射,目录映射
# 在/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.7
- 参数说明
-
- -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 mysql初始化root用户的密码
4.操作容器中的mysql
Tomcat部署
需求:在Docker容器中部署Tomcat,并通过外部机器访问Tomcat部署的项目。
实现步骤
#搜索tomcat镜像
docker search tomcat
#拉去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
- 参数说明
-
- -p 8080:8080 将容器的8080端口映射到主机的8080端口
- -v $PWD:/usr/local/tomcat/webapps 将主机中当前目录挂载到容器的webapps
测试访问
此时的tomcat目录下没有任何文件
我们创建一个/test/index.html
使用外部机器访问tomcat
Nginx部署
在Docker容器中部署Nginx,并通过外部机器访问Nginx
实现步骤
#1.搜索nginx镜像
docker search nginx
#2.拉取nginx镜像
docker pull nginx
创建容器,设置端口映射,目录映射
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
#在~/nginx/conf下创建nginx.conf文件,粘贴下面的内容
vim nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
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;
1,0-1 顶端
Redis部署
#搜索redis镜像
docker search redis
#拉取redis镜像
docker pull redis:5.0
#创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
#使用外部机器连接redis
./redis-cli.exe -h 192.168.21.184 -p 6379
Docker镜像层都是只读的,容器层是可写的
当容器启动是,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”
,”容器层“之下的都叫镜像层
思考:
- Docker镜像本质是什么?
-
- 是一个分层文件系统
采用分层结构就是为了共享资源,方便复制迁移,就是为了复用,比如说有多个镜像都从base镜像构建而来,那么Docker Host只需要在磁盘上保存一份base镜像,同时也只需要加载一份base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享
- Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?
-
- Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
- Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
-
- 由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有钟哥对外暴露的tomcat镜像大小为500MB
操作系统组成部分:
- 进程调度子系统
- 进程通信子系统
- 内存管理子系统
- 设备管理子系统
- 文件管理子系统
- 网络通信子系统
- 作业控制子系统
linux文件系统由bootfs和rootfs两部分组成
- bootfs:包含bootloader(引导加载程序)kennel(内核)
- rootfs:root文件系统,包含的典型就是linux系统中的、dev,/proc,/bin,/etc等标准目录和文件
- 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
Docker镜像原理
- Docker镜像是由特殊的文件系统叠加而成
- 最低端的是bootfs,并使用宿主机的bootfs
- 第二层是root文件系统rootfs,称为base image
- 然后在往上可以叠加其他的镜像文件
镜像
是一种轻量级,可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码,运行时需要的库,环境变量和配置文件等),这个打包好的环境就是images镜像文件。
只有通过这个镜像文件才能生成Docker容器实例(类似java中的new出来一个对象)。
UnionFS(联合文件系统):Union
Docker镜像是如何制作的
1.容器转为镜像
docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称
2.dockerfile
Dockerfile概念
- Dockerfile是一个文本文件
- 包含一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作
- 对于运维人员:再部署时,可以实现应用的无缝移植
案例
自定义centos7镜像。要求:
1.默认登录路径为/usr
2.可以使用vim
实现步骤
- 定义父镜像:FROM centos:7
- 定义作者信息:MAINTAINER xcl<itcxuchuanlong@itcast.cn>
- 执行安装vim命令:RUN yum install -y vim
- 定义容器启动执行命令:CMD/bin/bash