Docker容器

一、Docker基本知识

Docker的介绍

宿主机
容器其实是一种沙盒技术。沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。

容器的本质

容器的本质是进程

容器的镜像本质就是安装包

Docker的特点

  1. 占用资源少(内存、CPU)
  2. 大小相对较小
  3. 对基础环境几乎没有依赖性

Docker对服务器端开发/部署带来的变化

方便快速部署

对于部署来说可以极大的减少部署的时间成本和人力成本

Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念是 Build once, Run anywhere(一次构建,多次部署)

  1. 标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
  2. 节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;
  3. 方便构建基于微服务架构的系统,通过服务编排,更好的松耦合;
  4. 节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;

容器和VM的主要区别

表面区别:

  1. 容器占用体积小,虚拟机占用体积大
  2. 隔离性:容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。
  3. 启动速度:虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。
  4. 容器使用宿主操作系统的内核,而虚拟机使用独立的内核。Docker 的局限性之一是,它只能用在64位的操作系统上。

本质区别:

  1. 容器是被隔离的进程

Docker 的优势

1、交付物标准化

Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。

2、应用隔离

Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。

Docker可以隔离不同应用程序之间的相互影响,比虚拟机开销更小。总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本.

3、一次构建,多次交付

Docker可以隔离不同应用程序之间的相互影响,比虚拟机开销更小。总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本.

类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。

Docker的度量:

Docker是利用容器来实现的一种轻量级的虚拟技术,从而在保证隔离性的同时达到节省资源的目的。Docker的可移植性可以让它一次建立,到处运行。Docker的度量可以从以下四个方面进行:

1)隔离性

类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。

Docker的度量:

Docker是利用容器来实现的一种轻量级的虚拟技术,从而在保证隔离性的同时达到节省资源的目的。Docker的可移植性可以让它一次建立,到处运行。Docker的度量可以从以下四个方面进行:

通过内核的命名空间来实现的,将容器的进程、网络、消息、文件系统和主机名进行隔离。

2)可度量性

Docker主要通过cgroups控制组来控制资源的度量和分配。

3)可移植性

Docker利用AUFS来实现对容器的快速更新。

AUFS是一种支持将不同目录挂载到同一个虚拟文件系统下的文件系统,支持对每个目录的读写权限管理。AUFS具有层的概念,每一次修改都是在已有的只写层进行增量修改,修改的内容将形成新的文件层,不影响原有的层。

4)安全性

安全性可以分为容器内部之间的安全性;容器与托管主机之间的安全性。

容器内部之间的安全性主要是通过命名空间和cgroups来保证的。

容器与托管主机之间的安全性主要是通过内核能力机制的控制,可以防止Docker非法入侵托管主机。

Docker容器使用AUFS作为文件系统,有如下优势:

1)节省存储空间

多个容器可以共享同一个基础镜像存储。

2)快速部署

3)升级方便

升级一个基础镜像即可影响到所有基于它的容器。需要注意已经在运行的docker容器不受影响

二、Docker的安装

Docker版本

moby docker-ee docker-ce

moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品

docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品

docker-ee是docker公司维护的闭源产品,是docker公司的商业产品

官方源安装

1.yum 源下载
wget https://download.docker.com/linux/centos/docker-ce.repo

mv docker-ce.repo /etc/yum.repos.d

yum install -y docker-ce

2.rpm 下载
 wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
 
 yum localinstall docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm


 tips:
 https://www.docker.com/community-edition查看最新版如何安装

国内aliyun安装

阿里云地址:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

卸载docker

yum remove docker -y \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

一些安装以后验证命令

1.启动服务
systemctl start docker
systemctl enable docker

2.查看版本状态
docker -v
docker version

3.查看docker运行状态
docker info

三、国内镜像源

Json文件配置国内docker源

1.编辑daemon.json文件
vim /etc/docker/daemon.json
内容:
{
    "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com",
        "https://ccr.ccs.tencentyun.com"
        "https://qnnmswj8.mirror.aliyuncs.com",
        "https://do.nark.eu.org",
        "https://dc.j8.work",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn"
    ]
}

2.启动加载
systemctl daemon-reload
systemctl start docker

DaoCloud

