文章目录
Docker
官网:https://www.docker.com
官方仓库:https://hub.docker.com
docker是将应用打包成镜像,通过镜像成为运行在Docker容器上面的实例,而Docker容器在任何操作系统上一致,这就实现了跨平台,跨服务器,只需要一次配置环境。换到其它机子上就一键部署,简化操作。
docker依赖已经存在并运行的Linux内核环境,所以必须部署在Linux内核的系统上。
docker对linux内核版本有特定要求不低于3.10,centos7以上才可以安装
在windows上依赖WSL。WSL的使用见我其它文章
docker组成
镜像image:相当于模板,类似vmworkstation的ISO文件的理解
容器container:运行镜像的实例,类似vmworkstation上通过iso文件安装的系统理解。
仓库repository:存放镜像的地方,类似gitHub上存放的代码的理解,
安装docker
安装环境是在vm虚拟机上
1.在虚机上安装CentOS8
2.安装linux标配组件,类似windows的运行库
yum -y install gcc
yum -y install gcc-c++
设置存储库,设置yum源
sudo yum install -y yum-utils
添加存储库–要能访问外网或使用国内的镜像:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
添加存储库—国内阿里云存储库:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清理和更新缓存
yum clean
yum makecache
3.安装docker
安装参考 https://docs.docker.com/engine/install/
先卸载老旧版本,如果没有安装会返回提示
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装最新的社区版本
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
此条命令如果出现runc错误,直接remove , 原因是存在冲突,查找到冲突的直接remove
yum remove runc
配置docker
启动docker
systemctl start docker
查看安装概要
docker version
//或
docker info
将linux用户添加到docker组中
sudo groupadd docker
sudo gpasswd -a linfeng0928 docker
newgrp docker
如果没有将用户加入docker用户组会报错如下:
docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.
配置docker使用属于自己的阿里云镜像加速器服务
请登录阿里云,在弹性计算,容器镜像服务,镜像工具,获得私人的镜像加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://******"] //这里请替换私人加速器地址
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
操作命令参考
启动和帮助类命令
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker
systemctl enable docker 开机启动
docker info 概要信息
docker --help 帮助
docker docker命令 --help 命令帮助
镜像操作命令
列出本地的镜像列表
docker images
参数:
-a 列出所有,
-q 只列出镜像id,
-f 过滤条件,
命令结果列表结构:
name | 镜像名 |
---|---|
tag | 版本标签 |
stars | 点赞数量 |
official | 官方认定 |
automated | 是否自动工具构建的 |
查找镜像,列出前n个查找到的镜像
docker search 镜像名字 --limit 5
docker search ubuntu --limit 5
拉取镜像
docker:pull 镜像名字[:tag]
。tag版本号,没有带tag默认下载最新版本
示例:docker pull ubuntu:latest
查看docker数据信息
docker system df
查看docker占用空间的情况有镜镜,容器,数据卷等信息
删除镜像
正常删除一般会不成功,所以用强制删除镜像
docker rmi -f 镜像id1 镜像id2
docker rmi -f $(docker images -qa)
删除全部镜像
$(docker images -qa) 是将这段命令是获得所有镜像的id,传递给删除命令
管理本地镜像
docker image
,有区别docker images,要自己探索
查看具体镜像的版本
docker inspect redis:latest|grep -i version
列出虚悬镜像
docker image ls -f dangling=true
镜像名称为none,null的无效镜像.镜像列表中没有仓库名,没有标签的镜像,docker pull异常和docker build,docker升级等会导致这个现像,就是新旧镜像同名,旧镜像名被取消,这已经失云了存在价值,可以删除
删除虚悬镜像
docker image prune
删除失效镜像
容器操作命令
启动前台交互运行的容器基本命令
docker run -it ubuntu /bin/bash
新建并在bash终端前台启动交互运行容器
参数:
-i 交互模式,
-t使用tty终端,
–name 指定容器名称,
-p 3306:3306 指定端口宿主机端口:docker的端口,
-d后台守护模式运行容器,
–rm开发过程中短期运行,不保留数据,容器退出时销毁清理不能与-d一起使用,会清理数据卷,退出后自动运行docker rm -v
启动后台守护模式容
docker run -d ubuntu
docker run ubuntu 不能运行的原因
每个容器运行必须有一个前台进程,否则docker会认为容器空闲就自动退出了。除top,tail
列出正在运行的容器
docker ps`
参数:
-a 列出所有容器
-l 最近创建的,
-n 最近n个,
-q只显示容器号
docker ps命令显示的结果:
containerID | 容器编号 |
image | 镜像名 |
command | 命令 |
created | 创建时间 |
status | 状态 |
prots | 端口 |
names | 名字 |
退出容器
exit
交互式模式运行容器如果退出,会停止容器
前台交互模式切换后台守护模式
按键 ctrl + p + q
启动,停止,强制停止容器
docker start | stop | kill 容器id
删除容器
普通删除
docker rm -f 容器名称 | id
复杂删除
docker ps -a -q | xargs docker rm
上一个ps命令的容器id通过管道路径传给xargs 然后执行删除
查看容器日志
docker logs 容器id
docker top 容器id
容器内部运行的进程,与linux差不多
docker inspect 容器id
查看容器内部运行的细节与linux差不多
进入或重新进入容器
docker exec -it 容器id bash
,启动新的进程进入容器,exit退出容器不会停止
docker attach 容器id
不启动新的进程进入容器,exit退出会导致容器停止
导入导出容器
docker export 容器id > abcd.tar
cat abcd.tar | docker import-镜像用户/镜像名:镜像版本号导入为镜像
打造自己的镜像
为什么镜像很小:镜像只包含最小的可运行环境。后续要通过扩充。
联合文件系统UnionFS
这是一种分层,轻量级高性能的文件系统,支持对文件系统的修改作为一次提交,同时可以将不同目录挂载到同一个虚拟文件系统下。这个docker镜像基础。
一次加载多个文件系统,但从外面看只是一个系统,联合加载把各层文件叠加起来最终形成包含所有底层的文件和目录
镜像加载原理,linux运行原理
bootfs(boot file system),bootloader和kernel是linux的底层。boot启动引导加载完成后,系统使用权由bootfs转给kernel,并卸载bootfs
bootfs–> rootfs是linux各发行版
每个容器是个简易的linux环境,包括root用户权限,进程空间,用户空间,网络空间,和运行在上面的应用
docker的镜像层是只读的,容器层是可以读写的,当容器启动时一个新的可写层被加载到镜像最顶层。bootfs-rootfs-base image-container
创建自己的镜像
提交容器副本成为一个新镜像,这与git commit一样,格式如下:
docker commit -m ‘描述信息' -a ’作者' 容器id 目标镜像名:标签名
发布镜像到阿里云
阿里云–容器镜像服务地址:
https://cr.console.aliyun.com/cn-hangzhou/instance/namespaces
步骤:
1.创建命名空间,
2.创建镜像仓库
3.上传镜像
docker上操作
登录阿里云Docker Registry
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码
$ docker login --username=3509*****@qq.com registry.cn-hangzhou.aliyuncs.com
从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/bylinf/ubuntu-vim:[镜像版本号]
将镜像推送到Registry
$ docker login --username=3509****@qq.com registry.cn-hangzhou.aliyuncs.com
password: ******
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/bylinf/ubuntu-vim:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/bylinf/ubuntu-vim:[镜像版本号]
选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
发布到本地私有的镜像库
下载registry镜像,
docker pull registry
在本地运行registry容器,创建私有docker hub。示例:
docker run -d -p 5000:5000 -v /bylinf/registry/:/tmp/registry --privileged=true registry
提交到私服库
1.查询私库
curl -XGET http://192.168.3.201:5000/v2/_catalog
2.设置镜像符合私服规范
//设置新镜像符合私服规范的tag
docker tag bylinfubuntu:1.0 192.168.3.201:5000/bylinfubuntu:1.0
3.设置推送镜像能力
//取消默认不许http方式推送镜像配置,新版貌似不用设置。。。。
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://bkofpe4v.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.3.201:5000"] //私人registry地址
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4.推送镜像
docker push 192.168.3.201:5000/bylinfubuntu:1.0
容器数据卷
数据持久化+备份到本地主机目录,将容器内数据保存到宿主机的磁盘中,防止误删,误操作
运行容器数据卷容器实例:
docker run -it --prvileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名`
docker run -it --privileged=true -v /tmp/myHostData:/tmp/myDockerData ubuntu bash
可以容器之间共享重用数据,实时生效,数据不包镜像的更新中
docker 挂载主机目录访问如果出现cannot open directory::Permission denied
解决方法:在挂载目录后多加 --privileged=true 参数
不安全会先禁止,所以目录挂载的行为默认不安全,使用该参数 在容器中的root是root权限,否则容器内root只是普通用户
-v添加自定义(宿方机路径:容器内路径)容器与主机的数据共享
不添加默认registry目录在/var/lib/registry
查看数据卷是否挂载成功
在docker inspect 容器id mounts节点
数据卷读写规则
rw默认规则
docker run -it --privileged=true -v /tmp/myHostData:/tmp/myDockerData:rw ubuntu bash ro
映射添加说明
数据卷继承与共享
docker run -it --privileged=true -v /mydocker/u:/tmp/u --name u1 ubuntu
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
安装常见软件
操作步骤
1.搜索镜像 docker search tomcat
2.拉取镜像 docker pull tomcat
3.查看镜像 docker images tomcat
4.启动容器 docker run -it -p 8080:8080 tomcat (it交互终端,d后台,p主机端口,容器端口)
5.停止容器 docker stop
6.移除容器 docker rm -f
安装tomcat
- 404页面错误原因
- 映射端口,防火墙
- webapps.dist目录换成webapps。新版webapps是空的,把webapps 删除,把webapps.dist改成webapps。新版必须这样设置
rm -r webapps
mv webapps.dist webapps
访问网址localhost:8080
tomcat是 纯Java HTTP Web服务器环境
安装MySql
ps -ef|grep mysql
运行容器前查看是否已经有运行的主机mysql实例
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run --name 'mysql' -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
-e MYSQL_ROOT_PASSWORD= 变量root用户密码
mysql 操作
登录 mysql -uroot -p
查询 show databases;
创建 create database db01;
使用 use db01;
建表 create table t1(id int,name varchar(20));
查询 show tables
写入 insert into t1 values(1,‘23’)
查询 select * from t1;
mysql控制台不能输入中文:
进入容器执行
locale 查看当前使用的字符集
locale -a 查看容器支持的字符集,我们需要使用C.UTF-8,所以在创建容器时要指定env LANG=C.UTF-8
容器内解决:echo "export LANG='C.UTF-8'" >> ~/.bashrc ; bash ;echo $LANG
创建容器时增加环境变量:docker exec -it mysql env LANG=C.UTF-8 mysql -uroot -p
运时容器中输入docker run -d mysql -e LANG="C.UTF-8"
show variables like 'character%'
查看容器中mysql的字符编码,不要在mysql工具上查看,因为不准确。
通常是linux发行版镜像字符不支持中文,而mysql是支持的。
解决中文乱码,和备份数据到宿主机
docker run
-d
-p 3306:3306
--privileged
-v /zzyyuse/mysql/log:/var/log/mysql
-v /zzyyuse/mysql/data:/var/lib/mysql
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
-e LANG="C.UTF-8"
--name mysql
mysql
docker run 后容器停止的原因
Upgrade after a crash is not supported. The redo log was created with Maria的解决办法
,mysql的data目录下存在老版本的文件。需要删除,ib_logfile0,ib_logfile1再运行
mysql数据路径
-v /zzyyuse/mysql/log:/var/log/mysql
-v /zzyyuse/mysql/data:/var/lib/mysql
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d
创建配置文件:/zzyyuse/mysql/conf/my.cnf或/etc/mysql/conf.d/my.cnf
文件内容:
[client]
default_character_set=utf8mb4
[mysqld]
collation_server=utf8mb4_general_ci
character_set_server=utf8mb4
加载配置文件要重启容器
MySql默认编码要设置为utf8mb4以支持中文
安装redis
docker run -d -p 6379:6379 --name redis
redis.conf文件修改
#127.0.0.1 #注释允许外地连接
requirepass 123 #开启密码
daemonize no #与容器run -d冲突,导致启动失败
#bind 127.0.0.1
appendonly yes #redis持久化
protected-mode no
docker run -it --network some-network --rm redis redis-cli -h some-redis
docker run -v /myredis/conf:/usr/local/etc/redis --name myredis redis redis-server /usr/local/etc/redis/redis.conf
docker run
-p 6379:6379
--name myr3
--privileged
-v /app/redis/redis.conf:/etc/redis/redis.conf
-v /app/redis/data:/data
-d
redis
redis-server /etc/redis/redis.conf 服务启动读取文件。。
Docker应用
一主一从,mysql应用
- 创建主服务器:
docker run -p 3307:3306 --name mysql-master --privileged -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 -e LANG=C.UTF-8 -d mysql
- 主服务器my.cnf配置文件
[mysqld]
## 同一网络server_id唯一
server_id=101
## 指定不同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小
binlog_cache_size=1M
## 设置使用二进制格式
binglog_format=mixed
## 二进制日志过期清理时间,默认0,不自动清理
binlog_expire_logs_seconds=7*3600=2592000
## 跳过主从复制中遇到 的所有错误或指定类型的错误,避免slave复制中断
##1062 主键重复
## 1032主从数据库数据不一致
slave_skip_errors=1062
-
创建数据同步用户
创建用户:mysql>create user ‘slave’@‘’%’ identified by ‘123456’
授权用户:msql> grant replication slave,replication client on . to ‘slave’@‘%’ -
创建从服务器
docker run -p 3308:3306 --name mysql-slave --privileged -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 -e LANG=C.UTF-8 -d mysql
- 从服务器my.cnf配置
[client]
port=3308
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
default_time-zone='+8:00'
character_set_client_handshake=FALSE
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_general_ci'
gtid_mode=ON
enforce_gtid_consistency=ON
## 同一网络server_id唯一
server_id=102
## 指定不同步的数据库名称
binlog_ignore_db=mysql
## 开启二进制日志功能
log_bin=mall_mysql_bin
## 设置二进制日志使用内存大小
binlog_cache_size=1M
## 设置使用二进制格式
binlog_format=mixed
## 二进制日志过期清理时间,默认0,不自动清理
binlog_expire_logs_seconds=2592000
## 跳过主从复制中遇到 的所有错误或指定类型的错误,避免slave复制中断
##1062 主键重复
## 1032主从数据库数据不一致
replica_skip_errors=1062
secure_file_priv=/var/lib/mysql
## 从机只读
read_only=1
## 中继日志
relay_log=mall_mysql_relay_bin
-
在主数据库查看主从同步状态
show master status
File: Position:开始位置,Binlog -
配置主从复制
change master to master_host='192.168.3.201',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall_mysql_bin.000003',master_log_pos=2512,master_connect_retry=30;
8.在从数据库中查看主从同步状态
show slave status \G
Slave_IO_Running:
Slave_SQL_Running:
9.从数据库开启主从同步
start slave;
同步状态错误:
Slave_IO_Running: Yes,Slave_SQL_Running: Yes 不为yes,,检查日志,一般是master_log_pos设置问题
3主3从redis应用,1-2亿条数据需要缓存,如何设置存储方案
单机不可能完成,采用redis方案:
1.哈希取余,缺点,扩缩容时的问题
2.一致性哈希算法分区,算法构建一致性哈希环(减轻底层变动影响
3.哈希槽分区,通常是采用这个方案
方案设定:3主3从:主6831~6383,从6384-6386
主从redis集群配置
创建容器
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis --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 --cluster-enabled yes --appendonly yes --port 6382
–net host 使用宿主机的IP和端口,默认
–privileged 获取宿主机的root用户权限
–cluster-enabled yes 开启集群
–appendonly yes 开启持久化
构建主从关系
进入容器
docker exec -it redis-node-1 bash
执行构建
redis-cli --cluster create 192.168.3.201:6381 192.168.3.201:6382 192.168.3.201:6383 192.168.3.201:6384 192.168.3.201:6385 192.168.3.201:6386 --cluster-replicas 1
–cluster-replicas 1 为每个master创建一个slave节点
查看集群信息命令
redis-cli -p6381
cluster info
cluster nodes
19eab8881d4979b6837e5195fc2f94416ba7ee57 192.168.3.201:6385@16385 slave 636dcd29b0b83213bfcde739737dc458aa0e8b92 0 1699081124860 3 connected
9b15618889161bc0c2560335c715cf5b4085edfd 192.168.3.201:6382@16382 master - 0 1699081123853 2 connected 5461-10922
7e57cda263f2c1e2183fe8b68cec85a5bf055aa4 192.168.3.201:6386@16386 slave 0db81a1e1d6b219b09a615cc65e3e9c22b9f3737 0 1699081120000 1 connected
a064d6a059657bda9a203eed6c9365f1914f5766 192.168.3.201:6384@16384 slave 9b15618889161bc0c2560335c715cf5b4085edfd 0 1699081123000 2 connected
636dcd29b0b83213bfcde739737dc458aa0e8b92 192.168.3.201:6383@16383 master - 0 1699081122845 3 connected 10923-16383
0db81a1e1d6b219b09a615cc65e3e9c22b9f3737 192.168.3.201:6381@16381 myself,master - 0 1699081122000 1 connected 0-5460
集群关系梳理,根据上面的信息得到主从关系,当前登录的主机为myself
m->s
81->86 0 1699081122000 1 connected 0-5460
82->84 0 1699081123853 2 connected 5461-10922
83->85 0 1699081122845 3 connected 10923-16383
数据读写存储测试
防止路由失效加参数-c 并新增两个key
登录6381主机
redis-cli -p6381 -c
单机连接超出槽位的显示moved
集群连接超出的槽位显示 redirected 跳转机器,然后返回
查看集群信息
redis-cli --cluster check 192.168.3.201:6381`
192.168.3.201:6381 (0db81a1e…) -> 0 keys | 5461 slots | 1 slaves. //在6381主机上 0 keys 1 slaves
[ok] 0 keys in 3 masters //共有 N keys 在集群中
容错切换迁移测试,
宕机停止6381,6386自动上位
7e57cda263f2c1e2183fe8b68cec85a5bf055aa4 192.168.3.201:6386@16386 master - 0 1699090042000 7 connected 0-5460
a064d6a059657bda9a203eed6c9365f1914f5766 192.168.3.201:6384@16384 slave 9b15618889161bc0c2560335c715cf5b4085edfd 0 1699090042925 2 connected
9b15618889161bc0c2560335c715cf5b4085edfd 192.168.3.201:6382@16382 myself,master - 0 1699090041000 2 connected 5461-10922
19eab8881d4979b6837e5195fc2f94416ba7ee57 192.168.3.201:6385@16385 slave 636dcd29b0b83213bfcde739737dc458aa0e8b92 0 1699090043933 3 connected
0db81a1e1d6b219b09a615cc65e3e9c22b9f3737 192.168.3.201:6381@16381 master,fail - 1699089911508 1699089907000 1 disconnected
636dcd29b0b83213bfcde739737dc458aa0e8b92 192.168.3.201:6383@16383 master - 0 1699090041917 3 connected 10923-1638
6381重启后,为slave,6386为master
主从扩容
阿里等的弹性计算就是这个
前提:哈希槽已经分配,要重新分配—槽位重分配
1.新建2容器
2.配置容器加入集群
进入新建的容器
redis-cli --cluster add-node 192.168.3.201:6387 192.168.3.201:6381
redis-cli --cluster add-node 自己的IP:6387 自己的ip:6381
3.从新分配槽号0-16383
redis-cli --cluster reshard 192.168.3.201:6381
根据提示操作
how many slots do you want to move 4096 (4 主4从 16384/4)怎么分配
what is the receiving node ID?分配给谁 6387对应的id a8bb6341d55930c12ccb023748937ca383d70ae3
all,yes
执行后是之前的每个主机分一些槽位给新加入的主机
4.从机挂到指定主机上
redis-cli --cluster add-node 192.168.3.201:6388 192.168.3.201:6387 --cluster-slave --cluster-master-id a8bb6341d55930c12ccb023748937ca383d70ae3
判断是否扩容成功,根据分配的槽位`
主从缩容
1.先删除从机.
redis-cli --cluster del-node 192.168.3.201:6388 8622b19ca29c8f6d9e3f6e9d58f2620e7c0cd267
redis-cli --cluster del-node ip:端口 id
2.将6387的槽号清空,统一分配给6381
redis-cli --cluster reshard 192.168.3.201:6381
how many slots do you want to move ? 4096
what is the receiving node ID? 6381 的ID 7e57cda263f2c1e2183fe8b68cec85a5bf055aa4
source node #1: a8bb6341d55930c12ccb023748937ca383d70ae3
source node #2: done 结束
3.从集群中删 除主机
使用Dockerfile编排容器
构建docker镜像的文本文件,构建镜像所需的指令组成
docker commit 与docker file
commit 只适合简单应用,对于复杂应用,随时变化,的很麻烦
构建三步:
1.编写dockerFile文件
2.docker build
3.docker run
构建过程
每条保留字指令都必须大写字母
指令按从上到下顺序执行
#表示注释
每条指令都会创建一个镜像层并对镜像提交
执行docker file过程
从基础镜像运行一个容器
执行一条指令并对容器作出修改
执行类似docker commit 的操作提交一个新的镜像层
再基于刚提交的镜像运行一个新容器
执行下一条指令,到所有指令执行完成
Dockerfile指令
FROM 基于哪个镜像构建。指定一个已经存在的镜像为模板,Dockerfile第一条指令
LABEL 元数据添加到镜像 替代maintainer
LABEL "com.example.vendor"="ACME Incorporated"
LABEL version="1.0"
LABEL description="This text illustrates that."
LABEL author=jiangbo
RUN 容器构建的时需要运行的命令,两种格式,
shell等于在终端中执行shell命令
exec使用JSON格式 RUN [“./test.php”,“dev”,“offline”] ~= RUN ./test.php dev offline
RUN是在构建时运行
EXPOSE当前容器对外暴露的端口
WORKDIR 指定在创建容器后,终端默认登陆后进来工作的目录,落脚点(类似打开cmd出现的c:\user\350902>
USER 指定镜像以什么样的用户去执行,默认root
ENV在构建过程中设置环境变量
ENV MY_PATH /usr/mytest
WORKDIR $MY_PATH
ADD 将宿主机目录下的文件拷贝到镜像且会自动处理URL和解压tar压缩包(copy和解压的合体
COPY 拷贝文件 和目录到镜像中,从构建上下文目录中《源路径》文件、目录复制到新的一层的镜像内的《目标路径》位置
CMD 指定容器启动后要做的事情,多个CMD只生效最后一个(cmd会被docker run 参数替换)
ENTRYPOINT 类似CMD指令,容器启动后要运行的指令,但指令不会被docker run 后面的命令覆盖。而且这些命令参数会被当作参数送给entrypoint指令指定的程序,ENTRYPOINT和CMD一起使用相当于CMD给ENTRYPOINT指令传参(变参)
ENTRYPOINT [命令,参数1,参数2]
VOLUME 指定临时文件目录 VOLUME /tmp
案例centos+vim+ifconfig+jdk
# 构建的初始镜像,已经下载好
FROM centos:latest
# 镜像制作人
LABEL author=zzyy<zzyybs@126.com>
# 容器启动后的工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH
# 设置并更新yum源
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum clean all
RUN yum makecache
RUN yum update -y
# 安装vim命令,编辑文本
RUN yum -y install vim
# 安装ifconfig命令,查看网络信息
RUN yum -y install net-tools
# 安装java相关基础
RUN yum -y install glibc.i686
# 建立java目录
RUN mkdir -p /usr/local/java
# 添加java到java目录并解压
ADD jre-8u391-linux-x64.tar.gz /usr/local/java
# 以下是设置JAVA变量相关
ENV JAVA_HOME /usr/local/java/jdk1.8.0_391
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAR_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
# 暴露端口
EXPOSE 80
# 容器启动后要做的事
CMD echo $MYPATH
CMD echo "success..........ok"
CMD /bin/bash
构建镜像
docker build -t centosjava8:1.5 .
构建过程的错误:需要修改yum源
Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist
修改yum源
修改为阿里云
1.备份本地yum配置文件/etc/yum.repos.d/
mkdir back
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
2.下载阿里云yum源配置文件到/etc/yum.repos.d/CentOS-Base.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
3.修改yum配置文件保存退出
vim /etc/yum.repos.d/CentOS-Base.repo
4.在vim的命令模式下执行查找替换:%s/mirrors.cloud.aliyuncs.com/mirrors.aliyun.com/g
%s/$releasever/$releasever-stream/g
5.更新yum配置文件
yum clean all
yum makecache
yum update -y
二、因为可以直接访问外网,可以修改为以下内容
1.进入到 yum 的 repos 目录
2.修改 centos 文件内容
3.更新缓存
cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum clean all
yum makecahce
yum update -y
docker network命令
为什么要network命令,如果用ip地址,当环境变化时,造成数据丢失
容器连接到网络
connect
创建网络
create 创建网络 --network bridge --network container:容器名称或id
断开网络
disconnect 断开容器与网络的连接
网络详情
inspect 显示网络详细信息
docker network inspect u2|tail -n 20 查看最后的20条目?
列出网络
ls 列出网络
删除网络
prune 删除所有未使用的网络
rm 删除网络
默认创建的3个网络模式
6e726791ed9a bridge bridge local 容器连接docker0,虚拟网桥,默认模式
7c1fffa2aa20 host host local 容器使用宿主机的IP和端口
2fd23299ea33 none null local 容器有独立的network namespace,但没有任何设置
docker网络类型
container
新建的容器不会创建自己的网卡和配置自己的IP,和一个指定的容器共享IP,端口范围
bridge
在内核层连通了物理或虚拟网卡,将宿主机和容器放在同一网络,docker0指定了ip和submask
bridge:网桥端 veth—eth容器端 通过ip addr 查看veth宿主机,eth容器内
host docker run --network hosts 宿主看host没有ip,,容器内与宿主一样。没有端口映射
none 禁用网络功能,没有网卡,ip,只有lo。
container和容器共享ip设置–network container:tomcat85 不适用配置了端口的应用,如果被共享的容器断开网络,共享的容器也断开了。
自定义网络通信
没有自定义网络:只能ping IP,如果某个ip容器宕了,IP可能被复用导致错误
1.新建自定网络 docker network create zzyy_network
2.新建容器加入自定网络 --network zzyy_network
使用compose容器编排
参考文档地址
https://docs.docker.com/compose/compose-file/compose-file-v3/
https://docs.docker.com/compose/install
对容器集群的快速编排,统一管理多个容器,管理启动顺序和加载条件及要求。写好多个容器关系
容器编排文件
docker-compose.yaml
核心概念
服务:一个容器应用实例
工程:一组关联容器应用实例,一个完整业务单元
使用
1.编写Dockerfile
2.使用docker-compose.yaml
3.docker-compose up
yaml文件参考
version : “3”
services:
microService:
image: zzyy_docker:1.6
container_name:ms01
ports:
- “6001:6001”
volumes:
- /app/microService:/data
networks:
- atgugu_net
depends_on:
- redis
- mysql
redis:
image:redis:6.0.8
ports:
- “6379:6379”
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- app/redis/data:/data
networks:
- atguigu_net
command: redis-server /etc/redis/redis.conf
mysql:
image:mysql:5.7
environment:
MYSQL_ROOT_PASSWORD:‘123456’
MYSQL_ALLOW_EMPTY_PASSWORD:‘no’
mysql_DATABASE:‘db2021’
MYSQL_USER:‘zzyy123’
ports:
- ‘3306:3306’
volumes:
- /app/mysql/db:var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/mycnf
- /app/mysql/init:/docer-entrypoint-initdb.d
networks:
- atuigu_net
command: --default-authentication-plugin=mysql_native_password
轻量级可视化工具portainer
仅适用单机
多容器后要求的功能:1.监控 2.统计
www.portainer.io
www.portainer.io/v/ce-2.9/start/install/server/docker/linux
docker run -p 8000:8000 -p 9000: 9000 --restart always