Docker部署
MySQL部署
在Docker容器中部署MySQL,并通过外部MySQL客户端去操作MySQL。
docker容器软件部署步骤
1 搜索镜像;2 拉取镜像;3 创建容器;4 操作容器中的MySQL
注意
容器内的网络服务和外部机器(客户端)是不能直接进行通信的。
外部机器和宿主机器可以直接进行通信。
当容器中的网路服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上,外部机器访问宿主机的该端口,从而间接的访问容器的服务。(3306容器端口映射到宿主机的3307端口 访问3307即访问3306实体容器) ---这种方法解决容器和外部机器不能直接通信的问题,叫做端口映射
#搜索镜像
docker search mysql
#拉取镜像
docker pull mysql:5.6
#创建容器 设置端口映射 目录映射
#在root目录下创建MySQL目录用于存储MySQL数据信息
mkdir ~/mysql
cd ~/mysql
#创建容器脚本
docker run -id \ #守护示创建
-p 3307:3306 \ #容器和外部机器端口一般选择一致
--name=c_mysql \ #name
-v $PWD/conf:/etc/mysql/conf.d \ #容器卷配置文件
-v $PWD/logs:/logs \ #容器卷log文件
-v $PWD/data:/var/lib/mysql \ #容器卷data文件
-e MYSQL_ROOT_PASSWORD=123456 \ #env环境文件 定义环境变量
mysql:5.6
#进入容器
docker exec -it c_mysql /bin/bash
#通过外部机链接容器中的sql
#注意address是宿主机的ip 端口是宿主机被映射的端口3306端口
Tomcat部署
搜索和拉取的方式和mysql相似
mkdir tomcat
cd tomcat
#创建容器
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
在~/tomcat 路径下创建一个test文件夹,在test之下创建一个index.html文件然后ifconfig指令查看宿主机ip 可以在地址栏访问 ip:8080/test/index.html路径了
NGINX部署
拉取和搜索方式同上;但是NGINX服务器一般会有一个配置文件,因为会有反向代理的需求;
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
参数:-p80:80 容器的端口映射
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf 将主机当前目录下的/conf/nginx.conf挂载到容器相应的目录上
Redis部署
搜索和拉取和上述指令一致。
#创建容器
docker run -id --name=c_redis -p 6379:6379 redis:5.0
使用外部机器连接redis
./redis-cli.exe -h 192.168.1.4 -p 6379
Dockerfile
Docker镜像原理
问题:
- docker镜像本质是什么呢?
是一个分层文件系统;
- docker中的centos镜像为什么只有200m,但是centos操作系统需要几个g?
centos的iso镜像文件包含了bootfs和rootfs,而docker镜像复用操作系统的bootfs,只有rootfs和其他镜像层
- docker中tomcat镜像有500m,但是tomcat安装包只有70m?
由于docker中镜像是分层的,tomcat虽然只有70多m,但是它依赖的父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小是由500m
分析:
从操作系统首先入手,其组成部分:
1,进程调度子系统;2,进程通信子系统;3,内存管理子系统;4,设备管理子系统;5,文件管理子系统;6,网络通信子系统;7,作业控制子系统。
Linux文件系统由bootfs和rootfs两部分组成
- Bootfs:包含BootLoader(引导加载程序)和kernel(内核心)
- rootfs: root文件系统,包含的就是典型的Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件
- 不同的Linux发行版,bootfs基本一样,而rootfs不同。如Ubuntu,centos等。
原理解密:
Docker镜像是由特殊的文件系统叠加而成的。最低端是bootfs,并使用宿主机的bootfs。第二层是root文件系统,被称为base image;然后再往上可以叠加其他的镜像文件。统一文件系统技术能够将不同的层叠加成一个文件系统,为这些层提供一个统一的视角,这样就隐藏了多层的存在。在用户的角度看来,只存在一个文件系统。一个镜像可以放在另一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像称为基础镜像。
当从一个镜像启动容器时,docker会在最顶层加载一个读写文件系统作为容器;(即生成一个新的镜像实例,这样就可以进行修改相关文件 否则是不能修改只读文件的)
镜像制作
docker镜像如何制作?
1 容器转为镜像;(上述中生成的镜像 变成自己的镜像)
在新的镜像中只包换了不是通过目录加载的文件;)
#转化 注意通过挂载的方法不能使进行同步转化过去
docker commit 容器id 镜像名称:版本号
比如把项目放到nginx服务上,重新转化为镜像 进行压缩,给到测试人员进行测试
#压缩
docker save -o 压缩文件名称 镜像名称:版本号
给到测试人员,测试人员进行解压;
#解压
docker load -i 压缩文件名称
因为这样挂载文件会有问题,所有指令示的操作了解即可。主要通过dockerfile
Dockerfile概念及作用
本质就是一个文本文件,包含了很多条指令,每一条指令构建一层,基于基础镜像,最终构建一个新的镜像。
好处:对于开发人员,可以为开发团队提供一个完全一致的开发环境。对于测试人员,可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了。对于运维人员,在部署时,可以实现应用的无缝移植。
Dockerfile关键字
关键字 | 作用 | 备注 |
---|---|---|
FROM | 制定父镜像 | 指定Dockerfile基于那个image构建 |
RUN | 执行命令 | 执行一段命令,默认是/bin/sh格式:RUN command |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 配合CMD |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中,不仅仅局限于上下文,可以来源于远程服务 |
ENV | 环境变量 | 制定build时候的环境变量 可以在启动的容器的时候 通过-e 覆盖 格式:name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么env 相同的名字会覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 |
关键字 | 作用 | 备注 |
---|---|---|
EXPORSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口,格式 EXPORSE 8080或者 EXPORSE 8080/udp |
WORKDIR | 工作目录 | 制定容器内部的工作没目录 如果没有创建的话则自动创建 如果指定/使用的是绝对地址 |
USER | 指定执行用户 | 指定build或者启动的时候 用户在RUN CMD ENTRYPOINT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 |
OUTBUILD | 触发器 | 存在OUTBUILD关键字的镜像作为基础镜像的时候,当执行FROM完成后会执行OUTBUILD的命令,用处不大 |
STOPSIGNAL | 发送信号量到宿主机 | 该指令设置将发送到容器的系统调用信号以退出; |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT执行命令的时候,使用的shell |
案例
上述的指令 只需要掌握经常使用的关键字即可;
docker build -f(指定Dockerfile文件地址) ./centos_dockerfile -t(设置新的镜像的名称和版本) ht_centos:1 .(.代表一个路径)