官方网站:https://daocloud.io/

Aliyun

官方网站:容器镜像服务_镜像构建_镜像授权_镜像托管-阿里云

TencentCloud

官方网站:腾讯云 产业智变·云启未来 - 腾讯

四、docker基本概念

Docker系统化

Docker系统有两个程序:docker服务端和docker客户端

Docker服务端:是一个服务进程,管理着所有的容器。也叫docker engine

Docker客户端:扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程

docker服务端和客户端运行在一台机器上

Docker三大组件

Docker 仓库 - Docker  registery

Docker 镜像 - Docker  images

Docker 容器 - Docker  containers
  • Docker仓库

用来保存镜像,有公有和私有仓库,共有仓库DockerHub

docker公有仓库
docker.io -------docker官方库也叫docker-hub
类似于github一样,面向全球的一个docker镜像的公共仓库。如果在国内使用速度太慢。

docker私有仓库
个人或者公司部署的非公开库

registry/repository:tag

  • Docker镜像

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成

1.docker特点
Docker 使用  UnionFS 来将这些层联合到单独的镜像中
docker 轻量级
改变镜像升级不用替换整个原先的镜像或者重新建立,只是一个新的层被添加或升级了
镜像是无状态的
镜像名称:仓库名称+镜像分类+tag名称(镜像版本)

2.镜像
镜像本身:是由一层一层的镜像合在一起的,最底层的镜像我们称为基础镜像,在这个基础镜像的基础上还可以在做镜像,在做的镜像称为子镜像,对于子镜像来讲在谁的基础之上做的就是父镜像。
基础镜像:一个没有任何父镜像的镜像,谓之基础镜像
  • Docker容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、启动、停止、移动、删除、暂停(挂起)。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行一部分。

容器的三大组成要素

名称空间  namespace  容器隔离(pid,net,mnt,user,hostname...)

资源限制  cgroups  资源(内存,cpu)

文件系统  overlay2(UnionFS)

Docker镜像名

Registry、 Repository、 Image

Registry存储镜像数据提供拉取和上传镜像的功能

Repository来组织Registry中镜像

Image是在Repository中的

Image[:tag]

五、docker的基本管理

镜像管理

1.搜索镜像
docker  search  [镜像名称]                    搜索官方镜像库的某个镜像
docker  search  [镜像名称]  -f [条件]         搜索官方镜像库的某个镜像根据一些条件


2.拉取镜像
docker  pull  [镜像名称]:[镜像版本号]          拉取对应版本号的镜像,默认为latest版本
docker  pull  [镜像源的路径]                 


3.查看镜像
docker  image  list                           查看仓库所有镜像源
docker  images                              
docker  images  -q                            查看所有镜像源ID
docker  inspect  [镜像ID/镜像名称]             查看镜像的详细信息
docker  history  [镜像ID/镜像名称]             查看镜像制作过程
                                       

4.删除镜像
docker  rmi      [镜像ID/镜像名称/镜像源的路径] 删除一个或多个镜像源 
docker  rmi  -f  [镜像ID/镜像名称/镜像源的路径] 可以删除正在运行的镜像源
docker  rmi  `docker  images  -q`              删除全部镜像源

容器管理

1.创建容器
docker  create  -it [镜像名称]:[版本号]  /bin/bash                      创建但不启动


2.容器运行
docker  run  --name [容器名称]  -it [镜像名称]:[版本号]    /bin/bash     自定义名称启动
docker  run  --restart=always  -it  [镜像名称]:[版本号]   /bin/bash      创建并运行一个新Docker 容器:同一个镜像可以启动多个容器,每次执行run子命令都会运行一个全新的容器
docker run   -dit  [镜像名称]:[版本号]   /bin/bash
tips:
-i:标准输入输出
-t:分配一个终端或控制台
--restart=always:容器随docker engine自启动,因为在重启docker的时候默认容器都会被关闭   
也适用于create选项
-d	后台运行容器,并返回容器ID
--rm:默认情况下,每个容器在退出时,它的文件系统也会保存下来.另一方面,也可以保存容器所产生的数据。但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。这个时候就需要--rm参数了。
--name:给容器命名,否则随机取名


