1.Docker容器化技术简介
1.1什么是Docker?
一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口;
使用go语言编写,在LCX(linux容器)基础上进行封装
三点
快速部署应用启动
实现虚拟化,完整资源隔离
一次编写,四处运行
1.2.为什么要用docker?
提供一次性的环境,加入需要安装mysql,则需要安装很多依赖库、版本等,如果使用Docker则通过镜像就可以直接启动运行
快速动态扩容,使用docker部署了一个应用,可以制成镜像,通过docker快速启动
组件微服务架构,可以在一个机器上模拟出多个微服务,启动多个应用
更好的资源隔离和共享
2.Linux Centos7安装Docker
2.1.安装Docker
安装环境:Centos7
安装条件:docker官方至少要求3.8,建议3.10以上
查看centos内核版本
uname -a
Docker版本
docker EE 企业版本
docker CE 社区版本
安装前准备
关闭防火墙
systemctl stop firewalld
关闭selinux
vi /etc/selinux/config —>将SELINUX=disabled
安装wget命令
挂载磁盘,yum -y install wget
下载阿里云docker社区版yum源
cd /etc/yum.repos.d/ 进入到yum源的路径
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
重新构件yum源
yum clean all
yum makecache
查看docker安装包
yum list | grep docker
如果出现如下错误,则需安装contain-SElinux包
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum update
安装docker ce社区版
yum -y install docker-ce.x86_64
设置开机自启
systemctl enable docker
更新xfsprogs
yum -y update xfsprogs
启动docker容器
systemctl start docker
查看docker版本
docker version
查看docker详细信息
docker info
2.2.配置阿里云镜像加速
新建文件:vi /etc/docker/daemon.json
编辑文件
{ "registry-mirrors": ["https://6j96rs65.mirror.aliyuncs.com"] }
重启docker
systemctl daemon-reload
systemctl restart docker
3.Docker镜像的搜索下载以及查看删除
3.1.什么是镜像?
镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘里用GHOST等软件打开后,又恢复成许多文件,RAID 1和RAID 10使用的就是镜像。常见的镜像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。
3.2.查看本地镜像
docker images
3.3.搜索镜像
docker search centos
3.4.搜索镜像并过滤是官方的
docker search --filter "is-official=true" centos
3.5.搜索镜像并过滤大于10颗星的
docker search --filter stars=10 centos
3.6.下载centos7镜像
docker pull centos:7
3.7.修改本地镜像名字
docker tag mycentos:1 centos:7
3.8.本地镜像的删除
docker rmi centos:7
3.9.Docker的体系结构之镜像与容器
- 一个镜像可以启动无数台容器
- 容器与容器之间的操作互不影响,处于隔离的环境
4.Docker核心基础之容器的构建
- 构建容器:docker run -itd --name=mycentos centos:7
- -i:表示以交互模式运行容器(让容器的标准输入保持打开)
- -d:表示后台运行容器,并返回容器ID-t:为容器重新分配一个伪输入终端
- –name:为容器指定名称
- 查看本地所有容器:docker ps -a
- 查看本地正在运行的容器:docker ps
- 停止容器:docker stop CONTAINER_ID/CONTAINER_NAME
- 一次性停止所有容器:docker stop $(docker ps -a -q)
- 启动容器:docker start CONTAINER_ID/CONTAINER_NAME
- 重启容器:docker restart CONTAINER_ID/CONTAINER_NAME
- 删除容器:docker rm CONTAINER_ID/CONTAINER_NAME
- 强制删除容器:docker rm -f CONTINAER_ID/CONTINAER_NAME
- 查看容器详细信息:docker inspect CONTIANER_ID/CONTINAER_NAME
- 进入容器:docker exec -it CONTINAER_ID/CONTINAER_NAME /bin/bash
5.Docker容器的文件复制与挂载
- 从宿主机复制到容器:docker cp 宿主机本地绝对路径 容器名字/ID:容器绝对路径
- docker cp /root/1.txt mycentos:/root/
- 从容器复制到宿主机:docker cp 容器ID/NAME:容器绝对路径 宿主机绝对路径
- docker cp mycentos:/root/2.txt /root/
- 宿主机文件夹挂载到容器里:docker run -itd -v 宿主机路径:容器路径 --name 容器名称 镜像ID
- docker run -itd -v /root/test/:root/ --name=centos7 centos:7
6.Docker核心自定义镜像
6.1.构建镜像的两种方法
基于Docker Commit制作镜像
基于DockerFile制作镜像,DockerFile方式为主流的制作镜像方式
6.2.Commit构件自定义镜像
启动容器:docker run -itd mycentos
进入容器:docker exec -it mycentos /bin/bash
安装ifconfig命令:yum -y install net-tools
重启容器:docker restart mycentos
删除容器:docker rm mycentos
构件镜像:docker commit -a “作者” -m “描述” 原CONTAINER_ID 新容器image
docker commit -a “lixiang” -m “ifconfig命令” 180176be1b4c centos7:v1
-a:指定作者
-m:描述
产看容器详情:docker insecpt 180176be1b4c
启动容器:docker run -itd 180176be1b4c
6.3.DockerFile构建镜像
dockerfile
#注释:这个脚本是干啥的,this is dockerfile FROM centos:7 #从哪来的,基于centos:7这个镜像 MAINTAINER lixiang #作者 RUN echo "正在构建镜像!!!" WORKDIR /root/lixiang #指定工作目录,如无则自动给出创建 COPY 123.txt /root/lixiang #赋值123.txt到/root/lixiang,注意一定要用相对路径,123.txt要和dockerfile载一个目录下 RUN yum -y install net-tools
构件镜像:docker bulid -t mycentos:v2 .
6.4.Docker镜像分层结构剖析
dockerfile执行过程
总结:
共享资源
对容器的任何改动都不会影响镜像层
容器层可读可写,镜像层只读
6.5.Dockerfile基础命令
FROM
基于那个镜像构建
MAINTAINER
标明作者
COPY
复制宿主机文件到镜像中(只能用相对路径,绝对路径会报错)
ADD
复制宿主机文件到镜像中(加入文件是.tar.gz,他会帮解压到指定目录)
WORKDIR
指定工作目录,假如路径不存在会创建目录
ENV
指定环境变量
EXPOSE
暴漏容器端口
RUN
执行动作,用于构建镜像层,作用于镜像层面
ENTRYPOINT
容器启动的时候执行,作用于容器层,dockerfile里面有多条时只执行最后一条
CMD
在容器启动的时候执行,作用于容器层,dockerfile里面有多条时只执行最后一条
容器启动后执行默认的命令或参数,允许被修改
命令格式
shell命令格式:RUN yum -y install net-tools
exec命令格式:RUN [ “yum”,“-y”,“install”,“net-tools” ]
测试
第一个dockerfile
#第一个 FROM centos:7 RUN echo "images building!" CMD ["echo","container","starting..."] ENTRYPOINT ["echo","container","starting !!!"]
第二个dockerfile
#第二个 FROM centos:7 RUN echo "images building!" CMD ["echo","containe1r","starting..."] CMD ["echo","container2","starting..."] ENTRYPOINT ["echo","container2","starting !!!"] ENTRYPOINT ["echo","container2","starting !!!"]
第三个dockerfile
#第三个 FROM centos:7 CMD ["-ef"] ENTRYPOINT ["ps"]
6.6.Dockerfile构建Tomcat镜像
本机构建环境
解压 jdk :tar -xvf jdk-8u211-linux-x64.tar.gz;mv jdk1.8.0_211 /usr/local/jdk8
解压tomcat : tar -xvf apache-tomcat-8.5.35.tar.gz;mv apache-tomcat-8.5.35 /usr/local/tomcat
配置java的环境变量
vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.8
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
本机测试启动tomcat(本机测试注意关闭防火墙)/usr/local/tomcat/bin/startup.sh
本机测试通过开启防火墙:systemctl start firewalld
编写dockerfile文件
#dockerfile构建tomcat,安装jdk
FROM centos:7
MAINTAINER lixiang
ADD jdk-8u211-linux-x64.tar.gz /usr/local/
RUN mv jdk1.8.0_211 jdk1.8
ENV JAVA_HOME=/usr/local/jdk1.8
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local/
RUN mv apache-tomcat-8.5.35 tomcat
EXPOST 8080
ENTRYPOINT [“/usr/local/tomcat/bin/catalina.sh”,“run”]
执行dockerfile文件
docker build -t centos:tomcat .
启动docker镜像
docker run -itd -p 80:8080 -v /root/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT centos:tomcat /bin/bash
6.7.Dockerfile构建Nginx镜像
nginx_install.sh脚本编写
touch nginx_install.sh ; chmod u+x nginx_install.sh ; vi nginx_install.sh
#!/bin/bash
yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/lcoal/nginx
./configure --prefix=/user/local/nginx && make && make install
dockerfile文件编写
vi dockerfile
#dockerfile安装nginx镜像
FROM centos:7
ADD nginx-1.16.0.tar.gz /usr/lcoal
COPY nginx_install.sh /usr/local
RUN /usr/local/nginx_install.sh
EXPOSE 80
启动容器
docker run -itd 80:80 centos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
6.8.Dockerfile构建Redis镜像
编写redis编译安装shell脚本 redis_install.sh
#!/bin/bash
yum install -y gcc gcc-c++ make openssl openssl-devel
cd /usr/local/redis-4.0.9
make && make PREFIX=/usr/local/redis install
mkdir /usr/local/redis/conf
cp /usr/local/redis-4.0.9/redis.conf /usr/local/redis/conf/
sed -i ‘69s/127.0.0.1/0.0.0.0/’ /usr/local/redis/conf/redis.conf
sed -i ‘88s/protected-mode yes/protected-mode no/’ /usr/local/redis/conf/redis.conf
编写dockerfile
#dockerfile部署redis镜像
FROM centos:7
ADD redis-4.0.9.tar.gz /usr/local/
COPY redis_install.sh /usr/local/
RUN sh /usr/local/redis_install.sh
ENTRYPOINT [“/usr/local/redis/bin/redis-server”,“/usr/local/redis/conf/redis.conf”]
执行dockerfile :docker build -t centos:redis .
启动容器:docker run -itd -p 6379:6379 centos:redis /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
进入容器:docker exec -it 9b402baeaba7 /bin/bash
6.9.Dockerfile构建Mysql镜像
拉取mysql:5.7镜像
docker pull mysql:5.7
编写dockerfile文件基于5.7mysql再创镜像
FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
ENV LANG=C.UTF-8
ADD init.sql
构建镜像:docker build -t mysql_new:5.7 .
启动镜像:docker run -itd --name=mysql_5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql_new:5.7