1、安装
介绍
Docker 是一个用于开发、发布和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分离,以便快速交付软件。借助 Docker,您可以像管理应用程序一样管理基础架构。通过利用 Docker 的快速发布、测试和部署代码的方法,您可以显著减少编写代码和在生产环境中运行代码之间的延迟。
Docker 架构
-
docker 是基于Linux内核的,首先下载VMware Workstation Pro ,创建centos7虚拟机(我的电脑是Windows的)
1.先在centos7中安装gcc
yum -y install gcc
2.安装gcc- c++
yum -y install gcc-c++
- 下载docker引擎前的配置
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引
yum makecache fast
- 安装docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 启动docker
sudo systemctl start docker
- 测试
docker version
sudo docker run hello-world
2、阿里云镜像加速
使用阿里云的容器镜像服务,配置自己的加速器地址
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://8xxvcaud.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3、命令
帮助启动类命令
启动docker
systemctl start docker
停止docker
systemctl stop docker
重启docker
systemctl restart docker
开机启动 docker
systemctl enable docker
帮助手册
docker --help
查看具体命令的帮助手册
docker 具体命令 --help
镜像命令
列出本地主机上的镜像
docker images
# 列出本地所有镜像(含历史镜像)
docker images -a
# 只显示镜像ID
docker images -q
查询镜像
docker search 某个镜像名字
# 只列出前几个 --limit int
docker search --limit 5 某个镜像名字
下载镜像
# 默认下载最新的
docker pull 镜像名称
# 下载具体版本
docker pull 镜像名称:tag
查看镜像/容器/数据卷所占的空间
docker system df
删除xxx镜像
docker rmi 镜像名字ID
# 强制删除
docker rmi -f 镜像名字ID
容器命令
新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明
OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=“容器新名字”: 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式 ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort
启动交互式容器
- 使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it centos /bin/bash
退出容器
- 两种退出方式 在容器内部执行命令
- exit
容器停止退出- ctrl+P+Q
容器不停止退出
列出当前所有正在运行的容器
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
–no-trunc :不截断输出。
docker ps [OPTIONS]
启动容器
docker start 容器ID或者容器名
重启容器
docker restart 容器ID或者容器名
停止容器
docker stop 容器ID或者容器名
强制停止容器
docker kill 容器ID或者容器名
删除已停止的容器
docker rm 容器ID
#一次性删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
重要
启动守护式容器
docker run -d 容器名
查看容器日志
-t 是加入时间戳
-f 跟随最新的日志打印
–tail 数字 显示最后多少条
docker logs -f -t --tail 容器ID
查看容器内运行的进程
docker top 容器ID
查看容器内部细节
docker inspect 容器ID
进入正在运行的容器并以命令行交互
docker exec -it 容器ID bashShell
重新进入docker attach 容器ID
上述两个区别
attach 直接进入容器启动命令的终端,不会启动新的进程
exec 是在容器中打开新的终端,并且可以启动新的进程
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
试一试
进入redis服务
# 一般使用 -d后台启动的程序,再用exec进入对应容器实列
docker exec -it 容器id /bin/bash
docker exec -it 容器id redis-cli
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
从容器内导出
docker export 容器id > xxx.tar
把导出的容器再导入
cat 文件名.tar | docker import-镜像用户/镜像名:镜像版本号
常用命令
4、镜像commit操作
docker commit提交容器副本使之成为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
docker commit -m="test" -a="zn" 74290d4a2e17 zn/myubuntu:1.0
5、镜像上传到阿里云
在阿里云控制台->容器镜像服务->实例列表->个人版下
- 新建命名空间
- 新建镜像仓库 — 选择本地仓库
- 管理
登录阿里云Docker Registry
$ docker login --username=小毛_aa registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/zhang-nan/myubuntu:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=小毛_aa registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/zhang-nan/myubuntu:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/zhang-nan/myubuntu:[镜像版本号]
6、上传到私有仓库
- 下载 仓库镜像
docker pull registry
- 运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
- curl验证私服库上有什么镜像
curl -XGET http://192.168.219.128:5000/v2/_catalog
- 修改自己的镜像文件修改成符合私服命名规范
docker tag myubuntu:1.2 192.168.219.128:5000/myubuntu:1.2
- 修改配置文件使之支持http
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://8xxvcaud.mirror.aliyuncs.com"],
"insecure-registries":["192.168.219.128:5000"]
}
# 重启docker服务
systemctl restart docker
- 推送镜像到私有库
docker push 192.168.219.128:5000/myubuntu:1.2
- 拉取私有库里的镜像
docker pull 192.168.219.128:5000/myubuntu:1.2
7、Docker 容器数据卷
挂载命令
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
查看是否挂载成功
docker inspect 容器ID
挂载目录可以读写权限(默认就是rw)
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
容器目录只读ro
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
卷的继承和共享 –volumes-from
docker run -it --privileged=true -v /mydocker/u:/tmp --name u1 ubuntu
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
8、常见软件安装
1.安装tomcat
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
2.mysql
docker run -d -p 3308:3306 --privileged=true -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7
配置字符集 touch my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
3.redis
-
建目录 mkdir -p /mydata/redis
-
拷贝配置文件 将准备好的redis.conf文件放进/mydata/redis目录下
-
chmod 777 redis.conf 修改redis.conf文件权限
-
3 /mydata/redis目录下修改redis.conf文件 3.1 开启redis验证 可选 requirepass 123 3.2 允许redis外地连接 必须 注释掉 # bind 127.0.0.1 3.3 daemonize no 将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败 3.4 开启redis数据持久化 appendonly yes 可选 # bind 127.0.0.1 protected-mode no daemonize no port 6379 timeout 0 databases 16 save 900 1 save 300 10 save 60 10000 appendonly yes requirepass root
-
创建容器
-
docker run -p 6379:6379 --name redis --privileged=true -v /mydata/redis/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
-
9、数据库主从表配置
-
新建主服务器容器实例
启动容器写成了-v /mydata/mysql-slave/conf:/var/etc/mysql \正确的是:/etc/mysql \兄弟们
docker run -p 3308:3306 --name mysql-master \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7
- 进入/mydata/mysql-master/conf目录下新建my.cnf
vim my.cnf
[client]
## 设置字符集 防止中文乱码
default_character_set=utf8
[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
## 设置字符集 防止中文乱码
collation_server = utf8_general_ci
character_set_server = utf8
- 修改完成后 重启服务
docker restart mysql-master
- 进入mysql-master 容器
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
- master容器实例内创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
- 新建从服务器容器实例
docker run -p 3309:3306 --name mysql-slave \-v /mydata/mysql-slave/log:/var/log/mysql \-v /mydata/mysql-slave/data:/var/lib/mysql \-v /mydata/mysql-slave/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7
- 进入/mydata/mysql-slave/conf目录下新建my.cnf
vim my.cnf
[client]
## 设置字符集 防止中文乱码
default_character_set=utf8
[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
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
## 设置字符集 防止中文乱码
collation_server = utf8_general_ci
character_set_server = utf8
- 修改完配置后重启slave实例
docker restart mysql-slave
- 在主数据库中查看主从同步状态
show master status;
- 进入mysql-slave容器
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
- 在从数据库中配置主从复制
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;master_connect_retry:连接失败重试的时间间隔,单位为秒。
change master to master_host='192.168.219.128', master_user='slave', master_password='123456', master_port=3308, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
- 在从数据库中查看主从同步状态
show slave status \G;
# 显示
Slave_IO_Running: No
Slave_SQL_Running: No
- 在从数据库中开启主从同步
start slave;
- 坑坑坑!
如果显示
Slave_IO_Running: No
Slave_SQL_Running: YesLast_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Client requested master to start replication from position > file size’
解决方法
先进入主mysql服务器容器内下
docker exec -it mysql-master /bin/bash mysql -uroot -proot
进入 mysql目录 cd /var/lib/mysql/
查看日志 看最下面几行数据
mysqlbinlog --no-defaults mall-mysql-bin.000001
文件最后几行 发现最后偏移量是123
- 记住 at 后面的数值, 在master_log_pos后面填入这个数值 即可
# 在从服务器重新配置 即可 stop slave; change master to master_log_file='mall-mysql-bin.000001',master_log_pos=123; start slave;
显示
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_SQL_Errno: 1008
Last_SQL_Error: Error 'Can't drop database 'db1'; database doesn't exist' on query. Default database: 'db1'. Query: 'drop database db1'
解决
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
10、配置redis三主三从
- 新建6个docker容器redis实例
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
- 进入容器
docker exec -it redis-node-1 /bin/bash
- 构建主从关系
//注意,进入docker容器后才能执行一下命令,且注意自己的真实IP地址
redis-cli --cluster create 192.168.219.128:6381 192.168.219.128:6382 192.168.219.128:6383 192.168.219.128:6384 192.168.219.128:6385 192.168.219.128:6386 --cluster-replicas 1
--cluster-replicas 1 表示为每个master创建一个slave节点
成功后如下图所示
- 链接进入6381作为切入点,查看节点状态
redis-cli -p 6381
cluster info
cluster nodes
-
数据读写存储
-
加入参数-c,优化路由 , 使用集群模式
-
redis-cli -p 6381 -c
-
-
查看集群信息
-
redis-cli --cluster check 192.168.219.128:6381
-
11、主动扩容
- 新建6387、6388两个节点+新建后启动+查看是否8节点
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
docker ps
- 进入6387容器实例内部
docker exec -it redis-node-7 /bin/bash
- 将新增的6387节点(空槽号)作为master节点加入原集群
将新增的6387作为master节点加入集群
redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
6387就是将要作为master新增节点6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381
redis-cli --cluster add-node 192.168.219.128:6387 192.168.219.128:6381
- 检查集群情况第1次
redis-cli --cluster check 192.168.219.128:6381
已经加入集群,但还未进行槽位分配
- 重新分派槽号
重新分派槽号命令:
redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.219.128:6381
- 检查集群情况第2次
redis-cli --cluster check 192.168.219.128:6381
槽号分配说明
为什么6387是3个新的区间,以前的还是连续?重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387
- 为主节点6387分配从节点6388
命令:
redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
redis-cli --cluster add-node 192.168.219.128:6388 192.168.219.128:6387 --cluster-slave --cluster-master-id 9a3e5b5d5e763ad977f6af13db9de58267a8c28f
9a3e5b5d5e763ad977f6af13db9de58267a8c28f-------这个是6387的编号,按照自己实际情况
- 检查集群情况第3次
redis-cli --cluster check 192.168.219.128:6381
12、主动缩容
- 将6388删除,从集群中将4号从节点6388删除
命令:
redis-cli --cluster del-node ip:从机端口 从机6388节点ID
redis-cli --cluster del-node 192.168.219.128:6388 aaac3cda26117f2904fcef7695fecbfb7a07c786
redis-cli --cluster check 192.168.219.128:6382 检查一下发现,6388被删除了,只剩下7台机器了。
- 将6387的槽号清空,重新分配,本例将清出来的槽号都给6381
redis-cli --cluster reshard 192.168.219.128:6381
演示:直接把7号机的槽位全分给1号机了,如果平均分的话,可以重复操作几次,每次移动的数值把4096平均起来
- 检查集群情况的第二次
redis-cli --cluster check 192.168.219.128:6381
4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端
- 将6387删除
命令:
redis-cli --cluster del-node ip:端口 6387节点ID
redis-cli --cluster del-node 192.168.219.128:6387 9a3e5b5d5e763ad977f6af13db9de58267a8c28f
13、DockerFile
简介
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
官网:https://docs.docker.com/engine/reference/builder/
Docker执行Dockerfile的大致流程
- (1)docker从基础镜像运行一个容器
- (2)执行一条指令并对容器作出修改
- (3)执行类似docker commit的操作提交一个新的镜像层
- (4)docker再基于刚提交的镜像运行一个新容器
- (5)执行dockerfile中的下一条指令直到所有指令都执行完成
DockerFile常用保留字指令
参考tomcat8的dockerfile入门
https://github.com/docker-library/tomcat
-
FROM
- 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
-
MAINTAINER
- 镜像维护者的姓名和邮箱地址
-
RUN
- 容器构建时需要运行的命令
- shell格式 RUN yum -y install vim
- RUN是在 docker build时运行
-
EXPOSE
- 当前容器对外暴露出的端口
-
WORKDIR
- 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
-
USER
- 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
-
ENV
-
用来在构建镜像过程中设置环境变量
-
ENV MY_PATH /usr/mytest 这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量, 比如:WORKDIR $MY_PATH
-
-
ADD
- 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
-
COPY
- 类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
- 类似ADD,拷贝文件和目录到镜像中。
-
VOLUME
- 容器数据卷,用于数据保存和持久化工作
-
CMD
- 指定容器启动后的要干的事情
- Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
-
ENTRYPOINT
-
类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,
而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序 -
命令格式: ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成 案例如下: 假设已通过 Dockerfile 构建了 nginx:test 镜像:是否传参按照dockerfile编写执行传参运行Docker命令 docker run nginx:testdocker run nginx:test -c /etc/nginx/new.conf 衍生出的实际命令 nginx -c /etc/nginx/nginx.confnginx -c /etc/nginx/new.conf
-
自定义镜像mycentosjava8
Centos7镜像具备vim+ifconfig+jdk8
-
java下载地址
- https://www.oracle.com/java/technologies/downloads/#java8
- https://mirrors.yangxingzhen.com/jdk/
-
编写DockerFile
-
FROM centos MAINTAINER zn ENV MYPATH /usr/local WORKDIR $MYPATH #安装vim编辑器 RUN yum -y install vim #安装ifconfig命令查看网络IP RUN yum -y install net-tools #安装java8及lib库 RUN yum -y install glibc.i686 RUN mkdir /usr/local/java #ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置 ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/ #配置java环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_171 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 EXPOSE 80 CMD echo $MYPATH CMD echo "success--------------ok" CMD /bin/bash
-
-
构建
-
docker build -t 新镜像名字:TAG .
-
docker build -t centosjava8:1.5 .
- 注意,上面TAG后面有个空格,有个点
-
-
运行
-
docker run -it 新镜像名字:TAG
-
docker run -it centosjava8:1.5 /bin/bash
-
虚悬镜像
-
what
- 仓库名、标签都是的镜像,俗称dangling image
-
查看
-
docker image ls -f dangling=true
-
-
删除
-
docker image prune 虚悬镜像已经失去存在价值,可以删除
-
微服务练习
-
项目打包 jar
- demo1-0.0.1-SNAPSHOT.jar
-
编写Dockerfile
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zn
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD demo1-0.0.1-SNAPSHOT.jar zn_docker.jar
# 运行jar包
RUN bash -c 'touch /zn_docker.jar'
ENTRYPOINT ["java","-jar","/zn_docker.jar"]
#暴露9000端口作为微服务 我的微服务端口是9000
EXPOSE 9000
-
构建
-
docker build -t 新镜像名字:TAG .
-
docker build -t zn_docker:1.0 .
- 注意,上面TAG后面有个空格,有个点
-
-
运行
-
docker run -d -p 端口:端口 新镜像名字:TAG
-
docker run -d -p 9000:9000 zn_docker:1.0
-
14、Docker-compose
介绍
Docker-Compose是Docker官方的开源项目,
负责实现对Docker容器集群的快速编排
能干什么
docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题? 如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器,这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具 例如要实现一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服务容器,redis服务器,注册中心eureka,甚至还包括负载均衡容器等等。。。。。。 Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。 可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。
安装
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
Compose核心概念
-
文件
- docker-compose.yml
-
两要素
- 服务(service)
- 一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器
- 工程
- 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
- 服务(service)
Compose使用的三个步骤
- 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
- 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线
- Compose常用命令
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编排过的运行的所有容器
docker-compose exec docker-compose.yml文件中写的服务id /bin/bashdocker-compose ps
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 # 停止服务
Compose编排微服务
-
mvn package命令将微服务形成新的jar包并上传到Linux服务器/mydocker目录下
-
编写Dockerfile
-
# 基础镜像使用java FROM java:8 # 作者 MAINTAINER zn # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp VOLUME /tmp # 将jar包添加到容器中并更名为zzyy_docker.jar ADD demo1-0.0.1-SNAPSHOT.jar zn_docker.jar # 运行jar包 RUN bash -c 'touch /zn_docker.jar' ENTRYPOINT ["java","-jar","/zn_docker.jar"] #暴露9000端口作为微服务 我的微服务端口是9000 EXPOSE 9000
-
构建
-
docker build -t 新镜像名字:TAG .
-
docker build -t zn_docker:1.0 .
- 注意,上面TAG后面有个空格,有个点
-
-
编写docker-compose.yml文件
version: "3"
services:
microService:
image: zn_docker:2.0
container_name: ms01
ports:
- "9000:9000"
volumes:
- /app/microService:/data
networks:
- my_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /mydata/redis/redis.conf:/etc/redis/redis.conf
- /mydata/redis/data:/data
networks:
- my_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db1'
MYSQL_USER: 'root'
MYSQL_PASSWORD: 'root'
ports:
- "3308:3306"
volumes:
- /mydata/mysql/db:/var/lib/mysql
- /mydata/mysql/conf/my.cnf:/etc/my.cnf
- /mydata/mysql/init:/docker-entrypoint-initdb.d
networks:
- my_net
command: --default-authentication-plugin=mysql_native_password
#解决外部无法访问
networks:
my_net:
- 执行 docker-compose up 或者 docker-compose up -d
15、Docker网络
作用
- 容器间的互联和通信以及端口映射
- 容器IP变动时候可以通过服务名直接网络通信而不受到影响
基本命令
查看网络
docker network ls
查看网络源数据
docker network inspect XXX网络名字
删除网络
docker network rm XXX网络名字
创建网络
docker network create XXX网络名字
网络模式
-
bridge
- Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。 # 查看 bridge 网络的详细信息,并通过 grep 获取名称项docker network inspect bridge | grep name ifconfig
- 使用–network bridge指定,默认使用docker0
-
host
- 直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。
- 使用–network host指定
-
none
- 在none模式下,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo需要我们自己为Docker容器添加网卡、配置IP等。
- 使用–network none指定
-
container
- container⽹络模式 新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
- container模式:使用–network container:NAME或者容器ID指定
-
自定义网络
- 自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通),自定义的网络也是bridge模式,可以维护docker上的多个容器相互ip
- docker network create XXX网络名字
orks:
- my_net
command: --default-authentication-plugin=mysql_native_password
#解决外部无法访问
networks:
my_net:
- 执行 docker-compose up 或者 docker-compose up -d
# 15、Docker网络
## 作用
- 容器间的互联和通信以及端口映射
- 容器IP变动时候可以通过服务名直接网络通信而不受到影响
## 基本命令
查看网络
docker network ls
查看网络源数据
docker network inspect XXX网络名字
删除网络
docker network rm XXX网络名字
创建网络
docker network create XXX网络名字
本篇笔记根据b站尚硅谷docker教学简单写的笔记 教学视频地址如下
https://www.bilibili.com/video/BV1gr4y1U7CY?spm_id_from=333.337.search-card.all.click&vd_source=49f8c3d885f4084df373fad3b65fdb6f