3.查看容器
docker ps -a    查看所有容器无论是否运行
docker ps       查看正在运行的容器
docker ps -a -q 查看所有容器id


4.启动容器
docker  start   [容器名称/ID]
docker  restart [容器名称/ID]

5.关闭容器
docker  stop  [容器名称/ID]
docker  kill  [容器名称/ID]
docker  kill  $(docker ps  -q)     关闭所有正在运行的容器
docker  stop  `docker ps  -q`      


6.删除容器
docker  rm  [容器名称/ID]
docker rm $(docker ps -qf status=exited) 按照格式过滤删除所有容器
-f:过滤


8.与容器断开连接
exit               断开容器连接,关闭容器
Ctrl + p + q       断开容器连接,不关闭容器

9.查看容器详细信息
docker  inspect  [容器名称/ID]            查看一个正在运行的容器的详细信息

10.修改容器名称
docker  rename  [旧容器名]  [新容器名]


11.启动中的容器进入Bash界面
docker  exec  -it  [容器名称/ID]   /bin/bash
docker attach [容器名称/ID]        前提是创建了shell界面


12.动态显示容器资源使用统计信息的实时流
docker stats

13.容器和宿主机之间拷贝文件目录
docker  cp  [参数]   [容器ID/名称]:[文件路径]   [主机文件目录路径]            容器----->主机   
docker  cp  [参数]   [主机文件目录路径]         [容器ID/名称]:[文件路径]      主机----->容器

六、Docker容器镜像打包

容器打包和导入

概念:将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件

1.正在运行的容器打包
docker  export  -o  [主机要打包的路径]   [容器id/容器名称]
docker  export  容器名称 > [主机打包路径]/镜像.tar

2.导入镜像文件
docker import  镜像.tar  [Image]:[tag]

通过容器创建本地镜像

容器运行起来后,又在里面做了一些操作,并且要把操作结果保存到镜像里

docker  commit  [正在运行的容器ID/名称]  [Image]:[tag]
tips:
-m                           添加注释
-a                           作者
-p,–pause=true              提交时暂停容器运行

镜像前迁移

save:
docker  save  -o  nginx.tar  [镜像名称]
load:
docker  load  <  [Image].tar

前三项总结

把容器导出成tar包 export   import 

把容器做成镜像  commit  -a "" -m ""

把镜像保存为tar包 save    load

通过DockerFile创建镜像

Dockerfile构建
1.创建存放Dockerfile的目录
mkdir  /[Dockerfile存放目录]

2.编写Dockerfile
vim   /[Dockerfile存放目录]/Dockerfile
构建镜像语法
docker  build  [参数]  [Path]

tips:
参数:
--build-arg,设置构建时的变量
--no-cache,默认false。设置该选项,将不使用Build Cache构建镜像
--pull,默认false。设置该选项,总是尝试pull镜像的最新版本
--compress,默认false。设置该选项,将使用gzip压缩构建的上下文
--disable-content-trust,默认true。设置该选项,将对镜像进行验证
--file, -f,Dockerfile的完整路径,默认值为‘PATH/Dockerfile’
--isolation,默认--isolation="default",即Linux命名空间;其他还有process或hyperv
--label,为生成的镜像设置metadata
--squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image。
--tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
--network,默认default。设置该选项,Set the networking mode for the RUN instructions during build
--quiet, -q ,默认false。设置该选项,Suppress the build output and print image ID on success
--force-rm,默认false。设置该选项,总是删除掉中间环节的容器
--rm,默认--rm=true,即整个构建过程成功后删除中间环节的容器
常用 -t

Path--->只能够寻找到的Dockerfile文件的路径
Dockerfile语法详解

Dockerfile 指令

说明

FROM

指定基础镜像,用于后续的指令构建。

MAINTAINER

指定Dockerfile的作者/维护者。

LABEL

添加镜像的元数据,使用键值对的形式。

RUN

在构建过程中在镜像中执行命令。

CMD

指定容器创建时的默认命令。(可以被覆盖)

ENTRYPOINT

设置容器创建时的主要命令。(不可被覆盖)

EXPOSE

声明容器运行时监听的特定网络端口。

ENV

在容器内部设置环境变量。

ADD

