了解docker及其基本操作

一、产生背景

以Linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
例如:
pid=2—>python (pid=3)—> java(pid=4)—>php(pid=4),三个服务可能会互相影响,但是希望这三个服务分别封装起来(可以使用kvm虚拟化技术,实现一个操作系统模拟多个操作系统/不同的运行时环境)随着技术的发展,虚拟化技术开销较大(比如:我只想运行一个python脚本,如果使用kvm虚拟化技术就需要安装一个操作系统并不方便/合理,安装一个kvm操作可能花费的时间更多)所以由此产生容器技术,虚拟化层的抽象层(用户层)剥离,使用docker egine来代替(来宾操作系统去除),只通过引擎就可以直接连接到宿主机操作系统中,减少了开销

二、docker简介

是一种轻量级的 “虚拟机”
在Linux容器里运行应该的开源工具
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。是一个开源的应用容器引擎,让开发者以打包方式封装应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
(沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制)

Docker在2013年一炮而红,直到现在,已经成为容器技术的代名词。
Docker从一开始就以提供标准化的运行时环境为目标,真正做到"build once,run anywhere",可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了Caas(容器即服务)技术。
总结:Docker是基于容器技术的轻量级虚拟化解决方案

docker是容器引擎,把linux的cgroup、namespace等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行Cli、api等)docker也是一种C/S架构,client和server端工作在一起
(cgroup:资源管理技术(是谷歌开发集成在linux中))

(一)Docker核心三要素
1.镜像
一个面向Docker容器引擎的只读模板
提供单一的格式的一个组合型/叠加型文件(资源集合),一组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境)
2.容器
从镜像创建的运行实例
基于镜像的一种运行状态
3.仓库
集中保存镜像的地方
1.公有仓库:Docker官方仓库 docker hub ,github
2.私有仓库:个人化、私有化的仓库 registry(字符终端) ,harbor(web图形界面)gitlab

(二) 应用于应用的隔离
以操作系统维度应用与应用隔离,在操作系统中,是通过namespaces实现的,只要实现以下6个空间隔离,才能认为两个应用实现了隔离
容器隔离了6个名称空间(namespace资源隔离-用容器化技术封装)

mount 文件系统,挂载点
user 操作进程的用户和用户组
pid 进程编号
uts 主机名和主机域
ipc 信号量、消息队列,共享内存(不同的应用调用的时候应该使用不同的内存空间)
net 网络设备、网络协议、端口
命名空间:封闭的环境,在一个名称空间内不能有两个相同的技术栈,但是不同的命名空间可以一样

pid命名空间:进程隔离(pid:进程ipd号)
net命名空间:管理网络(net:网络)
ipc命名空间:管理访问ipc资源(ipc:进程间通信)
mnt命名共享:管理文件系统挂载点(mnt:mount挂载)
uts命名空间:隔离内核文件和版本标识符(uts:unix时间共享系统)

(三)与虚拟化相比docker的优势
docker 引擎统一了基础设施环境-docker环境(image封装一个简易的操作系统)
docker引擎统一了程序打包(装箱)方式-docker镜像(image)
docker 引擎统一了程序部署(运行)方式-docker容器(基于image运行,容器)

使用方向(app 小程序 微信小程序)

docker与虚拟机的区别

特点 Docker容器 虚拟机
启动速度 秒级 分钟级
计算能力损耗 几乎没有损耗(接近原生直接在内核中运行) 损耗50%左右
磁盘占用 MB GB(操作系统镜像2G)
系统支持数量 成百上千 一般几十台(操作系统级别)
操作系统 主要支持Linux 几乎所有
隔离性 进程级别,资源隔离/限制 系统级别,完全隔离(更彻底安全)
封装程度 只打包项目代码和依赖关系,共享宿主机内核 完整的操作系统,与宿主机隔离
docker解决了vm的孤岛问题:可以自定义传参

(四)docker的使用场景
1.打包应用程序简单部署
流程:将应用程序代码 ,打包成war包或jar包——>放入私有仓库中(代码仓库)——>jenkins等工具,jenkins可以查看代码构建镜像失败的原因,相当于简单测试(构建镜像/应用程序封装)——>运维下载,或使用容器技术进行运行/发布
2.可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)比如云服务器迁移
3.持续集成和持续交付(CI/CD):开发到测试发布
4.部署为服务
5.提供PAAS产品(平台即服务)openstack的云主机类似于阿里云的ecs,属于IAAS,Docker(K8s)属于PAAS

