1、Docker简介:
docker解决的问题:避免了各种环境中的配置、中间件版本等不一致所导致的问题。避免各个环境重复安装各种软件的繁琐工作。
docker理念:一次镜像处处运行;即可以将源码、运行环境、配置文件、中间件等等打成一个包,生成镜像文件后在各个地方都可以运行。
docker官网:https://www.docker.com/
仓库:docker hub:https://hub.docker.com
UnionFS(联合文件系统):
是一种分层、轻量级并且高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将目录挂在到同一个虚拟文件系统下。联合
文件系统是Docker的基础,镜像可以通过分层来进行继承,基于基础镜像可以制作各种具体的应用镜像。
***Docker的镜像层是只读的,只有容器层是可写的。当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作为容器层,而容器层之下的都叫
镜像层。所有对容器的改动无论添加、删除还是修改文件都只会发生在容器层中,也只有容器层是可写的,容器层之下的所有镜像层都是只读的。
2、Docker安装:
Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境,实质上是在已经运行的Linux下制造了一个隔离的文件环境。
2.1 docker的基本组成:
1、镜像(image):是一个只读的模板,可以用来创建Docker容器,一个镜像可以创建很多容器(镜像文件就类似于Java的类模板,而docker容器实例就类似于
java中new出来的实例对象)。
2、容器(container):docker是利用容器独立运行一个或一组应用,应用程序或服务运行在容器里面。而容器是用镜像创建的运行实例。同时每个容器都是
相互隔离、保证安全的平台。注:一个容器运行一种服务如redis、es、mysql等。
3、仓库(repository):是集中存放镜像文件的场所(分为公共仓库和私有仓库)
2.2 docker工作原理:
docker是一个CS(Client-Server)结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在
主机上的容器。容器是一个运行时的环境。
2.3 Docker的基本运行流程:
1、用户是使用Docker Client与Docker Daemon建立通信并发送请求给后者;
2、Docker Daemon是作为Docker架构中的主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求;
3、Docker Engine执行Dokcer内部的一系列工作,每一项工作都是以job的形式存在的;
4、Job在运行过程中,当需要容器镜像时则从仓库中下载镜像,并通过镜像管理驱动将下载的镜像以Graph的形式存储;
5、当需要为Docker创建网络环境时,通过网络管理驱动创建并配置Docker容器的网络环境;
6、当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec Driver来完成。
2.4 Docker安装:
https://docs.docker.com/engine/install/centos/
1、确定虚拟机是Centos7及以上版本,查看命令:cat /etc/redhat-release
2、卸载旧版本,https://docs.docker.com/engine/install/centos/ 中的 Uninstall old versions 命令执行即可
3、yum安装gcc相关内容:
(1)确保Centos7可以上外网
(2)yum -y install gcc
(3)yum -y install gcc- c++
4、安装需要的软件包yum-utils
yum -y install yum-utils
5、设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
连接超时时可http://mirrors.aliyun.com/docker-ce下载后将文件上传至/etc/yum.repos.d下
6、更新yum软件包索引
yum makecache fast
7、安装Docker CE(docker引擎)P11 10:33
yum -y install docker-ce docker-ce-cli containerd.io
离线安装docker:
1)上传安装包tgz解压后将其cp到/usr/bin下,将docker目录下的dockerdcp到/usr/bin下(若没有dockerd)
cp docker/* /usr/bin
2)在"/etc/systemd/system"下创建docker.service文件,其内容为
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target firewalld.service
Wants=network.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
3)重新加载配置
systemctl daemon-reload
4)启动docker “systemctl start docker”
5)创建文件配置国内镜像地址 “/etc/docker/daemon.json”
{
“registry-mirrors”: [“https://registry.docker-cn.con”,“https://docker.mirrors.ustc.edu.cn”,“https://cr.console.aliyun.com”],
“exec-opts”:[“native.cgroupdriver=systemd”],
“graph”:“/opt/docker-graph”
}
6)重启docker “systemctl restart docker”
7)开机自启动 systemctl enable docker若不好使可使用systemctl enable docker.service
8)检查docker状态systemctl status docker
9)停止docker systemctl stop docker
10)卸载docker
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
3、阿里云镜像加速器
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
容器镜像服务 -> 镜像工具 -> 镜像加速器
离线安装需要配置注意*******:使用docker命令时提示命令未找到,需要添加Docker命令到环境变量中如下*********
编辑:vi ~/.bashrc
在文件的末尾添加以下行:export PATH=“/usr/bin/docker:$PATH”
重新加载~/.bashrc文件:source ~/.bashrc
**
4、docker常用命令:
**
(1)帮忙启动类命令
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
查看docker概要信息:docker info
查看docker总体帮助文档:docker --help
查看docker命令帮助文档:docker 具体命令 --help
(2)镜像命令
docker images:列出本地主机上的镜像(包括仓库、tag标签版本号、镜像id、创建时间和大小)
options:-a 列出所有镜像包括历史镜像
-q 只显示镜像id
docker search 某个镜像名字:查询某个镜像在远程仓库是否存在
docker pull 某个镜像名字:下载镜像,
用法:(1)docker pull 镜像名字[:tag] 下载指定版本号的镜像
(2)docker pull 镜像名字 下载最新版本的镜像
docker system df:查看镜像/容器/数据卷所占的空间
docker rmi 某个镜像名字/镜像id:删除某个镜像,加 -f 是强制删除
docker rmi -f ${docker images -qa} 删除全部镜像
面试题:什么是虚悬镜像??答:仓库名、标签都是的镜像被称为虚悬镜像,没什么用,可以删除!!!!
(3)容器命令
docker run [OPTIONS] IMAGE [COMMAND] [ARGS]:新建+启动容器
OPTIONS说明:--name="容器新名字" 为容器指定一个名字,不指定则随机生成
-d:后台运行容器并返回容器ID
-i:以交互模式运行容器,通常与-t同时使用(交互模式)
-t:为容器重新分配一个伪输入终端,通常与-i同时使用(终端)
-P:随机端口映射(大写P)
-p:指定端口映射(小写p)如 mysql 3306:3309 左边是docker内的端口右边是外界访问的端口
docker ps [OPTIONS]:列出当前所有正在运行的容器
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
退出容器:①exit:run进去容器,exit退出容器停止
②ctrl+p+q:run进去容器,ctrl+p+q退出容器不会停止
docker start 容器id或者容器名:启动已经停止运行的容器
docker restart 容器id或者容器名:重启容器
docker stop 容器id或者容器名: 停止容器
docker kill 容器id或者容器名:强制停止容器
docker rm 容器id或者容器名:删除已经停止的容器 (-f 强制删除,正在运行的也可以删除)
docker logs 容器id:查看容器日志
docker inspect 容器id:查看容器内部细节
重新进入正在运行的容器并以命令行交互:①docker exec -it 容器id(推荐使用)
②docker attach 容器id
*****面试题①②区别
attach进入时不会启动新的进程使用exit退出时会导致容器停止,exec是在容器中打开新的终端且启动新进程,用exit退出时不会导致容器停止
docker cp 容器id:容器内路径 目的主机路径:从容器拷贝文件到主机上
docker export 容器ID > xxx.tar:将容器导成tar包备份
cat xxx.tar | docker import - 镜像用户/镜像名:镜像版本号:将备份的容器压缩包内容创建一个新的镜像
docker commit:提交容器副本使之成为一个新的镜像,命令如下:
docker commit -m=“提交的描述信息” -a=“作者” 容器id 要创建的目标镜像名:[标签名]
案例演示为ubuntu安装vim(pull ubuntu镜像并带伪终端运行)执行以下命令:
(1)更新包管理工具 apt-get update
(2)安装vim apt-get -y install vim 此时可以使用编辑命令vim
(3)将带有vim编辑命令的ubuntu进行提交形成新的镜像,这样该镜像就拥有了vim编辑命令,提交命令格式如下:
docker commit -m=“vim cmd add ok” -a=“ysg” 刚刚那个ubuntu的容器id ubuntu/vim:1.3
5、本地镜像发布到阿里云:
(1)首先到aliyun.com中创建个人的镜像仓库,首先创建命名空间之后在该命名空间下创建镜像仓库
(2)根据镜像仓库中管理界面命令将刚刚新建的镜像推送到阿里云即可(同时也可以将本地的删除后重新拉取阿里云上的镜像进行验证)
6、搭建docker私有库
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库,相当于将阿里云的仓库或者Docker Hub在公司搭建一套
(1)下载镜像Docker Registry:docker pull registry
(2)运行私有库Registry,相当于本地有个私有Docker Hub
docker run -d -p 5000:5000 -v /opt/module/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便与宿主机联调
(3)curl验证私服库上有什么镜像
curl -XGET http://192.168.3.109:5000/v2/_catalog
(4)将新镜像myubuntu:1.0修改符合私服规范的Tag,相当于将要push到私有库的镜像克隆一份
docker tag 镜像:Tag Host:Port/Repository:Tag 如:
docker tag myubuntu:1.0 192.168.3.109:5000/myubuntu:1.0
(5)修改配置文件使之支持http(默认是不支持http的推送),修改/etc/docker/daemon.json,添加私服库的地址如下内容即可:
“insecure-registries”:[“192.168.3.109:5000”] 修改后若不生效重启docker,重启后需要重新启动私服库
(6)推送镜像到私服库:docker push REPOSITORY:TAG
docker push 192.168.3.109:5000/myubuntu:1.0,推送后执行(3)验证目前私服库有哪些镜像
(7)拉取私服库的镜像
docker pull 192.168.3.109:5000/myubuntu:1.0
7、容器卷
(1)Docker挂在主机目录访问如果出现cannot open directory:Permisson denied
解决办法:在挂载目录后多加一个–privileged=true参数即可。即开启权限
(2)概念:卷就是目录或者文件,存在于一个或多个容器中,由docker挂在到容器。目的是数据的持久化,完全独立于容器的生命周期,因此Docker不会在容器
删除时删除其挂在的数据卷。。。而docker正是以容器卷的方式进行数据持久化的,使用-v将容器的数据备份到宿主机上。
(3)运行一个带有容器卷存储功能的容器实例:任何一方在变动时都会互相同步即使docker在stop状态下修改宿主机后启动docker,修改的内容也会同步至docker
docker run --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名(默认rw可读可写)
docker run --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名(ro只可读,不可写,限制的是容器内)
(4)查看是否挂在成功可通过docker inspect 容器id:查看容器内部细节 进行查看
该输出内容中Mounts就是挂在的内容,有Source即宿主机和Destination容器内的路径
(5)容器卷可以继承,通过 --volumes-from 参数实现
8、安装常用软件
1)mysql:5.7
下载镜像并运行
docker run -d -p 3307:3307 --privileged=true -v /opt/mysql-back/log:/var/log/mysql -v /opt/mysql-back/data:/var/lib/data -v /opt/mysql-back/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
后台运行mysql,root密码为12345且带有容器卷功能,注:与宿主机mysql端口冲突
新建my.cnf并同步给mysql容器实例(指定端口和字符编码否则会乱码),内容如下:
[client]
port=3307
default_character_set=utf8
[mysqld]
port=3307
collation_server=utf8_general_ci
character_set_server=utf8
修改配置后重启mysql服务(服务端验证编码格式SHOW VARIABLES LIKE ‘character%’;)
mysql一主一从搭建:
运行mysql-master容器->
docker run -d -p 3307:3306 --privileged=true -v /opt/mydata/mysql-master/log:/var/log/mysql -v /opt/mydata/mysql-master/data:/var/lib/mysql -v /opt/mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql:5.7
在/opt/mydata/mysql-master/conf下新建my.cnf 文件,内容如下->
[mysqld]
## 设置server_id 同一局域网中需唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间,默认为0,表示不自动清理
expire_logs_days=7
## 跳过一些主从复制中遇到的所有错误或者指定类型的错误,避免slave端复制终端
## 如 1062错误指一些主键重复 1032指主从数据库数据不一致
slave_skip_errors=1062
修改配置文件后重启mysql-master容器
进入mysql-master容器->
创建数据同步用户并赋权限:
CREATE USER ‘slave’@‘%‘IDENTIFIED BY ‘123456’;
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON . TO ‘slave’@’%’;
运行mysql-slave容器->
docker run -d -p 3308:3306 --privileged=true -v /opt/mydata/mysql-slave/log:/var/log/mysql -v /opt/mydata/mysql-slave/data:/var/lib/mysql -v /opt/mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql:5.7
在/opt/mydata/mysql-slave/conf下新建my.cnf 文件,内容如下->
[mysqld]
## 设置server_id 同一局域网中需唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备slave作为其他数据库实例的master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间,默认为0,表示不自动清理
expire_logs_days=7
## 跳过一些主从复制中遇到的所有错误或者指定类型的错误,避免slave端复制终端
## 如 1062错误指一些主键重复 1032指主从数据库数据不一致
slave_skip_errors=1062
## 配置中继日期relay_log
relay_log=mall-mysql-relay-bin
## slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave 置为只读(具有super权限的用户除外)
read_only=1
修改后重启mysql-slae容器
在主数据库查看主从同步状态-> show master status;
进入mysql-slave容器->
在从数据库配置主从复制:
change master to master_host=‘192.168.3.109’,master_user=‘slave’,master_password=‘123456’,master_port=3307,master_log_file=‘mall-mysql-bin.000001’,master_log_pos=617,master_connect_retry=60;
在从数据库查看主从复制状态:
show slave status \G;(G是以key-value形式展示内容,不加如master中查看状态的效果)
在从数据库中开启主从同步:
start slave;
主从复制测试->
主机新建库-新建表-插入数据,从机查看库-查看表及数据----ok
(2)redis
docker run -p 6379:6379 --name myr3 --privileged=true -v /opt/redis-back/redis.conf:/etc/redis/redis.conf -v /opt/redis-back/data:/data
-d redis镜像id redis-server /opt/redis-back/redis.conf
上亿条数据如何存储?
首先redis搭建主从集群,存储方式如下:
1、哈希取余分区:即在存储时先通过 hash(key)%机器数 得到的结果就是要操作的机器
2、一致性哈希分区
3、哈希槽分区
9、DokcerFile
概念:是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
基础知识:
(1)每条保留字指令都必须为大写字母且后面要跟随至少一个参数
(2)指令按照从上到下,顺序执行
(3)#表示注释
(4)每条指令都会创建一个新的镜像层并对镜像进行提交
常用保留字指令:
(1)FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM
(2)MAINTAINER:镜像维护者的姓名和邮箱地址
(3)RUN:容器构建时需要运行的命令,RUN 是在docker build时运行。两种格式如下:
shell格式:RUN <命令行命令> 等同于在终端操作的shell命令 如 RUN yum -y install vim
exec格式: RUN<“可执行文件”,“参数1”,“参数2”> 如 RUN [“./test.php”,“dev”,“offline”] 等价于 RUN ./test.php dev offline
(4)EXPOSE:当前容器对外暴漏出的端口
(5)WORKDIR:指定在创建容器后,终端登陆进来的默认工作目录,一个落脚点,即docker run -it 进入容器后的默认目录
(6)USER:指定该镜像以什么样的用户去执行,如果都不指定默认是root
(7)ENV:用来在构建镜像过程中设置环境变量
这个环境变量可以在后续的任何RUN指令中使用,就如同在命令前面指定了环境变量前缀一样,可以在其他指令中直接使用这些环境变量
(8)ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
(9)COPY:类似ADD,拷贝文件和目录到镜像中。
(10)VOLUME:容器数据卷,用于数据保存和持久化工作
(11)CMD:指定容器启动后要做的事情,其是在run时运行,同RUN一样支持两种格式shell和exec
注意:DokcerFile种可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换。
(12)ENTRYPOINT:也是用来指定一个容器启动时要运行的命令,类似于CMD,但是ENTRYPOINT不会被docker run后面的参数覆盖,而且这些命令行参数
会被当作参数送给ENTRYPOINT指令指定的程序
案例演示:构建centos7镜像且具备vim+ifconfig+java8
编写Dockerfile文件,内容如下:
FROM centos
MAINTAINER ysg<ysg@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -i install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar(所以安装包必须和DockerFile文件在同一位置),将jdk-8u131-linux-x64.tar.gz添加到容器中
ADD jdk-8u131-linux-x64.tar.gz /usr/local/java
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_131
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success-----------------ok"
CMD /bin/bash
构建:docker build -t 新镜像名字:TAG . 如 docker build -t centosjava8:1.5 .
运行:docker run -it 。。。
注意:在构建或者删除镜像时可能出现错误从而生成虚悬镜像,这种是没用的而且占用空间
查看有哪些虚悬镜像:docker images ls -f dangling=true
删除虚悬镜像:docker image prune
10、通过dockerfile发布微服务部署到docker容器
(1)创建微服务端口为8081,并将其打成jar包上传至linux /opt/mydocker下
(2)编写Dockerfile文件,使其和jar包在同一目录下,内容如下:
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER ysg
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为ysg_docker.jar
ADD myself-demo-0.0.1-SNAPSHOT.jar ysg_docker.jar
# 运行jar包
RUN bash -c 'touch /ysg_docker.jar'
ENTRYPOINT ["java","-jar","/ysg_docker.jar"]
# 暴漏端口8081作为微服务端口
EXPOSE 8081
(3)构建镜像
docker build -t ysg_docker:1.6 .
(4)运行容器
docker run -d -p 8081:8081 ysg_docker
(5)测试访问
http://192.168.3.109:8081/test/applyLog 显示ok----->testApplyLog
11、Docker网络
(1)常用命令 docker network --help
查看网络列表 docker network ls
查看网络数据源 docker network inspect 网络的名字
删除网络 docker network rm 网络的名字
(2)作用
容器间的互联和通信以及端口映射
容器ip变动时可以通过服务名直接网络通信而不受到影响
(3)网络模式:
bridge:为每一个容器分配、设置IP等。并将容器连接到一个docker0的虚拟网桥,默认为该模式
网桥docker0会创建一对对等虚拟设备接口一个是veth(类似交换机接口)一个是eth0(容器内的),这俩一一匹配使容器和宿主机可以正常通信
可通过 ip addr查看
host:容器将不会虚拟出自己的网卡、配置自己的ip而是使用宿主机的ip和端口
直接使用宿主机的IP地址与外界通信,不在需要额外进行NAT转换
none:容器独有的network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等
container:新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP,端口范围等
自定义网络:因为容器在重新启动后网络会发生变化,所以需要自定义网络通过服务名字进行访问而不是通过ip进行访问
创建自定义网络(默认使用的驱动使bridge) -> docker network create ysg_network
新建容器并加入自定义的网络 ->
docker run -d -p 8081:8080 --network ysg_network --name tomcat81 tomcat(镜像名称)
docker run -d -p 8082:8080 --network ysg_network --name tomcat82 tomcat(镜像名称)
这样在容器启动后互相通过ping 服务名 就可以ping的通了
进入tomcat81 ping tomcat82
进入tomcat82 ping tomcat81
12、Compose容器编排
(1)概述:是一个工具软件,可以管理多个Docker容器组成的应用,需要定义一个yaml格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。
之后只要一个命令,就能同时启动/关闭这些容器。即负责实现Docker容器集群的快速编排。
Compose允许用户通过一个单独的docker-compose.yml文件来定义一组关联的应用容器为一个项目(如mysql、redis、nginx等等)。
(2)安装
curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose-
(
u
n
a
m
e
−
s
)
−
(uname -s)-
(uname−s)−(uname -m)” -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --verison
(3)卸载,如果是以curl安装的按照以下方式卸载
rm /usr/local/bin/docker-compose
(4)核心概念
一文件(docker-compose.yml)、两要素(服务即每个容器和工程即一组关联的应用容器组成的一个完整业务单元须在文件中定义)
(5)使用的三个步骤
a、编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
b、使用docker-compose.yml定义一个完整业务单元,按照整体应用中各个容器服务
c、执行docker-compose up命令启动并运行整个应用程序完成一键部署
(6)Compose常用命令
docker-compose -h 查看帮助
docker-compose up 启动所有docker-compose服务
docker-compose up -d 启动所有docker-compose服务并后台运行
docker-compose down 停止并删除容器、网络、卷、镜像
docker-compose exec yml中的服务id 进入容器实例内部
docker-compose ps 展示当前docker-compose编排过的运行的所有容器
docker-compose top 展示当前docker-compose编排的容器进程
docker-compose logs yml中容器id 查看容器输出日志
docker-compose config 检查配置
docker-compose config -q 检查配置,有问题输出
docker-compose restart 重启服务
docker-compose start 启动服务
docker-compose stop 停止服务
(7)编排服务(实操)微服务+redis
a、将服务增加redis后重新打包上传linux的/opt/mydocker下,编写Dockerfile构建镜像docker build -t docker_boot.jar:1.8 .
b、编写docker-compose.yml文件,内容如下:
#compose版本
version:"3"
services:
microService:
image: docker_boot.jar:1.8
container_namw: dockerBoot
ports:
- "8081:8081"
volumes:
- /opt/composeData/microService:/data
networks:
- yang_net
depends_on:
- redis
redis:
image: redis:latest
ports:
- "6379:6379"
volumes:
- /opt/composeData/redis/conf/redis.conf:/etc/redis/redis.conf
- /opt/composeData/redis/data:/data
networks:
- yang_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABAES: '库名'
MYSQL_USER: '用户名'
MYSQL_PASSWORD: '密码'
ports:
- "3306:3306"
volumes:
- /opt/composeData/mysql/db:/var/lib/mysql
- /opt/composeData/mysql/conf/my.cnf:/etc/my.cnf
- /opt/composeData/mysql/int:/dcoker-entrypoint-initdb.d
networks:
- yang_net
command: --default-authentication-plugin=mysql_native_password #解决外网无法访问
#创建网络yang_net,可能出现版本不兼容将自定义的网络注释掉使用bridge即可
networks:
yang_net:
注意:在该文件定义了各个组件的名称后,在使用时就无需写ip,直接写服务名称即可。。。如服务中需配置redis的ip,直接写redis
c、检查compose文件是否有问题
docker-compose config -q
d、启动服务,后台启动,不加-d非后台启动可查看启动日志
docker-compose up -d
12、Portainer
感念:是一款轻量级的应用,提供了图形化界面,方便的管理Docker环境,包括单机环境和集群环境
安装:http://portainer.io
命令安装:docker pull portainer/portainer 下载最新版
启动:docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
登录:xxxx:9000 按照规则设置即可 admin/12345678
13、重量级监控应用CIG
C-CAdvisor:负责收集信息
I-InfluxDB:存储数据
G-Granfana:展示数据