【Docker笔记】

文章目录

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页面错误原因
  1. 映射端口,防火墙
  2. 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应用

  1. 创建主服务器:
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
  1. 主服务器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
  1. 创建数据同步用户
    创建用户:mysql>create user ‘slave’@‘’%’ identified by ‘123456’
    授权用户:msql> grant replication slave,replication client on . to ‘slave’@‘%’

  2. 创建从服务器

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
  1. 从服务器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
  1. 在主数据库查看主从同步状态
    show master status
    File: Position:开始位置,Binlog

  2. 配置主从复制

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值