Docker 学习目录
docker 概述
docker是什么
- 使用最广泛的肉开源容器引擎 其他如rocket,containerd,pouch等容器引擎
- 一种系统级虚拟化技术 传统的kvm xen,exsi,vmware
- 依赖于Linux内核特性namespace(资源隔离)cgroup(资源限制)
docker设计目标
- 提供简单的应用程序打包
- 开发和运维人员职责逻辑隔离
- 多环境保持一致
docker基本组成
- docker client 客户端
- docker daemon 守护进程
- docker images 镜像
- docker container 容器
- docker registry 镜像仓库
容器VS docker
|
Container
|
VM
|
|
|
启动速度
|
秒级
|
分钟级
|
|
运行性能
|
接近原生
|
5%左右损失
|
|
磁盘占用
|
MB
|
GB
|
|
数量
|
成百上千
|
一般几十台
|
|
隔离性
|
进程级
|
系统级(更彻底)
|
|
操作系统
|
主要支持Linux
|
几乎所有
|
|
封装程度
|
只打包项目代码和依赖关系 共享宿主机内核
|
完整的操作系统
|
docker应用场景
- 应用程序的打包和发布
- 应用程序隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供paas产品 平台服务
docker 安装
docker版本
- 社区版(Community Edition,CE)
- 企业版(Enterprise Edition,EE)
支持的平台
Centos7.x 安装dokcer
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker软件包源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker CE
yum install -y docker-ce
# 启动Docker服务并设置开机启动
systemctl start docker
systemctl enable docker
镜像管理
镜像是什么?
- 一个分层存储的文件
- 一个软件的环境
- 一个镜像可以创建N个容器
- 一种标准化的交付
- 一个不包含Linux内核而又精简的Linux操作系统
镜像从哪里来?
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
镜像如容器的联系
镜像与容器的区别
- 一个镜像创建多个容器
- 镜像增量式存储
- 创建的容器里面修改不会影响到镜像
管理镜像常用命令
|
指令
|
描述
|
|
ls
|
列出镜像
|
|
build
|
构建镜像来自Dockerfile
|
|
history
|
查看镜像历史
|
|
inspect
|
显示一个或多个镜像详细信息
|
|
pull
|
从镜像仓库拉取镜像
|
|
push
|
推送一个镜像到镜像仓库
|
|
rm
|
移除一个或多个镜像
|
|
prune
|
移除未使用的镜像。没有被标记或被任何容器引用的。
|
|
tag
|
创建一个引用源镜像标记目标镜像
|
|
export
|
导出容器文件系统到tar归档文件
|
|
import
|
导入容器文件系统tar归档文件创建镜像
|
|
save
|
保存一个或多个镜像到一个tar归档文件
|
|
load
|
加载镜像来自tar归档或标准输入
|
容器管理
创建容器常用选项
|
选项
|
描述
|
|
-i, –interactive
|
交互式
|
|
-t, –tty
|
分配一个伪终端
|
|
-d, –detach
|
运行容器到后台
|
|
-e, –env
|
设置环境变量
|
|
-p, –publish list
|
发布容器端口到主机
|
|
-P, –publish-all
|
发布容器所有EXPOSE的端口到宿主机随机端口
|
|
–name string
|
指定容器名称
|
|
-h, –hostname
|
设置容器主机名
|
|
–ip string
|
指定容器IP,只能用于自定义网络
|
|
–network
|
连接容器到一个网络
|
|
–mount mount
|
将文件系统附加到容器
|
|
-v, –volume list
|
绑定挂载一个卷
|
|
–restart string
|
容器退出时重启策略,默认no,可选值:[always|on-failure]
|
容器资源限制
|
选项
|
描述
|
|
-m,–memory
|
容器可以使用的最大内存量
|
|
–memory-swap
|
允许交换到磁盘的内存量
|
|
–memory-swappiness=<0-100>
|
容器使用SWAP分区交换的百分比(0-100,默认为-1)
|
|
–oom-kill-disable
|
禁用OOM Killer
|
|
--cpus
|
可以使用的CPU数量
|
|
–cpuset-cpus
|
限制容器使用特定的CPU核心,如(0-3, 0,1)
|
|
–cpu-shares
|
CPU共享(相对权重)
|
管理容器常用命令
|
选项
|
描述
|
|
ls
|
列出容器
|
|
inspect
|
查看一个或多个容器详细信息
|
|
exec
|
在运行容器中执行命令
|
|
commit
|
创建一个新镜像来自一个容器
|
|
cp
|
拷贝文件/文件夹到一个容器
|
|
logs
|
获取一个容器日志
|
|
port
|
列出或指定容器端口映射
|
|
top
|
显示一个容器运行的进程
|
|
stats
|
显示容器资源使用统计
|
|
stop/start/restart
|
停止/启动一个或多个容器
|
|
rm
|
删除一个或多个容器
|
管理应用程序数据
将数据从宿主机挂载到容器中的三种方式
- volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
- bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
- tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。
Volume
管理卷:
# docker volume create nginx-vol
# docker volume ls
# docker volume inspect nginx-vol
用卷创建一个容器:
# docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
# docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
清理:
# docker stop nginx-test
# docker rm nginx-test
# docker volume rm nginx-vol
注意:
Bind Mounts
用卷创建一个容器:
# docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
# docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
验证绑定:
# docker inspect nginx-test
清理:
# docker stop nginx-test
# docker rm nginx-test
注意:
小结
Volume特点:
- 多个运行容器之间共享数据,多个容器可以同时挂载相同的卷。
- 当容器停止或被移除时,该卷依然存在。
- 当明确删除卷时,卷才会被删除。
- 将容器的数据存储在远程主机或其他存储上(间接)
- 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
Bind Mounts特点:
- 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
- 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在 Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
- 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时
容器网络
网络模式
- bridge–net=bridge默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
- host–net=host容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。
- none–net=none获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。
- container–net=container:Name/ID与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
- 自定义网络与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名容器之间网络通信。
容器网络访问原理
Dockerfile
Dockerfile格式
FROM centos:latest
RUN yum install gcc -y
COPY run.sh /usr/bin
EXPOSE 80
CMD [“run.sh”]
MAINTAINER lizhenliang
Dockerfile指令
|
指令
|
描述
|
|
FROM
|
构建新镜像是基于哪个镜像
|
|
LABEL
|
标签
|
|
RUN
|
构建镜像时运行的Shell命令
|
|
COPY
|
拷贝文件或目录到镜像中
|
|
ENV
|
设置环境变量
|
|
USER
|
为RUN、CMD和ENTRYPOINT执行命令指定运行用户
|
|
EXPOSE
|
声明容器运行的服务端口
|
|
HEALTHCHECK
|
容器中服务健康检查
|
|
WORKDIR
|
为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录
|
|
ENTRYPOINT
|
运行容器时执行,如果有多个ENTRYPOINT指令,最后一个生效
|
|
CMD
|
运行容器时执行,如果有多个CMD指令,最后一个生效
|
Build镜像
Usage: docker build [OPTIONS] PATH | URL | - [flags]
Options:
-t, --tag list # 镜像名称
-f, --file string # 指定Dockerfile文件位置 # docker build -t shykes/myapp .
# docker build -t shykes/myapp -f /path/Dockerfile /path
# docker build -t shykes/myapp http://www.example.com/Dockerfile
构建Nginx,PHP,Tomcat基础镜像
- 构建Nginx基础镜像
FROM centos:7
LABEL wenlong
RUN yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/*
RUN wget http://nginx.org/download/nginx-1.15.5.tar.gz && \
tar zxf nginx-1.15.5.tar.gz && \
cd nginx-1.15.5 && \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module && \
make -j 4 && make install && \
rm -rf /usr/local/nginx/html/* && \
echo "ok" >> /usr/local/nginx/html/status.html && \
cd / && rm -rf nginx-1.15.5* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
- 构建PHP基础镜像
FROM centos:7
LABEL maintainer wenlong
RUN yum install epel-release -y && \
yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel \
libmcrypt-devel libxslt-devel libtidy-devel autoconf \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/* RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
tar zxf php-5.6.36.tar.gz && \
cd php-5.6.36 && \
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm --enable-opcache \
--with-mysql --with-mysqli --with-pdo-mysql \
--with-openssl --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-png-dir --with-freetype-dir \
--enable-mbstring --with-mcrypt --enable-hash && \
make -j 4 && make install && \
cp php.ini-production /usr/local/php/etc/php.ini && \
cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && \
sed -i "90a \daemonize = no" /usr/local/php/etc/php-fpm.conf && \
mkdir /usr/local/php/log && \
cd / && rm -rf php* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/php/sbin
COPY php.ini /usr/local/php/etc/
COPY php-fpm.conf /usr/local/php/etc/
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["php-fpm"]
- 构建Tomcat基础镜像
FROM centos:7
LABEL maintainer wenlong ENV VERSION=8.0.52 RUN yum install java-1.8.0-openjdk wget curl unzip iproute net-tools -y && \
yum clean all && \
rm -rf /var/cache/yum/* RUN wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz && \
tar zxf apache-tomcat-${VERSION}.tar.gz && \
mv apache-tomcat-${VERSION} /usr/local/tomcat && \
rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \
mkdir /usr/local/tomcat/webapps/test && \
echo "ok" > /usr/local/tomcat/webapps/test/status.html && \
sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV PATH $PATH:/usr/local/tomcat/bin WORKDIR /usr/local/tomcat EXPOSE 8080
CMD ["catalina.sh", "run"]
快速搭建LNMP网站平台
1、自定义网络
docker network create lnmp
2、创建Mysql容器
docker run -d \
--name lnmp_mysql \
--net lnmp \
--mount src=mysql-vol,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress mysql:5.7 --character-set-server=utf8
3、创建PHP容器
docker run -d --name lnmp_php --net lnmp --mount src=wwwroot,dst=/wwwroot php:v1
4、创建Nginx容器
docker run -d --name lnmp_nginx --net lnmp -p 88:80 \
--mount src=wwwroot,dst=/wwwroot nginx:v1
5、以wordpress博客为例
https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
Docker 学习目录的更多相关文章
- 1.ASP.NET Core Docker学习-Docker介绍与目录
Docker的优点: 1节约时间,快速部署和启动 2节约成本 3标准化应用发布 4方便做持续集成 5可以用Docker做为集群中的轻量主机或节点 6方便构建基于SOA或者微服务架构 的系统 学习目录: ...
- Docker学习总结之Run命令介绍
Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...
- docker~学习笔记索引
回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...
- 优秀的云计算工程师需要学什么?云计算Docker学习路线
云计算工程师要学什么?随着互联网的快速发展,云计算这个词大家并不陌生,但是云计算究竟是做什么的,想要从事云计算要学习什么,很多都不知道,那么今天就给大家讲一下云计算. 云计算是基于互联网的相关服务的增 ...
- docker学习(1)--基础概念
转载请注明源文章出处:http://www.cnblogs.com/lighten/p/6841677.html 1.前言 docker的官网:这里.下一段摘自官网描述. docker是世界领先的软件 ...
- Docker学习之——Node.js+MongoDB+Nginx环境搭建(一)
最近在学习Node.js相关知识,在环境搭建上耗费了不少功夫,故此把这个过程写下来同大家分享一下,今天我先来介绍一下Docker,有很多人都写过相关知识,还有一些教程,在此我只想写一下,我的学习过程中 ...
- Docker学习(五): 仓库与数据管理
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- Docker学习(三): Dockerfile指令介绍
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- Docker学习(二): 镜像的使用与构建
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
随机推荐
- 构建后端第1篇之---springcloud项目依赖分析
张艳涛写于2021-2-2日 springcloud是springboot工程+cloud依赖,从这个角度来分析,使用springcloud实际上就是添加springcloud的某个以来比如eurek ...
- 【小工具系列】Python + OpenCV 图片序列转换成视频
图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...
- vulnhub-DC:6靶机渗透记录
准备工作 在vulnhub官网下载DC:6靶机DC: 6 ~ VulnHub 导入到vmware,设置成NAT模式 打开kali准备进行渗透(ip:192.168.200.6) 信息收集 利用nmap ...
- 如何在 NetCore 中定义我们自己的JSON配置文件的管理器。
一.介绍 微软已经对外提供了新的平台,我们叫它们是 Net Core 平台,这个平台和 Net Framework 平台有本质的区别,这个最本质的区别就是微软的C#代码可以跨平台了.当前我们主流的3大 ...
- 记录21.07.26 —— Vue/cil
VUE搭载脚手架 搭载环境 下载node node.js下载地址 控制台输入 npm install -g @vue/cil 查看版本 创建vue项目 创建完后会显示启动服务的指令 这个指令可以在pa ...
- Redis 实战篇:巧用数据类型实现亿级数据统计
在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合,同时还要对集合中的数据进行统计排序. 常见的场景如下: 给一个 userId ,判断用户登陆状态: 两亿用户最近 7 ...
- UI_UE在线就业班(2)(Adobe Illustrator软件学习)
Adobe Illustrator软件的使用 认识AIUI_UE在线就业班(2) . ▼ AI是Adobe Illustrator的英文缩写,是Adobe公司旗下推出的一款基于矢量图形制作 ...
- SVG和Canvas的区别?
什么是SVG? SVG(可缩放矢量图形)编辑可缩放矢量图形是基于可扩展标记语言(标准通用标记语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网联盟制定,是一个开放标准. 什么是 Canvas ...
- SQL--查询JSON、时间、字符串的高级用法
SQL--查询JSON.时间.字符串的高级用法 本文章总结SQL的JSON.时间格式.字符串判断转换的使用.核心点还是在于Json字段的提取(1.5).时间的比较(2.2,2.3)以及字符串的查询(3 ...
- Mina的JMX支持
以下是一个增加了JMX支持的Mina Echo Server. package org.apache.mina.echoServer; import java.lang.management.Mana ...