(五)Docker引擎(Docker Engine)

Docker Engine 是具有以下主要组件的C/S客户段——服务器应用程序;
server端:服务器是一种长期运行的程序。称为守护程序进程(dockerr命令)
clinet:rest api,指程序可以用来与程序进行通信并指示其操作的接口
命令行界面(cli)客户端(docker命令)
docker run
docker start
docker rm

(六)Docker架构(docker architecture)
1.docker使用客户端——服务器架构。docker 客户端与docker守护进程进行对话,该守护进程完成构建,运行和分发docker容器的繁重工作。Docker区别于传统的虚拟化,不需要虚拟硬件资源,hi姐使用容器引擎,所以速度块

2.docker client:客户端/提供一个于用户交互,展示的平台+管理,控制docker服务端(命令行)

3.docker客户端(docker)是许多docker用户与docker交互的主要方式,当您使用比如docker run命令是客户端将这些命令发送到dockerd,以执行这些命令。该docker命令使用docker api。docker客户端可以与多个守护进程通信

4.docker daemon:守护进程

5.docker守护程序(docker)侦听docker
api请求并管理docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护进程通信以管理docker服务

6.docker image(镜像)
容器可以被打包成镜像

docker container :容器
docker registry :镜像仓库储存镜像的地方,默认在公共的docker hub 上查找,可以使用个人仓库

三、docker部署

关闭防火墙及安全机制

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled

安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

yum-utils提供了yum-config-manager,yum的管理工具

device-mapper-persistent-data 容器引擎的存储驱动

device mapper存储驱动程序需要device-mapper-persistent-data和lvm2

Device Mapper 是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设

设置阿里云镜像源

cd /etc/yum.repos.d
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-

安装Docker-CE

yum install -y docker-cesystemctl start docker.service
systemctl enable docker.service

配置阿里云的镜像加速

  • 加速地址从阿里云官网获取::https://account.aliyun.com/
  • 获取方式:登录阿里云–>控制台–>在上面搜索容器镜像服务–>左下角的镜像加速器—>根据文档操作

优化网络

vim /etc/sysctl.conf
net.ipv4.ip_forward=1      #ipv4转发功能sysctl -psystemctl restart docker 或 service network restart

##四、docker基本命令

查看docker版本信息

docker version

docker配置文件可选项(生产环境)

vim /etc/docker/daemon.json #守护进程配置文件server端

“graph”:“/data/docker”, #数据目录
“storage-driver”:“overlay2”, #存储引擎
“insecure-registries”:[“registry.access.redhat.com”,“quary.io”] #私有仓库
“registry-mirrors”: [“https://…”] #镜像加速
“bip”:“172.190.11.1/24”, #docker网络,表示docker 是哪台,建议当前服务器地址后两端 192.168.190.11/24 ,更容易故障定位
“exec-opts”:[“native.cgroupdriver-systemd”], #启动时的额外参数
“live-restore”:true #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能继续运行

systemctl daemon-reload
systemctl restart docker

查找指定镜像

docker search 服务名

运行容器

docker run 容器名

查看docker版本

docker version 或者 docker info

下载镜像

docker pull 服务名
例如
docker search nginx
docker search centos:7
ps:linux发现版本apline centos redhat debian,生产环境可能需要安装不同版本环境,有利于优化镜

镜像为什么会分层下载
nginx image封装了——>操作系统的镜像——>nginx依赖包镜像——>等其他的一些服务镜像

查看镜像信息

docker images
docker inspect 镜像的ID
例如
docker images
docker inspect

查看image(镜像)列表

docker images

镜像添加新标签(打标签)

docker tag 仓库名:原镜像名 仓库名:新镜像名
例如:
docker tag nginx:latest nginx:v1
docker images
docker images | grep nginx

删除镜像

docker rmi 镜像id
docker rmi 镜像:标签

镜像导出

mkdir docker.image
cd docker.image
docker save -o 文件名 镜像:标签
例如:
docker save -o nginx.docker nginx:v1

载入镜像

方法一:
docker load < 本地导出的镜像名
方法二:
docker --input 本地导出的镜像名例如:
docker load < nginx_latest
docker load --input nginx_latest
12345678

上传镜像

1.将本地的镜像上传到公有的镜像仓库,要先登陆到镜像仓库
2.上传镜像前要修改标签,标签前面要加上Docker官网的账号名

  • 标签格式: Docker官网的账号名/仓库名:镜像名

一般不会上传到公有仓库中,公司内部都使用私有仓库

docker push [OPTIONS] NAME[:TAG]

例如:按照下面的流程就可以上传到公有云,有兴趣的可以上传

改标签

docker tag 仓库名:镜像名 用户名/仓库名:镜像名

登录

docker login
Username: #用户名
Password: #密码

上传

docker push 用户名/仓库名:镜像名

##五、docker容器操作

查询容器

docker ps -a
docker ps -aq       #指显示容器id号

创建容器

docker create -it nginx:latest /bin/bash
-i :让容器的标准输出保持打开
-t :分配一个伪终端
-d :后台守护进程的方式运行

容器状态有哪些,分别是什么场景

容器状态有7种:
created(已创建)
restarting(重启中)
up/running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)

