一、Docker基本知识
Docker的介绍
宿主机
容器其实是一种沙盒技术。沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。
容器的本质
容器的本质是进程
容器的镜像本质就是安装包
Docker的特点
- 占用资源少(内存、CPU)
- 大小相对较小
- 对基础环境几乎没有依赖性
Docker对服务器端开发/部署带来的变化
方便快速部署
对于部署来说可以极大的减少部署的时间成本和人力成本
Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念是 Build once, Run anywhere(一次构建,多次部署)
- 标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
- 节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;
- 方便构建基于微服务架构的系统,通过服务编排,更好的松耦合;
- 节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;
容器和VM的主要区别
表面区别:
- 容器占用体积小,虚拟机占用体积大
- 隔离性:容器提供了基于进程的隔离,而虚拟机提供了资源的完全隔离。
- 启动速度:虚拟机可能需要一分钟来启动,而容器只需要一秒钟或更短。
- 容器使用宿主操作系统的内核,而虚拟机使用独立的内核。Docker 的局限性之一是,它只能用在64位的操作系统上。
本质区别:
- 容器是被隔离的进程
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 中的所有服务容器、网络、镜像、数据卷