LinuxContainer 是docker的底层实现技术
1、Linux Container是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源
2、Docker是 PAAS_提供商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 Github 上,基于go语言并遵从 Apache2.0协议开源
3、Docker设想是交付运行环境如同海运,OS 如同一个货轮,每一个在OS 基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造
容器级别虚拟化消耗本机资源量最小,可为支持更多用户访问,但安全性较差
仓库,镜像,容器
封装好的运行环境
docker镜像运行之后变成容器(docker run)
正在运行的运行环境
存放镜像,docker仓库:Docker Hub
启动docker服务
systemnctl start docker
停止docker服务
systemnctl stop docker
重启docker服务
systemnctl restart docker
查看docker服务状态
systemctl status docker
开机启动docker服务
systemnctl enable docker
docker提倡理念是"一个容器一个进程",如果一个服务需要多个进程组成,就需要多个容器组成一个系统
Docker指令除了单条使用外,还支持赋值、解析变量、嵌套使用
docker命令大全:Docker 命令大全 | 菜鸟教程
查看镜像
docker images
查看本地已下载的镜像
REPOSITORY(镜像名称) TAG(版本号) IMAGE ID(ID号)
搜索镜像
docker search 镜像名
在镜像仓库里搜索镜像
拉去镜像
docker pull 镜像名:版本号(不写版本号默认最新版本)
从镜像仓库下载镜像到本地
删除镜像
docker rmi ID号/镜像名:版本号(remove image删除镜像)
可用id号删除,也可以镜像名:版本号删除
docker rmi 'docker images -q' 删除所有本地镜像 (docker images -q 查看所有镜像的id号)
这个ID号完整版128位
查看容器
docker ps -a (可查看历史容器)
创建容器 -it创建的成为交互式容器,-id创建的称为守护式容器
docker run -it --nam7e=c1 centos:7 /bin/bash (创建时直接启动并进入,exit退出时直接关闭)
-i:保持运行,-t:给容器分配终端好接收命令,--name=?:给容器起名字 ,centos:7 容器名+版本号, /bin/bash:初始化指令
docker run -id --name=c2 centos:7 (创建容器并后台运行)
-d:后台运行容器
进入容器
docker erec -it c2 /bin/bash (进入c2容器,因为c2是-d创建的,exit后不会关闭)
启动容器
docker start c1
停止容器
docker stop c2
删除容器
docker rm c1
docker rm 'docker ps -aq' 删除所有容器
查看容器信息
docker inspect c2
数据卷是宿主机中的一个目录或文件
当容器目录和数据卷目录绑定后,对方的修改会立即同步
一个数据卷可以被多个容器同时挂载
一个容器也可以被挂载多个数据卷
容器数据持久化
外部机器和容器间接通信
容器之间的数据交换
创建启动容器时,使用-v参数 设置数据卷
注意事项:
1,目录必须是绝对路径
2,如果目录不存在,会自动创建
3,可以挂载多个数据卷
配置数据卷容器
1,创建启动c3数据卷容器,使用-v参数 设置数据卷(/volume为容器内目录)
创建启动c1,c2容器,使用--volumes-from 参数 设置数据卷
数据卷小节
端口映射
容器内的网络服务和外部机器不能直接通信
外部机器和宿主机可以直接通信
宿主机和容器可以直接通信
当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。让外部机器访问宿主机的该端口,从而间接访问容器的服务。
这种操作称为:端口映射
步骤
1,搜索mysql镜像
docker search mysql
2,拉取mysql镜像
docker pull mysql:5.6
3,创建容器,设置端口映射,目录映射
#在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \ #宿主机的3307端口映射到容器的3306端口,宿主机用3306也是ok的
--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.6
参数说明:
1,搜索tomcat镜像
docker search tomcat
2,拉取mysql镜像
docker pull tomcat
3,创建容器,设置端口映射,目录映射
#在/root目录下创建mysql目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
4,写一个内容为"hello tomcat docker"的html文件
5,使用外部机器访问tomcat
参数说明:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error . log warn;
pid /var/run/nginx.pid;
events {
worker _connections1024;
}
http {
include / etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_loca1] "$request" '
'$status $body_bytes_sent " Shttp_referer" '
'"Shttp_user _agent" ""Shttp_x_forwarded_for " ';
access_log /var / log/nginx / access.logmain;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d / * . conf;
}
---------------------------------------------------------------------------
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nfinx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
参数说明:
Docker镜像特性
Docker镜像原理
用户眼里只看到暴露在最外层的镜像
下层的镜像不暴露但可以复用
要想修改镜像,需要先运行镜像,镜像运行成为容器会在最顶层加载一个读写文件系统作为容器,修改这个然后打包产生新的镜像。
Dockerfile
docker commit 容器id 镜像名称:版本号(将容器打包为镜像)
docker save -o 压缩文件名称 镜像名称:版本号(将镜像打包 为压缩文件)
docker load -i 压缩文件名称(把文件解压)
dockerfile概念
统一开发,测试,运维的环境
1,mkidr docker-files
2,cd docker-files/
3,vim centos_dockerfile
写入实现步骤
4,docker build -f ./centos_dockerfile -t newcentos:1 .
dockerfile是创建docker镜像的语法,最大不超过128层,即不超过128行命令
FROM XXX(基于什么镜像)
MAINTAINER (标明dockerfile的作者)
WORKDIR(指定shell语句运行在那个路径下)
COPY(将宿主机的文件拷贝到某路径下)
ADD 添加文件(可以添加远程的)
RUN(执行命令,默认是/bin/sh格式,如RUN echo 321 >> 1.txt)
CMD (容器启动命令,指定镜像启动运行的脚本,只有容器真正运行的时候才会运行的脚本,执行后容器的生命周期即结束,且一般为阻塞式语句,如tail语句)
一般语句为:
FROM WORKDIR COPY-ADD RUN CMD-ENTRYPOINT
ENTRYPOINT非json则以ENTRYPOT为准,如果ENTRYPOINT和CMD都是JSON则ENTRYPOINT+CMD拼接成shell
WORKDIR---指定工作目录
EXPOSE---暴露镜像的指定端口
VOLUME---指定映射文件
ENV---指定doker的环境变量,运行时一直生效
ARG---构建参数,运行时无效,可以构建时候临时修改变量
LABEL---标签,指定元数据,便于找到docker
ONBUILD---当前镜像构建的时候不会执行,基于当前镜像的镜像去构建的时候才会执行
STOPSIGNAL---指定容器使用什么信号,一般指定信号名
HEALTHCHECK---检查容易的健康状态
SHELL---指定linux为/bin/sh,windows为cmd
通过dockerfile进行镜像仓库构建
建个目录用来存放dockerfile文件
编写dockerfile文件
docker build -f 路径(指定dockerfile的文件路径) -t 镜像名:版本(设置新镜像的名称和版本)
step有五步,dockerfile文件每一行构建一层。最高128层
Docker目前在容器市场可以说是占领了大部分市场,Docker掀起了容器革命,同时也改变了现代化云平台的构建方式。尽管Docker很强大,但使用过程当中也遇到了一些问题。比如说我想要构建一个编译型语言镜像,需要先在一个Dockerfile中编译,然后再使用另外一个Dockerfile把编译好的文件放到镜像中。这样无形当中就增大了CI/CD的复杂度。
Docker多阶段构建是17.05以后引入的新特性,旨在解决编译和构建复杂的问题。减小镜像大小。因此要使用多阶段构建特性必须使用高于或等于17.05的Docker。
服务编排:按照一定的业务规则批量管理容器
Docker Compose是一个编排多容器分布式部署的工具,提供命令管理容器化应用的完整开发周期,包括服务构建,启动和停止。
使用步骤
1,利用dockerfile定义运行环境镜像
2,使用docker-compose.yml定义组成应用的各服务
3,运行docker-compose up 启动应用