启动容器

docker start 容器id

停止容器

docker stop 容器id

后台运行
docker run -d centos:7 /bin/bash -c “while true;do echo hello;done” #-d后端执行一次退出,while是个循环语句,条件成立则循环执行,不加-d一直输出 hello

docker run centos:7 /usr/bin/bash -c ls / #启动容器,执行一次运行并执行一次命令并退出

进入容器

使用run 进入容器执行操作,退出容器后 容器状态退出

docker run -it nginx:latest /bin/bash
ctl + D 或 exit     #退出容器 ctl+d返回130 ,exit返回127

exce进入(容器必须为开启状态)

docker exce -it 容器id /bin/bash

容器导出

docker export 容器id > 文件名
示例:
docker export 容器id > nginx-1

容器导入(生成镜像文件)

docker import 导出的文件名(容器)指定镜像名称
示例:
docker import nginx-1 nginx:test1
cat 文件名(容器)| docker import - nginx:latest

删除容器

docker rm 容器id
docker rm -f 容器id

批量删除容器
docker rm $(docker ps -aq)

docker ps -a | awk ‘{print "docker rm "$1}’ | bash

批量删除状态为exit状态的容器

for i in $(docker ps -a |grep -i exit) | awk ‘{print $1}’;do docker rm -f $i;done

##六、docker网络模式

查看docker服务器的ifconfig

######docker网络原理
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都t接入同一个网桥(容器与容器网桥通过veth对进行通信对接),这样容器之间就能够通过容器的Container-IP直接通信。
注意:docker网桥可以有多个

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p(指定暴露端口) 或 -P(随机分配暴露端口) 参数来启用,访问容器的时候就通过[宿主机IP]:[映射端口]访问容器。

#####docker网络的四种模式
Docker网络模式说明
host模式 容器和宿主机共享Network namespace ( --net=host )
container模式 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace(–net=container:NAME_or_ID)
none模式 容器有独立的Network namespace,封闭的网络环境,并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等(–net=none)
bridge模式 (默认为该模式)–net=bridge 不同docker使用不同网桥docker run --net=br0 xxxxx… docker run --net=br1 xxxxx…

#####host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。==容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。==但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。

#####container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

#####none模式(封闭空间)
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

#####bridge模式(默认网络模式)
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看

#####docker自定义网络
1.查看网络列表
docker network ls

bridge是默认分配的所以无法分配地址

docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:latest /bin/bash

------执行会报错--------#

自定义网络固定ip
docker network create --subnet=172.18.0.0/16 mynetwork #创建名称为mynetwork的docker网桥
docker run -itd --name test2 --net mynetwork --ip 172.18.0.11 centos:latest /bin/bash

暴露端口

docker run -itd -p 3333:80 nginx /bin/bash       #指定端口
docker run -itd -P nginx /bin/bash      #-P随机端口

宿主机环境执行容器内命令

docker exec -it 容器id /bin/bash -c 'nginx'      #开启nginx服务

宿主机的文件传入容器内部

docker cp 文件路径 容器id:文件路径
示例
docker cp /opt/1.text 容器id:/etc/

然后浏览器访问本机IP+3333端口

解决进入容器后无法使用systemctl命令
docker run -itd --name test3 --privilege=true centos /sbin/init

添加参数,指定此容器是否为特权容器授予权限,使用此参数则不能使用attach命令

/sbin/init 是内核主动唤起的一个进程

七、docker镜像分层

######(一)概述
docker镜像
应用发布的标准格式
支撑一个docker容器的运行

docker镜像的创建方法
基于已有镜像创建
基于本地模板创建
基于Dockerfile创建

镜像分层原则
Dockerfile中的每个指令都会创建一个新的镜像层
镜像层将被缓存和服用
当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像是指定的变量不同了,对应的镜像镜像层就会失效
某一层的镜像缓存失效后它之后的镜像层缓存都会失效
镜像层是不可变的,如果在某一层中添加一个文件,然后再下一层中删除,则镜像中依然会包含该文件

#####镜像分层结构
1.(内核层):由AUFS,LXC,Bootfs(boot file system)组成为上层的镜像提供kernel内核支持

AUFS是一个联合文件系统,它使用同一个Linux host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层 分层的思想
bootfs:负责与内核交互 主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层时bootfs,这一层与经典的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统就会卸载bootfs
rootfs(root file system)属于base images 在bootfs之上(base images)比如在linux系统中包含/dev,/proc,/bin,/etc等标准目录和文件,包含创建、启动操作系统的一些必要的组件,rootfs就是各个不同的操作系统的发行版本,比如Ubuntu,CentOS等等
lxc早期的内核引擎与docker引擎对接交互,docker提供一些库文件和引导文件。现在docker自身内置了所需要的lib库
2.base image(基础/系统镜像层):构建镜像运行的操作系统环境

3.add image(run指令运行的镜像层):比如nginx镜像的yum安装模块,或者nginx编译安装的指令,使用镜像封装每一个run执行命令

4.Container(可读写执行层):将下面的镜像组合运行提供给docker client使用

总结
1.docker镜像层位于bootfs之上
2.每一层镜像成为base image/底包(操作系统环境变量)比如centos dbian
3.容器层(可读可写),在最顶层。是docker server提供给docker client
4.容器层以下都是readonly只读,docker将readonly的FS层成为image

为什么docker的centos镜像只有200M就是因为一个精简的os,rootfs可以很小,之许哟啊将基础命令,工具和程序库就可以了,因为底层直接用host的kernel,自己只需要提供rootfs继续。由此可见不同的linux发现版本,bootfs基本一致,rootfs会有差别,不同的发现版本可以公用bootfs

补充

每次图送至docker hub 公有仓库只会推送增量部分(毕竟底包比较大,增量推送/更新部分比较小)所以生产环境中只要执行镜像再推送的时候增量部分控制到比较小的范围就可以

######(二)dockerfile结构

1.基础镜像信息(指定操作系统镜像是什么镜像,什么版本)
2.维护者信息
3.镜像操作指令
4.容器启动时执行的命令

######(三)dockerfile操作指令
指令 含义
FROM 镜像 指定新镜像所基于的操作系统镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER + 名字 说明新镜像的维护人信息
RUN + 命令 在所基于的镜像执行命令,并提交到新的镜像中(每写一条指令都会创建一个镜像层)
CMD + [“要运行的程序”,“参数1”、“参数2”] 指令启动容器时要运行的命令或者脚本(例如 CMD [“run.sh”]),Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条
EXPOSE + 端口号 指定新镜像加载到Docker时要开启的端口
ENV + 环境变量 + 变量值 设置一个环境变量的值,会被后面的RUN使用
ADD + 源文件/目录 + 目标文件/目录 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL,若源文件是压缩包则会将其解压缩
COPY + 源文件/目录 + 目标文件/目录 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME + [“目录”] 在容器中创建一个挂载点(VOLUME [“/目录”] )
USER + 用户名/UID 指定运行容器时的用户(在编写mysql es mg数据库镜像文件时可能需要时用对用户授权)
WORKDIR + 路径 为下一步的RUN、CMD、ENTRYPOINT指定工作目录,相当于是一个临时的"CD",否则需要使用绝对路径
ONBUILD + 命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK 健康检查

CMD与ENTRYPOINT的区别
ENTRYPOINT类似于 CMD 指令,但其不会被 docker run 运行容器并且执行的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程,CMD相反,会被docker run指定命令覆盖
CMD和ENTRYPOINT可以联合使用
COPY与ADD的区别

