1. Docker概述
1.1. Docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依靠包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 呆板上,也可以实现虚拟化。容器是完全利用沙箱机制,相互之间不会有任何接口(雷同 iPhone 的 app),更紧张的是容器性能开销极低。即:Docker是一种容器技术,办理软件跨环境迁徙的题目。
Docker应用场景
- Web 应用的自动化打包和发布
- 自动化测试和一连集成、发布
- 在服务型环境中部署和调整数据库或其他的后台应用
利用Docker可以实现开发人员的开发环境、测试人员的测试环境、运维人员的生产环境的一致性。
Docker鉴戒了标准集装箱的概念。标准集装箱将货品运往世界各地,Docker将这个模子运用到自己的设计中,唯一差别的是:集装箱运输货品,而Docker运输软件。
1.2. Docker容器与传统虚拟机比较
- 传统虚拟机
传统虚拟机技术基于安装在主操纵体系上的虚拟机管理体系(如:VirtualBox和VMWare等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操纵体系,在从操纵体系中安装部署各种应用。
- Docker
Docker容器是在操纵体系层面上实现虚拟化,直接复用本地主机的操纵体系,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker上风体现为启动速率快、占用体积小。
1.3. Docker构成部门
名称
说明
Docker 镜像(Images)
Docker 镜像是用于创建 Docker 容器的模板。 镜像是基于联合文件体系的一种层式布局,由一系列指令一步一步构建出来。
Docker 容器(Container)
容器是独立运行的一个或一组应用。镜像相称于类,容器相称于类的实例
Docker 客户端(Client)
Docker 客户端通过下令行或者其他工具利用 Docker API 与 Docker 的守护进程通信。
Docker 主机(Host)
一个物理或者虚拟的呆板用于执行 Docker 守护进程和容器。
Docker守护进程
是Docker服务器端进程,负责支持Docker 容器的运行以及镜像的管理。
Docker 堆栈DockerHub(Registry)
Docker 堆栈用来生存镜像,可以理解为代码控制中的代码堆栈。 Docker Hub提供了巨大的镜像集合供利用。用户也可以将自己本地的镜像推送到Docker堆栈供其他人下载。
2. Docker安装与启动
2.1. Docker安装
Docker可以运行在MAC、Windows、CentOS、DEBIAN、UBUNTU等操纵体系上,提供社区版和企业版,本课程基于CentOS安装Docker。CentOS6对docker支持的欠好,利用docker建议利用CentOS7。
以下是在CentOS7中安装Docker的步调:
- # 1、yum 包更新到最新
- sudo yum update
- # 2、作用:安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依
- 赖的
- sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- # 3、 设置yum源
- # 3.1、方案一:使用ustc的(推荐)
- sudo yum-config-manager --add-repohttp://mirrors.ustc.edu.cn/dockerce/linux/centos/docker-ce.repo
- # 3.2、方案二:使用阿里云(可能失败)
- sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- # 4、 安装docker;出现输入的界面都按 y
- sudo yum install docker-ce
- # 5、 查看docker版本
- docker -v
复制代码 2.2. 设置ustc镜像
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速率很
快。ustc docker mirror的上风之一就是不须要注册,是真正的公共服务。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
- 编辑文件/etc/docker/daemon.json
- # 执行如下命令:
- mkdir /etc/docker
- vi /etc/docker/daemon.json
复制代码 - 在文件中加入下面内容
- {
- "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
- }
复制代码 2.3. Docker启动与停止下令
- # 启动docker服务:
- systemctl start docker
- # 停止docker服务:
- systemctl stop docker
- # 重启docker服务:
- systemctl restart docker
- # 查看docker服务状态:
- systemctl status docker
- # 设置开机启动docker服务:
- systemctl enable docker
复制代码 3. Docker常用下令
3.1. 镜像相干下令
镜像:Docker镜像是由文件体系叠加而成(是一种文件的存储情势);是docker中的焦点概念,可以以为镜像就是对某些运行环境或者软件打的包,用户可以从docker堆栈中下载底子镜像到本地,比如开发人员可以从docker堆栈拉取(下载)一个只包罗centos7体系的底子镜像,然后在这个镜像中安装jdk、mysql、Tomcat和自己开发的应用,最后将这些环境打成一个新的镜像。开发人员将这个新的镜像提交给测试人员举行测试,测试人员只须要在测试环境下运行这个镜像就可以了,这样就可以保证开发人员的环境和测试人员的环境完全一致。
Docker提供的关于镜像的操纵有:
3.1.1. 查看镜像
- # 查看镜像可以使用如下命令:
- docker images
复制代码
- REPOSITORY:镜像名称
- TAG:镜像标签
- IMAGE ID:镜像ID
- CREATED:镜像的创建日期
- SIZE:镜像巨细
3.1.2. 搜索镜像
- # 如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
- docker search 镜像名称
复制代码
- NAME:镜像名称
- DESCRIPTION:镜像形貌
- STARS:用户评价,反应一个镜像的受欢迎程度
- OFFICIAL:是否官方
- AUTOMATED:自动构建,表现该镜像由Docker Hub自动构建流程创建的
3.1.3. 拉取镜像
- # 拉取镜像就是从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本
- 命令如下:
- docker pull 镜像名称
- # 如拉取centos 7;
- docker pull centos:7
复制代码
3.1.4. 删除镜像
- # 可以按照镜像id删除镜像,命令如下:
- docker rmi 镜像id
复制代码
- docker rmi $IMAGE_ID:删除指定镜像
- docker rmi docker images -q:删除所有镜像
3.2. 容器相干下令
容器,也是docker中的焦点概念,容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同Java语言中类和对象的关系。
Docker提供的关于容器的操纵有:
- 查看容器
- 创建容器
- 启动容器
- 停止容器
- 文件拷贝
- 目录挂载
- 查看容器ip地址
- 删除容器
3.2.1. 查看容器
查看正在运行的容器利用下令:docker ps
查看所有容器利用下令:docker ps -a
3.2.2. 创建并启动容器
可以基于已有的镜像来创建和启动容器,创建与启动容器利用下令:docker run
参数说明:
-i:表现运行容器
-t:表现容器启动后会进入其下令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
–name :为创建的容器命名。
-v:表现目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以利用多个-v做多个目录或文件映射。留意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run反面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,假如只加-i -t两个参数,创建后就会自动进去容器)。
-p:表现端口映射,前者是宿主机端口,后者是容器内的映射端口。可以利用多个-p做多个端口映射
3.2.2.1. 交互式容器
以交互式方式创建并启动容器,启动完成后,直接进入当前容器。利用exit下令退出容器。须要留意的是以此种方式启动容器,假如退出容器,则容器会进入停止状态。
- # 先拉取一个镜像;这一步不是每次启动容器都要做的,而是因为前面我们删除了镜像,无镜像可用所以才再拉取一个
- docker pull centos:7
- #创建并启动名称为 mycentos7 的交互式容器;下面指令中的镜像名称 centos:7 也可以使用镜像id
- docker run -it --name=mycentos7 centos:7 /bin/bash
复制代码
3.2.2.2. 守护式容器
创建一个守护式容器;假如对于一个须要恒久运行的容器来说,我们可以创建一个守护式容器。下令如下(容器名称不能重复):
- #创建并启动守护式容器
- docker run -di --name=mycentos2 centos:7
- #登录进入容器命令为:docker exec -it container_name (或者 container_id) /bin/bash(exit退出
- 时,容器不会停止)
- docker exec -it mycentos2 /bin/bash
复制代码
3.2.3. 停止并启动容器
- # 停止正在运行的容器:docker stop 容器名称或者ID
- docker stop mycentos2
- # 启动已运行过的容器:docker start 容器名称或者ID
- docker start mycentos2
复制代码
3.2.4 文件拷贝
- 将linux宿主机中的文件拷贝到容器内可以利用下令:
- # docker cp 需要拷贝的文件或目录 容器名称:容器目录
- # 创建一个文件abc.txt
- touch abc.txt
- # 复制abc.txt到mycentos2的容器的 / 目录下
- docker cp abc.txt mycentos2:/
- # 进入mycentos2容器
- docker exec -it mycentos2 /bin/bash
- # 查看容器 / 目录下文件
- ll
复制代码
- 将文件从容器内拷贝出来到linux宿主机利用下令:
- # docker cp 容器名称:容器目录 需要拷贝的文件或目录
- #进入容器后创建文件cba.txt
- touch cba.txt
- # 退出容器
- exit
- # 在Linux宿主机器执行复制;将容器mycentos2的/cba.txt文件复制到 宿主机器的/root目录下
- docker cp mycentos2:/cba.txt /root
复制代码
留意:容器在停止状态下也可以完成文件的拷贝
3.2.5. 目录挂载
可以在创建容器的时候,将宿主机的目录与容器内的目录举行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器时添加-v参数,后边为宿主机目录:容器目录,比方: docker run -di -v /usr/local/test:/usr/local/test –
name=mycentos3 centos:7
- # 创建linux宿主机器要挂载的目录
- mkdir /usr/local/test
- # 创建并启动容器mycentos3,并挂载linux中的/usr/local/test目录到容器的/usr/local/test;也就是在
- linux中的/usr/local/test中操作相当于对容器相应目录操作
- docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7
- # 在linux下创建文件
- touch /usr/local/test/def.txt
- # 进入容器
- docker exec -it mycentos3 /bin/bash
- # 在容器中查看目录中是否有对应文件def.txt
- ll /usr/local/test
复制代码
留意:假如你共享的是多级的目录,大概会出现权限不敷的提示。 这是因为CentOS7中的安全模块selinux把权限禁掉了,须要添加参数 --privileged=true 来办理挂载的目录没有权限的题目。
3.2.6. 查看容器ip
可以通过以下下令查看容器运行的各种数据 docker inspect 容器名称(容器ID)
- # 在linux宿主机下查看 mycentos3 的ip
- docker inspect mycentos3
复制代码
容器之间在一个局域网内,linux宿主呆板可以与容器举行通信;但是外部的物理机条记本是不能与容器直接通信的,假如须要则须要通过宿主呆板端口的署理。
3.2.7. 删除容器
删除指定的容器:docker rm 容器名称(容器ID) 删除所有容器:docker rm docker ps -a -q
- # 删除容器
- docker rm mycentos7
复制代码
假如容器是运行状态则删除失败,须要停止容器才能删除
4. Docker应用部署
4.1. MySQL部署
4.1.1. 拉取镜像
- # 拉取MySQL 5.7镜像
- docker pull centos/mysql-57-centos7
复制代码
4.1.2. 创建容器
·docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql·
- -p 代表端口映射,格式为 宿主机映射端口:容器运行端口
- -e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的远程登岸密码(假如是在容器中利用root登录的话,那么其密码为空)
创建mysql5.7容器
docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root centos/mysql-
57-centos7
4.1.3. 操纵容器MySQL
- # 拉取MySQL 5.7镜像
- docker exec -it mysql5.7 /bin/bash
- # 登录容器里面的mysql
- mysql -u root -p
复制代码
4.1.4. 远程登录MySQL
- # 查看ip;如果以后要内部连接该mysql,如其他容器中要连接mysql容器的mysql的时候,可以使用如下命令查看Ip
- docker inspect mysql5.7
复制代码
利用Navicat在windows中举行远程登录在docker容器中的mysql。
4.2. Tomcat部署
4.2.1. 拉取镜像
- # 拉取tomcat镜像
- docker pull tomcat
复制代码
4.2.2. 创建容器
- # 创建tomcat容器;并挂载了webapps目录
- docker run -di --name=mytomcat -p 9000:8080 -v
- /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat
- # 如果出现 WARNING: IPv4 forwarding is disabled. Networking will not work.
- #执行如下操作
- # 1、编辑 sysctl.conf
- vi /etc/sysctl.conf
- # 2、在上述打开的文件中后面添加
- net.ipv4.ip_forward=1
- # 3、重启network
- systemctl restart network
复制代码
测试访问宿主机的端标语为9000的 tomcat。地址:http://宿主机ip:9000,也可以往/user/local/tomcat/webapps下部署应用,然后再访问。
4.3. Nginx部署
4.3.1. 拉取镜像
- # 拉取nginx镜像
- docker pull nginx
复制代码 4.3.2. 创建容器
- # 创建nginx容器
- docker run -di --name=mynginx -p 80:80 nginx
复制代码 启动后再宿主机上访问:http://宿主机IP/
4.4. Redis部署
4.4.1. 拉取镜像
- # 拉取redis镜像
- docker pull redis
复制代码 4.4.2. 创建容器
- # 创建redis容器
- docker run -di --name=myredis -p 6379:6379 redis
复制代码 4.4.3. 操纵redis容器
- #进入redis容器
- docker exec -it myredis /bin/bash
- #进入redis安装目录
- cd /usr/local/bin
- #连接redis
- ./redis-cli
复制代码
4.4.4. 远程连接redis
可以利用redis图形界面客户端工具连接redis,端口也是6379。
5. Docker Compose
5.1. Compose简介
5.1.1. 概念
Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的docker应用工具。利用compose,你能通过YMAL文件配置你自己的服务,然后通过一个下令,你能利用配置文件
创建和运行所有的服务。
5.1.2. 构成
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)构成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包罗多个服务,每个服务中定义了容器运行的镜像,参数,依靠。一个服务当中可包罗多个容器实例。
- 服务(service):一个应用的容器,现实上可以包罗若干运行相同镜像的容器实例。每个服务都有自己的名
字、利用的镜像、挂载的数据卷、所属的网络、依靠哪些其他服务等等,即以容器为粒度,用户须要Compose
所完成的任务。
- 项目(project):由一组关联的应用容器构成的一个完成业务单元,在docker-compose.yml中定义。即是
Compose的一个配置文件可以分析为一个项目,Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操纵。
Docker-Compose的工程配置文件默以为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依靠关系的服务及每个服务运行的容器。
利用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到须要多个容器相互配合来完成某项任务的环境。比方:要部署一个Web项目,除了Web服务容器,通常还须要再加上后端的数据库服务容器,甚至还包罗负载均衡容器等。
5.2. 安装与卸载
Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,须要先安装Docker。下面我们以编译好的二进制包方式安装在Linux体系中。
5.2.1. 安装
- curl -L "https://github.com/docker/compose/releases/download/1.24.0/dockercompose-$(
- uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- # 设置文件可执行权限
- chmod +x /usr/local/bin/docker-compose
- # 查看版本信息
- docker-compose -version
复制代码
5.2.2. 卸载
- # 二进制包方式安装的,删除二进制文件即可
- rm /usr/local/bin/docker-compose
复制代码 5.3. Compose常用下令参考
利用Compose前,可以通过执行docker-compose --help|-h来查看Compose基本下令用法。
也可以通过执行docker-compose [COMMAND] --help或者docker-compose --help [COMMAND] 来查看某个具体的利用格式。
可以知道Compose下令的基本的利用格式为:
- docker-compose [-f 参数...] [options] 1 [COMMAND] [ARGS...]
复制代码 下令选项如下:
- -f,–file FILE指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
- -p,–project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。
- -x-network-driver 使用Docker的可拔插网络后端特性(需要Docker 1.9 及以后版本)
- -x-network-driver DRIVER指定网络后端的驱动,默认为bridge(需要Docker 1.9 及以后版本)
- -verbose输出更多调试信息
- -v,–version打印版本并退出
复制代码 Docker Compose常用下令列表如下:
下令
说明
build
构建项目中的服务容器
help
获得一个下令的资助
kill
通过发送SIGKILL信号来欺压停止服务容器
config
验证和查看compose文件配置
create
为服务创建容器。只是单纯的create,还须要利用start启动compose
down
停止并删除容器,网络,镜像和数据卷
exec
在运行的容器中执行一个下令
logs
查看服务容器的输出
pause
暂停一个服务容器
port
打印某个容器端口所映射的公共端口
ps
列出项目中目前的所有容器
pull
拉取服务依靠的镜像
push
推送服务镜像
restart
重启项目中的服务
rm
删除所有(停止状态的)服务容器
run
在指定服务上执行一个下令
scale
设置指定服务运行的容器个数
start
启动已经存在的服务容器
stop
停止已经处于运行状态的容器,但不删除它
top
显示运行的进程
unpause
恢复处于暂停状态中的服务
up
自动完成包罗构建镜像、创建服务、启动服务并关闭关联服务相干容器的一些列操纵
version
打印版本信息
5.3.1. up
格式为:
- docker-compose up [options] [--scale SERVICE=1 NUM...] [SERVICE...]
复制代码 up下令非常强盛,它实行自动完成包罗构建镜像,(重新)创建服务,启动服务,并关联服务相干容器的一些列操纵。链接的服务都将会被自动启动,除非已经处于运行状态。
多数环境下我们可以直接通过该下令来启动一个项目。
选项包罗:
- -d 在后台运行服务容器
- –no-color 不使用颜色来区分不同的服务的控制输出
- –no-deps 不启动服务所链接的容器
- –force-recreate 强制重新创建容器,不能与–no-recreate同时使用
- –no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
- –no-build 不自动构建缺失的服务镜像
- –build 在启动容器前构建服务镜像
- –abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
- -t, --timeout TIMEOUT 停止容器时候的超时(默认为10秒)
- –remove-orphans 删除服务中没有在compose文件中定义的容器
- –scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数
复制代码 5.3.2. ps
格式为:
- docker-compose ps [options] 1 [SERVICE...]
复制代码 列出项目中目前的所有容器。
选项包罗:
5.3.3. stop
格式为:
- docker-compose stop [options] [SERVICE...]
复制代码 停止已经处于运行状态的容器,但不删除它。
选项包罗:
- -t, --timeout TIMEOUT 停止容器时候的超时(默认为10秒)
复制代码 5.3.4. down
格式为:
- docker-compose down [options]
复制代码 停止和删除容器、网络、卷、镜像,这些内容是通过docker-compose up下令创建的. 默认值删除 容器 网络,可以通过指定 rmi 、volumes参数删除镜像和卷。
选项包罗:
- –rmi type 删除镜像,类型必须是: ‘all’: 删除compose文件中定义的所以镜像;‘local’: 删除镜像名为空的
- 镜像
- -v, --volumes 删除已经在compose文件中定义的和匿名的附在容器上的数据卷
- –remove-orphans 删除服务中没有在compose中定义的容器
复制代码 5.3.5. restart
格式为:
- docker-compose restart [options] 1 [SERVICE...]
复制代码 重启项目中的服务。
选项包罗:
- -t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为10秒)
复制代码 5.3.6. rm
格式为:
- docker-compose rm [options] [SERVICE...]
复制代码 删除所有(停止状态的)服务容器。
选项包罗:
- –f, --force 强制直接删除,包括非停止状态的容器
- -v 删除容器所挂载的数据卷
复制代码 5.3.7. start
格式为:
- docker-compose start [SERVICE...]
复制代码 启动已经存在的服务容器。
5.3.8. run
格式为:
- docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE
- [COMMAND] [ARGS...]
复制代码 在指定服务上执行一个下令。
比方:
- docker-compose run ubuntu 1 ping www.baidu.com
复制代码 将会执行一个ubuntu容器,并执行ping www.baidu.com下令。
默认环境下,假如存在关联,则所有关联的服务将会自动被启动,除非这些服务已经在运行中。该下令雷同于启动容器后运行指定的下令,相干卷、链接等都会按照配置自动创建。有两个差别点:
- 给定下令将会覆盖原有的自动运行下令
- 不会自动创建端口,以制止冲突
假如不盼望自动启动关联的容器,可以利用–no-deps选项,比方:
- docker-compose run --no-deps web
复制代码 将不会启动web容器关联的其他容器。
选项包罗:
- -d 在后台运行服务容器
- –name NAME 为容器指定一个名字
- –entrypoint CMD 覆盖默认的容器启动指令
- -e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量
- -u, --user="" 指定运行容器的用户名或者uid
- –no-deps 不自动启动管理的服务容器
- –rm 运行命令后自动删除容器,d模式下将忽略
- -p, --publish=[] 映射容器端口到本地主机
- –service-ports 配置服务端口并映射到本地主机
- -v, --volume=[] 绑定一个数据卷,默认为空
- -T 不分配伪tty,意味着依赖tty的指令将无法运行
- -w, --workdir="" 为容器指定默认工作目录
复制代码 5.3.9. config
格式为:
- docker-compose config [options]
复制代码 验证并查看compose文件配置。
选项包罗:
- –resolve-image-digests 将镜像标签标记为摘要
- -q, --quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
- –services 打印服务名,一行一个
- –volumes 打印数据卷名,一行一个
复制代码 5.3.10. kill
格式为:
- docker-compose kill [options] 1 [SERVICE...]
复制代码 通过发送SIGKILL信号来欺压停止服务容器。 支持通过-s参数来指定发送的信号,比方:通过如下指令发送SIGINT信号:
docker-compose kill -s SIGINT
5.3.11. create
格式为:
- docker-compose create [options] [SERVICE...]
复制代码 为服务创建容器.只是单纯的create,还须要利用start启动compose。
选项包罗:
- –force-recreate 重新创建容器,即使它的配置和镜像没有改变,不兼容–no-recreate参数
- –no-recreate 如果容器已经存在,不需要重新创建. 不兼容–force-recreate参数
- –no-build 不创建镜像,即使缺失
- –build 创建容器前,生成镜像
复制代码 5.3.12. exec
格式为:
- docker-compose exec [options] SERVICE COMMAND [ARGS...]
复制代码 与docker exec 下令功能相同,可以通过service name登岸到容器中。
选项包罗:
- -d 分离模式,后台运行命令.
- –privileged 获取特权.
- –user USER 指定运行的用户.
- -T 禁用分配TTY. By default docker-compose exec分配 a TTY.
- –index=index 当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose
- exec --index=1 web /bin/bash ,web服务中包含多个容器
复制代码 5.4. Compose模版文件
模板文件是利用Compose的焦点,涉及的指令关键字也比较多,大部门指令与docker run 相干参数的寄义都是雷同的。默认的模板文件名称为docker-compose.yml,格式为YAML格式。
比如一个Compose模板文件:
- version: "2"
- services:
- web:
- images: nginx
- ports:
- - "8080:80"
- volumes:
- - /usr/local/abc:/usr/local/cba
- #volumes:
- #networks:
复制代码 Docker Compose的模板文件重要分为3个区域,如下:
- services
服务,在它下面可以定义应用须要的一些服务,每个服务都有自己的名字、利用的镜像、挂载的数据卷、所属的网络、依靠哪些其他服务等等。
- volumes
数据卷,在它下面可以定义的数据卷(名字等等),然后挂载到差别的服务下去利用。
- networks
应用的网络,在它下面可以定义应用的名字、利用的网络范例等等。
Docker Compose常用模板文件重要下令:
指令
功能
build
指定服务镜像Dockerfile所在路径
cap_add,cap_drop
指定容器的内核本领(capacity)分配
command
覆盖容器启动后默认执行的下令
cgroup_parent
指定父cgroup组,意味着将底子该组的资源限制
container_name
指定容器名称。默认将会利用项目名称服务名称序号这样的格式
devices
指定设置映射关系
dns
自定义DNS服务器。可以是一个值,也可以是一个列表
dns_search
配置DNS搜索域。可以是一个值,也可以是一个列表
dockerfile
指定额外编译镜像的Dockerfile文件,可以通过该指令来指定
env_file
从文件中获取环境变量,可以为单独的文件路径或列表
environment
设置环境变量,可以利用数组或字典两种格式
expose
暴露端口
external_links
链接到docker-compose.yml外部的容器,甚至可以黑白Compose管理的外部容器
extra_hosts
指定额外的host名称映射信息
image
指定为镜像名称或镜像ID。假如镜像在本地不存在,Compose将会实行拉取这个镜像
labels
指定服务镜像Dockerfile所在路径
links
链接到其他服务中的容器
log_driver
指定日志驱动范例,雷同于Docker中的–log-driver参数。目前支持三种日志驱动范例:log_driver:“json-file”、log_driver:“syslog”、log_driver:“none”log_opt 日志驱动的相干参数
net
设置网络模式。参数雷同于docker clinet的–net参数一样
pid跟主机体系共享进程命名空间。打开该选项的容器之间,以及容器和宿主机体系之间可以通过进程ID来相互访问和操纵
ports
暴露端口信息
security_opt
指定容器模板标签(label)机制的默认属性(如用户、脚色、范例、级别等)
ulimits
指定容器的ulimits限制值
volumes
数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式(HOST:CONTAINER:ro)
5.5. Compose应用
需求:编写compose模版文件,实现同时启动tomcat、mysql和redis容器。
5.5.1. 编写模版文件
- # 创建文件夹
- mkdir -p /usr/local/mycompose
- #进入文件夹
- cd /usr/local/mycompose
- #创建 docker-compose.yml文件;内容如下
- vi docker-compose.yml
复制代码 docker-compose.yml文件内容如下(文件内容请从 资料配置文件docker-compose.yml 复制):
- version: '3'
- services:
- redis1:
- image: redis
- ports:
- - "6379:6379"
- container_name: "redis1"
- networks:
- - dev
- mysql1:
- image: centos/mysql-57-centos7
- environment:
- MYSQL_ROOT_PASSWORD: "root"
- ports:
- - "3306:3306"
- container_name: "mysql1"
- networks:
- - dev
- web1:
- image: tomcat
- ports:
- - "9090:8080"
- container_name: "web1"
- networks:
- - dev
- - pro
- networks:
- dev:
- driver: bridge
- pro:
- driver: bridge
复制代码 上面我们声明确3个服务;分别是:redis1、mysql1、web1;而且对3个服务都指定了对应的docker 镜像和端口。
5.5.2. 启动
- #启动前最好把docker重启,不然原来的tomcat/mysql/redis容器也是启动状态的话,那么端口会冲突而启动失败
- systemctl restart docker
- cd /usr/local/mycompose
- docker-compose up
- # 如果后台启动则使用如下命令
- docker-compose up -d
- # 若要停止
- docker-compose stop
复制代码 可以查看到下令中,创建了两个自定义的网络(mycompose_dev和mycompose_pro),然后创建容器,并「Attaching to …」,将网络应用到服务上。
可以查看一下具体的网络,利用docker network ls 如下:
查看启动的容器:
5.5.3. 测试
在windows下访问启动的3个服务举行测试都可以;如下面访问9090的tomcat如下:
6. 迁徙与备份
其中涉及到的下令有:
- docker commit 将容器生存为镜像
- docker save 将镜像备份为tar文件
- docker load 根据tar文件恢复为镜像
6.1. 将Docker容器生存为镜像
利用docker commit下令可以将容器生存为镜像。
下令情势:docker commit 容器名称 镜像名称
- # 保存nginx容器为镜像
- docker commit mynginx mynginx
复制代码 此镜像的内容就是当前容器的内容,接下来你可以用此镜像再次运行新的容器
6.2. 镜像备份
利用docker save下令可以将已有镜像生存为tar 文件。
下令情势:docker save –o tar文件名 镜像名
- # 保存镜像为文件
- docker save -o mynginx.tar mynginx
复制代码
6.3. 镜像恢复与迁徙
利用docker load下令可以根据tar文件恢复为docker镜像。
下令情势:docker load -i tar文件名
- # 停止mynginx容器
- docker stop mynginx
- # 删除mynginx容器
- docker rm mynginx
- # 删除mynginx镜像
- docker rmi mynginx
- # 加载恢复mynginx镜像
- docker load -i mynginx.tar
- # 在镜像恢复之后,基于该镜像再次创建启动容器
- docker run -di --name=mynginx -p 80:80 mynginx
复制代码
留意:在执行docker load下令恢复镜像时,须要先删除原镜像。
7. Dockerfile文件
7.1. 什么是Dockerfile文件
前面的课程中已经知道了,要获得镜像,可以从Docker堆栈中举行下载。那假如我们想自己开发一个镜像,那该如何做呢?答案是:Dockerfile
Dockerfile其实就是一个文本文件,由一系列下令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的形貌来构建镜像。
Dockerfile文件内容一样平常分为4部门:
- 底子镜像信息
- 维护者信息
- 镜像操纵指令
- 容器启动时执行的指令
7.2. Dockerfile常用下令
7.3. 利用Dockerfile创建镜像
- # 1、创建目录
- mkdir –p /usr/local/dockerjdk8
- cd /usr/local/dockerjdk8
- # 2、下载jdk-8u202-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
- # 3、在/usr/local/dockerjdk8目录下创建Dockerfile文件,文件内容如下:
- vi Dockerfile
- FROM centos:7
- MAINTAINER ITCAST
- WORKDIR /usr
- RUN mkdir /usr/local/java
- ADD jdk-8u202-linux-x64.tar.gz /usr/local/java/
- ENV JAVA_HOME /usr/local/java/jdk1.8.0_202
- ENV JRE_HOME $JAVA_HOME/jre
- ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
- ENV PATH $JAVA_HOME/bin:$PATH
- # 4、执行命令构建镜像;不要忘了后面的那个 .
- docker build -t='jdk1.8' .
- # 5、查看镜像是否建立完成
- docker images
复制代码
7.4. 基于镜像创建容器
基于刚刚创建的镜像 jdk1.8 创建并启动容器举行测试;
- # 创建并启动容器
- docker run -it --name=testjdk jdk1.8 /bin/bash
- # 在容器中测试jdk是否已经安装
- java -version
复制代码
8. Docker私有堆栈
8.1. 私有堆栈搭建与配置
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的堆栈,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,偶然候我们的服务器无法访问互联网,或者你不盼望将自己的镜像放到公网当中,那么我们就须要搭建自己的私有堆栈来存储和管理自己的镜像。
私有堆栈搭建步调:
- # 1、拉取私有仓库镜像
- docker pull registry
- # 2、启动私有仓库容器
- docker run -di --name=registry -p 5000:5000 registry
- # 3、打开浏览器 输入地址http://宿主机ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库
- 搭建成功
- # 4、修改daemon.json
- vi /etc/docker/daemon.json
- # 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将宿主机ip修改为自己宿主
- 机真实ip
- {"insecure-registries":["宿主机ip:5000"]}
- # 5、重启docker 服务
- systemctl restart docker
- docker start registry
复制代码
8.2. 将镜像上传至私有堆栈
操纵步调:
- # 1、标记镜像为私有仓库的镜像
- docker tag jdk1.8 宿主机IP:5000/jdk1.8
- # 2、再次启动私有仓库容器
- docker restart registry
- # 3、上传标记的镜像
- docker push 宿主机IP:5000/jdk1.8
- # 4、输入网址查看仓库效果
复制代码
8.3. 从私有堆栈拉取镜像
8.3.1. 私有堆栈所在服务器拉取镜像
假如在私有堆栈所在的服务器上去拉取镜像;那么直接执行如下下令:
- # 因为私有仓库所在的服务器上已经存在相关镜像;所以先删除;请指定镜像名,不是id
- docker rmi 服务器ip:5000/jdk1.8
- #拉取镜像
- docker pull 服务器ip:5000/jdk1.8
- #可以通过如下命令查看 docker 的信息;了解到私有仓库地址
- docker info
复制代码
执行 docker info 下令之后显示内容:
在堆栈所在服务器上去拉取镜像是比较少有的操纵;作为了解即可。
8.3.2. 其它服务器拉取私有堆栈镜像
大多数环境下,都是某台服务器部署了私有镜像堆栈之后;到其它服务器上从私有堆栈中拉取镜像,若要拉取私有堆栈镜像须要去修改docker的配置文件,设置启动时候的堆栈地址。
- # 打开配置文件
- vi /usr/lib/systemd/system/docker.service
- # 在打开的上述文件中按照下面的图,添加如下的内容;注意修改下面内容中的ip地址
- --add-registry=192.168.12.135:5000 --insecure-registry=192.168.12.135:5000
复制代码 修改完后须要重新加载docker配置文件并重启docker
- systemctl daemon-reload
- systemctl restart docker
复制代码
在重启之后;那么则可以去拉取私有堆栈中的镜像:
- # 执行拉取镜像命令并查看
- docker pull jdk1.8
- docker images
复制代码
整体docker的私有堆栈运作形如下图:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |