弱小和无知不是生存的障碍,傲慢才是
1.Docker概述
Docker为什么会出现
一款产品:开发->上先 两套环境! 应用环境,应用配置
问题:我的电脑可以运行!版本更新,导致服务不可用!
环境配置十分麻烦,docker就可以解决这个问题
2.Docker思想
隔离
集装箱的每个箱子互相隔离,打包装箱
3.docker的结构
docker和虚拟机的不同:
传统虚拟机,虚拟出硬件,运行完整的操作系统,然后在这个系统上安装和运行软件
容器内的应用直接运行宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件
每个容器间互相隔离
4.Docker的优点
应用更快速的交付和部署
更便携的升级和扩缩容
更简单的系统运维
更高效的计算资源利用
5.Docker的名词概念
1.镜像(image): docker镜像就是一个模板,可以通过镜像创建多个容器.tomcat镜像->run->tomcat01容器
2.容器(container) docker利用容器技术,独立运行一个或者一组应用,它是通过镜像创建的
启动,停止,删除,基本命令
3.仓库(repository) 存放镜像的地方
公有和私有仓库
6.安装docker docker安装卸载文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 需要的安装包 sudo yum install -y yum-utils # 镜像仓库 sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装docker引擎 sudo yum install docker-ce docker-ce-cli containerd.io
阿里云镜像加速
文档
7.docker run流程
8.底层原理
docker是怎么工作的?
Docker是一个c/s的结构的系统,Docker的守护运行在主机上。通过Socket从客户端访问!
Docker Server接收到Docker-Client的指令,就会执行这个命令.
Docker为什么比虚拟机块?
Docker有比虚拟机更少的抽象层
Docker利用的是宿主机的内核,vm需要是Guest OS
9.Docker的常用命令
帮助命令 文档 下载
1 2 3 docker version # 显示docker的版本信息 docker info # 显示docker的系统信息,包括镜像和容器的数量 docker 命令 --help # 帮助命令
10.镜像命令 1.docker images(显示所有镜像) 1 2 3 4 5 6 7 8 9 10 11 12 13 docker images --help Options: -a, --all Show all images (default hides intermediate images) #列出所有镜像 --digests Show digests -f, --filter filter Filter output based on conditions provided --format string Pretty-print images using a Go template --no-trunc Don't truncate output -q, --quiet Only show image IDs # 只显示镜像的id docker images # REPOSITORY TAG IMAGE ID CREATED SIZE # 镜像仓库源 标签 id 创建时间 大小
2.docker search(镜像搜索) 1 2 3 4 docker search mysql # 可选性 --filter=starts=3000
3.docker pull(拉取镜像)
不写tag就是latest 最新版本
分层下载
1 2 3 docker pull mysql # 等价于 docker pull docker.io/library/mysql:latest
4.docker rmi(删除镜像) 1 2 3 4 # 通过id删除 docker rmi -f id # 删除所有 docker rmi -f $(docker images -aq)
11.容器命令
有了镜像才可以创建容器
新建容器并启动
1.docker run(容器启动) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 docker run [可选参数] image # 参数说明 --name="Name" 容器名字 -d 后台启动 -it 交互方式运行,进入容器查看内容 -p 制定端口 -p8080:8080 1.主机:容器 2.容器 3.ip:容器端口 # 交互进行 docker run -it centos /bin/bash # 退出停止 exit # 退出不停止 ctrl+p+q
2.查看运行的容器 1 2 3 4 5 6 # 正在运行 docker ps # 全部 docker ps -a # -n=? 显示最近创建的容器 ?为个数 # -q 只显示id
3.删除容器 1 2 3 4 5 docker rm 容器id # 删除所有容器(可以删除活动的容器) docker rm -f $(docker ps -aq) # 下面等价 docker ps -a -q|xargs docker rm
4.启动停止操作 1 2 3 4 docker start id docker restart id docker stop id docker kill id
12.其他命令 1 2 3 4 5 docker run -d centos # 为什么centos停止了? # docker 后台运行需要一个前台进程,docker发现没有应用,就会自动停止
1.查看日志 1 2 3 4 docker logs --help dockers log -tf --tail 10 id
2.查看容器进程信息
3.查看容器元数据
4.进入正在运行的容器 1 2 3 4 # 新窗口 docker exec -it id [/bin/bash] # 旧窗口,进入正在执行的终端 docker attach -it id [/bin/bash]
5.容器拷贝数据到主机 1 docker cp id:/home/xx /home
13.Docker镜像详解
镜像就是一个独立的软件包
1.UoionFS(联合文件系统)
一次性加载多个文件系统,但从外面看,只能看到一个文件系统,联合加载会把各层的文件系统叠加起来,这样最终的文件系统会包含所有的底层的文件和目录
2.docker镜像加载
bootfs引导加载
rootfs linux系统标准目录和文件,rootfs就是不同操作系统的发行版
3.分层理解 所有的docker镜像都始于一个基础镜像层,当修改和增加新的内容之后,就会再当今镜像层上,创建新的镜像层
docker镜像都是只读的,当容器启动后,一个新的可读写层被加载到镜像的顶部
(这一层就是我们说的镜像层,镜像层以下都叫做容器层)
4.commit镜像 1 2 docker commit # 提交容器成为一个新的版本 docker commit -m="描述信息" -a="作者" 容器id 目标镜像名称:[tag]
1 2 3 4 5 6 7 8 # 启动一个默认的tomcat # 发现这个tomcat没有webapps应用 # 我自己做了一些操作 # 提交 docker commit -a="codelorin" -m="add webapps" 容器id 目标镜像名称:版本
14.容器数据卷
数据可以持久化
Mysql的数据可以储存在本地
容器之间可以有一个数据共享的功能
1.使用
直接使用命令挂载
1 docker run -it -v 主机目录:容器目录
2.实战同步mysql 1 2 3 4 5 6 7 8 9 10 docker pull mysql:5.7 # 启动mysql docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=密码 --name mysql5.7 mysql:5.7 # -d 后台 -p 端口映射 -v 卷挂载 -e 环境配置 --name 名字
3.具名挂载和匿名挂载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 匿名挂载 只写了容器内的路径 -v 容器内路径 docker run -d -P --name nginx01 -v /etc/nginx nginx # 查看所有数据卷的情况 # docker volume create inspect 查看 ls prune rm # 具名挂载 docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
扩展 可以使用:ro :rw 改变读写权限
1 2 docker run -d -p --name nginx -v juming-nginx:/etc/nginx:ro nginx # ro只能通过宿主机改变,容器无法操作
15.DockerFile 1.初见dockerfile 1 2 3 4 FROM centosVOLUME ["volume01" ,"volume02" ] CMD echo "-----end-----" CMD /bin/bash
1 docker build -f dockerfile -t ./centos:1.0
2.数据卷容器 1 2 docker run -it --name docker02 --volumes-from docker01 # 这样docker01 02会自动同步
容器数据卷的生命周期一直持续到没有容器使用为止
3.构建步骤
编写一个dockerfile文件
docker build 构建成为一个镜像
docker run 运行镜像
docker push 发布镜像(Docker Hub或者阿里云镜像仓库)
基础知识:
指令是大写字母
#注释
每个指令都会创建提交一个新的镜像层
指令
1 2 3 4 5 6 7 8 9 10 11 12 FROM xxx # 基础镜像,一切从这里开始构建 MAINTAINER # 名字+邮箱 RUN # docker构建需要运行的命令 ADD # 步骤:tomcat镜像,tomcat压缩包 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 指定暴露端口 CMD # 指定容器启动需要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定容器运行的命令,可以追加命令 ONBUILD # 当构建一个被继承Dockerfile 就会运行ONBUILD的指令,触发指令 COPY # 类型ADD,将我们文件拷贝到镜像中 ENV # 设置环境变量
4.实战构建centos 1 2 3 4 5 6 7 8 9 10 11 FROM centosMAINTAINER codelorin<codelorin@163 .com>ENV MYPATH /user /localWORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "END!!" CMD /bin/bash
1 docker build -f dockerfile -t mycentos:0.1 .
5.CMD和ENTRYPOINT的区别 1 2 CMD # 指定容器启动需要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定容器运行的命令,可以追加命令
1 2 3 FROM centosCMD ["ls" ,"-a" ]
1 2 3 docker run id -l # 报错CMD使用-l替代了ls-a # ENTRYPOINT则会在末尾追加-l
6.制作tomcat镜像 1.准备tomcat,jdk压缩包 2.编写dockerfile 官方建议:Dockerfile 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 FROM centosMAINTAINER codelorin<codelorin@163 .com>COPY readme.md /user/local /readme.md ADD jdk.tar.gz ADD tomcat.tar.gz RUN yum -y install vim ENV MYPATH /user /localWORKDIR $MYPATH ENV JAVA_HOME /user /local/jdk1.8 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /user /local/apache-tomcatENV CATALINA_BASH /user /local/apache-tomcatENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080 CMD /user/local /apache-tomcat/bin/startup.sh && tail -F /usr/local /apache-tomcat/bin/logs/catalina.out
7.Docker-Hub发布镜像 1 2 3 docker login -u bylorin -p xxx docker tag id codelorin/tomcat:1.0 docker push codelorin/tomcat
8.阿里云发布镜像
详见阿里云镜像官网
1.创建命名空间 2.创建容器镜像 16.Docker网络
待更新