将文件、目录或远程URL复制到镜像中。

COPY

将文件或目录复制到镜像中。

VOLUME

为容器创建挂载点或声明卷。

WORKDIR

设置后续指令的工作目录。

USER

指定后续指令的用户上下文。

ARG

定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。

ONBUILD

当该镜像被用作另一个构建过程的基础时,添加触发器。

STOPSIGNAL

设置发送给容器以退出的系统调用信号。

HEALTHCHECK

定义周期性检查容器健康状态的命令。

SHELL

覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。

部署私有仓库

1.docker拉取registery镜像
docker  pull  registery:latest


2.宿主机和docker容器挂载registry
docker  run  --name [容器名称]  --restart=always   -itd  -v [主机目录]:/var/lib/registry -p 5000:5000  [Image]:[tag]


3.docker 查看5000端口
netstat -tnpl


4.查看是否能连通并查看仓库
curl  http://[宿主机ip地址]:5000/v2/_catalog


5.给镜像tag
docker  tag  [Image]:[tag]  [宿主机ip地址]:5000/[Image]:[tag]


6.推送给仓库
docker  push  [宿主机ip地址]:5000/[Image]:[tag]

tips:
The push refers to repository [192.168.252.145:5000/nginx]
Get "https://192.168.252.145:5000/v2/": http: server gave HTTP response to HTTPS client
解决方案:
1.启动解决
vim /usr/lib/systemd/system/docker.service
添加:ExecStart的参数后面增加  --insecure-registry [宿主机ip地址]:5000

2.添加json配置文件可信源
vim /etc/docker/daemon.json

{
  ...,
  "insecure-registries":["192.168.246.141:5000"]
}

七、Docker资源限制

八、Docker网络

Docker网络分类

1.host

docker容器和宿主机使用一个ip地址,当使用host网络创建docker容器的时候容器的ip地址与主机一致。

2.bridge

默认情况下启动、创建容器都是用该模式,所以每次docker容器重启时会按照顺序获取对应ip地址

3.none

启动容器时,可以通过 --network=none,docker容器不会分配局域网ip

Docker网络操作

1.创建自定义的网络类型,并且指定网段
docker  network  create  --subnet=[ip地址]/16  [网络名称]


2.查看网络类型
docker  network  list


3.创建并运行新的网络类型
docker  run  -itd --name [容器名称]  --net [网络名称]  --ip [属于网络名称的网段上的ip地址]   [Image]:[tag]


4.删除已经创建的网络
前提:需要删除使用当前网络的容器。才能删除网络
docker  network  rm  [网络名称]

Docker异主容器互联

open vswitch

九、Docker-Compose

Docker安装

pip3安装
yum -y install epel-release              安装epel源
yum -y install python3-pip               安装python的pip3
pip3 install --upgrade pip               更新pip到最新版
pip3 install docker-compose              pip3安装docker-compose

docker-compose --version                  测试查看版本
二进制安装
github:
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
daocloud:
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.5.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose

Docker-compose测试

测试模块
└── compose_test
    ├── docker
    │   └── docker-compose.yml
    ├── Dockerfile
    └── src
        ├── app.py
        └── requirements.txt
准备
1.创建工作目录
mkdir  /compose_test
mkdir  -p  /compose_test/docker
mkdir  -p  /compose_test/src

2.创建文件并配置
app.py:

vim /compose_test/src/app.py
from flask import Flask
from redis import Redis
 
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
 
@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.\n'.format(count)
 
if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)


requirements.txt:

vim /compose_test/src/requirements.txt
flask
redis

Dockerfile:

vim /compose_test/Dockerfile
FROM python:3.7
COPY src/ /opt/src
WORKDIR /opt/src
RUN pip install -r requirements.txt
CMD ["python", "app.py"]


Docker-compose:

vim /compose_test/docker/docker-compose.yml

version: '3'
services:
  web:
    build: ../
    ports:
     - "5000:5000"
  redis:
    image: redis:3.0.7

启动测试

docker-compose up                    #不在后台运行
docker-compose up -d                 #后台运行
docker-compose -f server.yml up -d   #指定文件名进行运行后台方式

Docker常用服务配置参考