在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>,ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定

######(四)编写ssh dockerfile
mkdir ssh
cd sshd

vim Dockerfile
FROM centos:7
RUN yum -y update
RUN yum -y install openssh* net-tool lsof telnet passwd
RUN echo ‘123456’ | passwd --stdin root
RUN sed -i ‘s/UsePAM yes/UsePAM no/g’ /etc/ssh/sshd_config
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN sed -i ‘/session\s+required\s+pam_loginuid.so/s//#/’ /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
EXPOSE 22
CMD [“/usr/sbin/sshd”,“-D”]

生成镜像

docker build -t sshd:v1 。

启动容器并修改root密码

dockers run -d -P sshd:v1
ssh localhost -p 端口

######(五)tomcat的dockerfile
FROM centos:7
ADD apache-tomcat-9.0.16.tar.gz /opt
ADD jdk-8u201-linux-x64.rpm /opt

WORKDIR /opt
RUN rpm -ivh jdk-8u201-linux-x64.rpm
ENV JAVA_HOME /usr/java/jdk1.8.0_201-amd64
ENV CLASSPATH JAVAHOME/lib/tools.jar:JAVA_HOME/lib/tools.jar:JAVAH​OME/lib/tools.jar:JAVA_HOME/lib/dt.jar
ENV PATH /usr/java/jdk1.8.0_201-amd64/bin:$PATH
RUN mv apache-tomcat-9.0.16 /opt/tomcat

CMD [“/opt/tomcat/bin/catalina.sh”,“run”]

docker -d run -p 8080:8080 tomcat:v1 #开启容器

建立镜像文件

dockers build -t tomcat:v1 . (末尾的(.)号不要忘记)

指定端口开启容器

docker run -d -p 8080:8080 tomcat:v1

######(六)nginx的dockerfile及其优化(减小镜像的大小)

常规写法
方法一:
[root@localhost ~]#cd nginx
[root@localhost nginx]#ls
Dockerfile nginx-1.12.0.tar.gz
[root@localhost nginx]#vim Dockerfile

FROM centos:7
ADD nginx-1.12.0.tar.gz /opt

RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null

RUN useradd -M -s /sbin/nologin nginx
WORKDIR /opt/nginx-1.12.0

RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx

RUN make &> /dev/null && make install &> /dev/null

EXPOSE 80
CMD [“/usr/local/nginx/sbin/nginx”,“-g”,“daemon off;”]

方法二:
FROM centos:7
MAINTAINER gt

RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /opt/
WORKDIR /opt/nginx-1.12.0
WORKDIR nginx-1.12.0
RUN ./configure
–prefix=/usr/local/nginx
–user=nginx
–group=nginx
–with-http_stub_status_module && make && make install
EXPOSE 80
EXPOSE 443
RUN echo “daemon off;”>>/usr/local/nginx/conf/nginx.conf

ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD [“/run.sh”] #调用脚本

编写CMD中的nginx启动命令脚本

[root@localhost nginx1]#ls
Dockerfile nginx-1.12.0.tar.gz run.sh
[root@localhost nginx1]#vim run.sh

/#!/bin/bash

/usr/local/nginx/sbin/nginx

创建镜像

docker build -t nginx:v1

######nginx —dockerfile优化
1.将不需要输出的指令放入/dev/null文件黑洞中
2.减少RUN指令
3.多阶段构建

[root@localhost ~]#cd nginx3
[root@localhost nginx3]#ls
Dockerfile nginx-1.12.0.tar.gz
[root@localhost nginx3]#vim Dockerfile
[root@localhost nginx3]#vim Dockerfile

FROM centos:7
ADD nginx-1.12.0.tar.gz /opt
WORKDIR /opt/nginx-1.12.0

RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null
&& yum clean all &>/dev/null
&& useradd -M -s /sbin/nologin nginx &> /dev/null
&& ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &> /dev/null
&& make &> /dev/null && make install &> /dev/null
&& rm -rf /mnt/nginx-1.12.0

EXPOSE 80
CMD [“/usr/local/nginx/sbin/nginx”,“-g”,“daemon off;”]

创建镜像

docker build -t nginx:test .

显示创建的镜像

docker images

######多阶段构建

FROM centos:7 as build
ADD nginx-1.12.0.tar.gz /opt
WORKDIR /opt/nginx-1.12.0

RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null
&& yum clean all &>/dev/null
&& useradd -M -s /sbin/nologin nginx &> /dev/null
&& ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &> /dev/null
&& make &> /dev/null && make install &> /dev/null
&& rm -rf /mnt/nginx-1.12.0

FROM centos:7
EXPOSE 80
COPY --from=build /usr/local/nginx /usr/local/nginx #使用之前构建的环境
CMD [“/usr/local/nginx/sbin/nginx”,“-g”,“daemon off;”]

创建镜像

docker build -t nginx:test .

会构建的很快

显示创建的镜像

docker images

##八、docker私有仓库建立,数据卷挂载,容器间通讯

(一)、仓库
1.代码仓库:公共仓库github ,私有仓库gitlib
2.镜像仓库:公共仓库 docker hub ,私有仓库:registry(有图像终端界面)harbor(字符终端界面)

(二)、registry私有仓库建立步骤
设立私有仓库后下载镜像时优先寻找私有仓库镜像内容

1.拉取镜像文件

docker pull registry

2.修改docker引擎终端配置
[root@localhost ~]#vim /etc/docker/daemon.json

{
“insecure-registries”: [“192.168.190.11:5000”],
“registry-mirrors”: [“https://45htmp62.mirror.aliyuncs.com”]

/#镜像加速

}
:wq

systemctl restart docker.service

3.创建registry容器并挂载宿主机目录
docker create -it registry /bin/bash
docker ps -a
docker start 84eab70a2490 #这样开启容器会失败

docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry

可以使用该条命令挂载卷,run=pull+create+start

4.更改标识并上传本地的一个镜像文件

docker imagesdocker tag nginx:test 192.168.190.11:5000/nginxdocker push 192.168.190.11:5000/nginx

5.获取镜像列表
curl -XGET http://192.168.190.11:5000/v2/_catalog
---------输出信息----------
[root@localhost ~]#curl -XGET http://192.168.190.11:5000/v2/_catalog
{“repositories”:[“nginx”]}

6.测试私有仓库下载

docker rmi 192.168.190.11:5000/nginx     #删除已有的镜像docker pull 192.168.190.11:5000/nginx       #指定镜像名称

######(一)docker数据卷
挂载到宿主机目录中

格式:docker run -v 宿主机目录:容器内目录 -it 镜像 /bin/bash #目录不存在的话自动创建
docker run -v /var/www:/data1 --name web1 -it centos /bin/bash

[root@d58e644c2f7b /]# cd /data1
[root@d58e644c2f7b data1]# touch test1

######(二)容器数据卷(两个容器的交互目录挂载)
格式:docker run --volumes-from 另外的容器 -it 镜像 /bin/bash

docker run --name web1 -v /data1 -v /data2 -it centos /bin/bash
docker run --name web2 --volumes-from web1 -itd centos /bin/bash

(三)容器互联
在容器和接受容器间建立一条网络通讯隧道

docker run -itd -P --name web1 centos /bin/bash
docker run -itd -P --name web2 --link web1:web1 centos /bin/bash

--------验证-------

进入一个容器ping另一个容器

[root@localhost ~]#docker exec -it 974077bf71df /bin/bash
[root@974077bf71df /]# ping web1
PING web1 (172.17.0.3) 56(84) bytes of data.
64 bytes from web1 (172.17.0.3): icmp_seq=1 ttl=64 time=0.157 ms
64 bytes from web1 (172.17.0.3): icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from web1 (172.17.0.3): icmp_seq=3 ttl=64 time=0.069 ms

##九、docker-compose(容器编排)

(一)、前言
Docker Compose的前身时Fig,Fig被Docker收购之后更名为compose,compose向下兼容Fig
Docker compose是一种用于定义和运用多容器Docker应用的工具,只需要一个compose的配置文件和一个简单的命令就可以创建并运行所用所需的所有容器,而不再需要使用shell脚本来启动容器
Docker Compose 非常适合组合使用多个容器进行开发的场景

1.docker compose的文件结构
YAML是一种标记语言很直观放入数据序列化格式,文件格式及编写注意事项如下所示:

不支持制表符Tab缩进,需要使用空格缩进
通常开头缩进2个空格
字符后缩进1个空格,如冒号(

了解docker及其基本操作相关推荐

  1. docker 镜像基本操作、镜像与容器常用指令

    一,docker 镜像基本操作 导入镜像 导出镜像 启动镜像 # docker pull busybox //下载镜像# docker push busybox //上传镜像# docker imag ...

  2. Docker的基本操作

    Docker的基本操作 2/22/2021 晴 正常 docker的安装: 如果已安装过Docker, 需要移除老版本的Docker sudo apt-get remove docker docker ...

  3. 【微服务】认识Docker及其基本操作

    文章内容来自黑马Java,侵权请联系删除 一.认识Docker Docker是一个快速交付应用.运行应用的技术: 可以将程序及其依赖.运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统 运行 ...

  4. Linux 安装docker,以及docker的基本操作

    一.安装docker Docker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上 1.uname -an 查看当前系统版本 2.yum -y install docker 下 ...

  5. Docker 入门 基本操作

    Docker 快速上手 Docker 简介 Docker 是什么 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不 ...

  6. Docker安装和基本操作

    离线安装Docker系统 第一步:下载docker离线包 https://download.docker.com/linux/static/stable/x86_64/docker-20.10.6.t ...

  7. docker(虚拟化,沙箱(沙盒),简介,docker和vm的区别,安装,基本操作,基本使用) 镜像的操作 容器的操作 使用mysql镜像 使用canda创建虚拟环境

    一.docker 1.概念介绍 虚拟化: 是一种资源的管理技术,将计算机中的实体资源,进行抽象,然后呈现出来,目的是为了打破实体结构之间的不可分割障碍,使用户以更好的组态使用资源 形象化形容如下: 我 ...

  8. Docker 容器下载 及 基本操作指令

    文章目录 1. Docker 技术简介 Docker 核心对象 镜像(Image) 容器(Container) Docker 应用架构分析 架构图 Docker运行机制 2. Docker安装 准备工 ...

  9. docker mysql详解_Docker轻松入门(详解)

    一 Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

最新文章

  1. oracle忘记密码
  2. ITK:Mersenne Twister随机整数生成器
  3. Aop和Filter区别
  4. 实用JavaScript网页特效编程百宝箱pdf
  5. linux windows爆音,升级Windows 10后 部分情况下有爆音,杂音,音频卡顿现象
  6. HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)
  7. 【Task5(2天)】模型调参
  8. 如果不是没有钱,谁想测3个重复?
  9. java 字符串面试_Java字符串面试问答
  10. 最新友情链接交易平台源码,友链源码,友情链接,友链平台仿alivv爱链网源码下载
  11. Qt学习之路八——利用qt对数据库进行操作
  12. 缺少计算机所需的介质程序,win10系统UEFi安装提示“缺少计算机所需的介质驱动程序”的图文方案...
  13. 鉴频鉴相器(PFD)不同结构讨论
  14. 【清除office待激活密钥】
  15. 鸿蒙系统王维,以少总多,意余于象——王维《终南山》赏析
  16. 流媒体后视镜方案关键技术--调节后视图像显示范围
  17. 使用JohnTheRipper对有密码加密的ZIP压缩包文件进行暴力破解
  18. 460.LFU 缓存
  19. win10环境下c语言打开文件失败,cfile fopen fopen_s win10下打开文件失败
  20. 大学生生涯职业规划计算机专业,大学生职业生涯规划书计算机专业范文

热门文章

  1. 阿里云服务器 实现二级域名并对应不同项目 即 不同目录
  2. 三国杀正在连接服务器请稍后,三国杀名将传游戏出现无法连接服务器怎么处理 处理方案一览...
  3. [附源码]计算机毕业设计JAVAjsp旅游景点管理系统
  4. R语言中进行期权定价的Heston模型
  5. 做自媒体短视频,做好了这8点,你每天也可以收益200+
  6. 阿里双十一大屏六年路
  7. Android 添加背景音乐代码实现,以及创建音频文件夹
  8. 国王的许诺 相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第1个格子中
  9. c语言程序的执行过程压栈,汉诺塔---手写出栈压栈过程实现
  10. 零基础无实物一步一步学PLCS7-1200仿真(七)-led灯闪烁-定时器或系统时钟