顶级属性
version  services  networks  volumes  configs  secrets
version

启动版本,已经弃用

networks

用于定义和创建应用中所使用到的所有网络。其下包含的 第一级属性即为网络名称,这个网络名称可以随意命名。而在网络名称下还可包含很多的属 性

services:
  app:
    networks:
      - app_bridge: #这里使用的并不是网络名称
networks:
  app_bridge:
    name: appBGnet # 这才是网络名称
    driver: bridge

tips:
name        第一级属性—网络名称,并不是真正的网络名称,而仅仅是网络名称的一部分。在真正生成网络后,其真正的网络名称格式为:[当前 compose 文件所在目录名]_[name]
driver      指定网络驱动,缺省驱动为 Bridge
attachable  属性设置为 true,则除了当前 compose 中定义的服务外,其它独立容器也可以连接到此网络,并能与该网络中的服务及也连接到该网络的其它独立容器通信。缺省状态为false。
serivces

一个顶级属性,用于定义一个应用中所包含的服务。Docker Compose 会将每

个服务部署在各自的容器中。其下包含的第一级的属性即为服务名称,这个名称可以根据服

务内容随意命名。

volumes

volumes 作为一个顶级属性,用于定义和创建应用中所使用到的所有 volume。其下包含

的第一级属性即为 volume 的卷标,这个卷标可以随意命名。这个卷标所代表的是当前 Docker

主机中的目录,至于该目录的具体位置,是由系统自动分配的。

Services下的属性
Build

build 可以指定包含构建上下文的路径

案例

文件结构

docker/
├── dir
│   ├── Dockerfile
│   └── index.html
└── docker-compose.yml

制作

1.制作Dockerfile
vim /test/docker/dir/Dockerfile

FROM centos:7
MAINTAINER "youngfit"
WORKDIR /usr/local/src/
ENV NG_VERSION nginx-1.21.0
RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum -y install epel-release &&  yum -y install wget && wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz && yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
RUN yum clean all
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/$NG_VERSION
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
ADD ./index.html /usr/local/nginx/html
VOLUME /usr/local/nginx/html
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80/tcp
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]

2.制作index.html
vim /test/docker/dir/index.html

sunyuhao

3.制作docker-compose
vim /test/docker/docker-compose.yaml

version: '2'
services:
  webapp:
    build: 
      context: ./dir # webapp服务将会通过./dir目录下的Dockerfile文件构建容器镜像。 

4.启动
docker-compose  up  -d

tips:
build:
  context: [指定构建目录]                                   #webapp会通过这个目录进行构建镜像
  dockerfile: [指定目录下的Dockerfile的名称]                #指定构建镜像的文件名
  arges:
    - [arge1]=[值]
    - [arge2]=[值]      																	 #指定Dockerfile中的引用的参数值
    ...

Image

指定启动容器的镜像,可以是镜像仓库/标签或者镜像id(或者id的前一部分)

示例

version: '2'
services:
  webapp:
    image: [镜像名称:tag/镜像ID/镜像名称]
    build:
      context: ./dir
tips:
镜像必须是已经pull过的镜像在docker images中的
如果镜像不存在,Compose将尝试从官方镜像仓库将其pull下来,如果你还指定了build,在这种情况下,它将使用指定的build选项构建它,并使用image指定的名字和标记对其进行标记
Container_name

指定一个自定义容器名称,而不是生成的默认名称。

示例

version: '2'
services:
  webapp:
    image: httpd
    build:
      context: ./dir
    container_name: httpd_web   #指定容器名称
tips:
指定容器名称后不会使用默认自动生成的镜像名称
Volumes

卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro),挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读。
你可以在主机上挂载相对路径,该路径将相对于当前正在使用的Compose配置文件的目录进行扩展。 相对路径应始终以 . 或者 .. 开始。

volumes:
  # 指定一个路径,让引擎创建一个卷
  - /var/lib/data
  # 指定绝对路径映射
  - /opt/data:/var/lib/data
  # 相对于当前compose文件的相对路径
  - ./cache:/tmp/cache
  # 用户家目录相对路径
  - ~/configs:/etc/configs/:ro       指定卷的权限
  # 命名卷
  - datavolume:/var/lib/mysql

tips:
volumes:
  - [宿主机路径]:[容器路径]
Command

用于覆盖 Dockerfile 中的 CMD 指令内容,即启动该服务容器后立即运行的命令。如果 直接按照Dockerfile中的CMD指令内容执行即可,则compose文件中无需该command属性

version: '3'
services:
  myservice:
    image: myimage:latest
    command: [命令] && [命令]
tips:
添加这个选项将不执行Dockerfile中的CMD命令,启动完后立即执行的命令
Links

链接到另一个服务中的容器。 请指定服务名称和链接别名(SERVICE:ALIAS),或者仅指定服务名称

version: "3"
services:
  web1:
    build: ./dir1
    links:                      #链接各个容器
      - web2
      - web3
  web2:
    build: ./dir2
  web3:
    build: ./dir3
Depends_on

一个列表。用于指定当前服务的启动所依赖的应用名称。即列表中指定的服务会先启动

前服务启动。

depends_on:                      
  - server1
  - server2          #基于哪个应用或服务启动
External_links

链接到docker-compose.yml 外部的容器,甚至并非 Compose 管理的容器。参数格式跟 links 类似

external_links:
 - redis
 - mysql
 - nginx
Expose

暴露端口,但不映射到宿主机,只被连接的服务访问。 仅可以指定内部端口为参数

expose:
 - "6379"
 - "3306"
Ports

前面为暴露出的端口号,后面为容器中应用的端口号。如果仅设置了一个端

口号,那么这个端口号是容器中应用的端口号,其暴露到宿主机的端口号会被随机分配

ports:
 - 80:80        # 绑定容器的 80 端口到主机的 80 端口
 - 9000:80      # 绑定容器的 80 端口到主机的 9000 端口
 - 443          # 绑定容器的 443 端口到主机的任意端口,容器启
Restart

no是默认的重启策略,在任何情况下都不会重启容器。 指定为always时,容器总是重新启动。 如果退出代码指示出现故障错误,则on-failure将重新启动容器。

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
Environment

配置docker的环境变量

 environment:
      username: root
      password: @Syh2025659
tips:
给定名称的变量会自动获取它在 Compose 主机上的值
如果你的服务指定了build选项,那么在构建过程中通过environment定义的环境变量将不会起作用。 将使用build的args子选项来定义构建时的环境变量。
Dns

指定容器的DNS

dns:
  - 8.8.8.8
  - 1.1.1.1

Docker-compose的命令

docker-compose pull [服务名称]         # 拉取 compose 中服务依赖的全部镜像或指定镜像
docker-compose config -q              # 检查 compose 文件是否正确,-q表示只有存在问题时才有输出
docker-compose up -d                  # 启动 compose 中的所有容器。-d 选项表示后台启动。
docker-compose logs   [服务名称]       # 查看 comopse 中所有服务或指定服务的运行日志                
docker-compose ps     [服务名称]       # 列出 compose 中所有服务或指定服务
docker-compose top    [服务名称]       # 列出 compose 中当前正在运行的所有服务或指定服务
docker-compose images [服务名称]       # 列出 compose 中所有服务或指定服务对应的镜像
docker-compose port                   # 列出指定服务容器的指定端口所映射的宿主机端口
docker-compose run                    # 在指定服务上执行一条命令 
docker-compose exec   [服务名称]       # 进入指定服务容器                  
docker-compose pause  [服务名称]       # 暂停 compose 中所有服务容器或指定服务容器
docker-compose unpause [服务名称]      # 恢复 compose 中处于暂停状态的所有服务容器或指定服务容器
docker-compose stop   [服务名称]       # 停止 compose 中所有服务容器或指定服务容器
docker-compose restart[服务名称]       # 重启 compose 中所有服务容器或指定服务容器
docker-compose start  [服务名称]       # 启动 compose 中所有服务容器或指定服务容器
docker-compose kill                   # 通过发送 SIGKILL 信号停止指定服务的容器。
docker-compose rm     [服务名称]       # 删除 compose 中的、处于停止状态的所有服务容器或指定服务容器                   
docker-compose down   [服务名称]       # 停止并删除 compose 中的所有服务容器、网络、镜像、数据卷

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值