docker-image.jpg

Docker

linux中的一些常用的命令和相关知识点

  1. linux系统常用的几个文件夹目录
home  #常用的文件目录
opt		#第三方软件安装位置
root	#默认的根目录
tmp 	#临时的文件
etc		#默认配置文件的地址
bin   #二进制文件

2.linux系统常用的几个命令

cd /    #切换到根目录
cd /bin	#切换到bin目录下面
ls      #列出当前目录下的文件列表
pwd     #显示当前工作目录的路径
mkdir ***   # 创建目录
rmdir ***		# 删除目录
rm    ***   #删除文件后者是目录
cp    ***   #复制文件或者目录
mv    ***   #移动或者重命名文件
touch ***   #创建新的文件
vim		***   #修改文件内容
cat   ***   #在外部看见文件内容
head  ***   #显示文件开头的内容
tail  ***   #显示文件结尾的内容
ifconfig  #显示网络配置
ping      #测试网络链接

准备工作

docker 官网地址:https://www.docker.com
下载地址:https://docs.docker.com/get-docker/
命令帮助文档地址:https://docs.docker.com/engine/reference/commandline/docker/
我选择的是腾讯的轻量应用服务器118一年的开箱即用的 https://cloud.tencent.com/
如果选择服务器 那么下载Xshell进行 免费下载使用的 只要注册一下就可以
链接 https://www.xshell.com/zh/free-for-home-school/
Xshell官网打不开的话 这里有个网盘链接试试:
链接:https://pan.baidu.com/s/1NJGWZHkByakOkQpKfkc7Yg?**提取码:r0ds

修改镜像源

原因:由于docker默认的源为国外官方源,下载速度较慢,所以在学习和使用中可改为国内的镜像源,这样速度会提高很多
注意 如果是直接买的腾讯或者是阿里的容器服务 其内已经被修改为国内。
修改或新增/etc/docker/daemon.json 文件
vi/etc/docker/daemon.json
添加需要修改的国内镜像源镜像源 ***这里如果修改不了 按 i 键应该可以输入
{
“registry-mirrors”:[“http://hub-mirror.c.163.com”] ##目前这里的是外网的地址
}
Docker 官方中国区https://registry.docker-cn.com
网易镜像源:http://hub-mirror.c.163.com
中国科技大学镜像源:https://docker.mirrors.ustc.edu.cn
阿里云镜像源:https://developer.aliyun.com/mirror/
建议使用阿里的
修改完成后 按shift+Esc 接着输入wq 回车

Docker中一些常用的命令

docker ps //查看当前运行容器
docker ps -n 4 只看最近创建的4个容器
进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
 #命令
 docker exec -it 容器 id bashShell
 #实例
#方式二
 docker attach 容器ID
# docker exec          //进入容器开启新的终端 可以在里面操作
 # docker attach     //进入当前正在运行的容器

从容器拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
进入镜像后输入:Ctrl+Q+P 可以让镜像在退出后依然运行
docker ps -a //查看历史创建镜像

docker version   # 显示版本信息
docker info      # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 -- help  #万能命令‘’

docker images 查看所有本地主机上的镜像

docker search name 搜索镜像

docker pull centos(容器命令) 下载容器命令
新建容器并启动
docker run [可选参数] image
–name 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
#
/bin/bash 是一个指令框(个人理解)

docker run -it centos /bin/bash           #-it 后跟容器名
#从容器退回主机
exit

列出所有运行的容器

#列出当前正在运行的容器
# -a  #列出当前正在运行的容器+和历史运行过的容器
# -n  #显示最近创建的容器

退出但不停止容器
Ctrl +P+Q #容器不停止但退出

删除容器

docker rm 容器ID   				#删除指定的容器 如果要强制删除 rm -f
docker rm -f $(docker ps -aq)  #删除指定容器
docker ps -a -q|xargs docker rm #删除所有容器

查询由指定镜像创建容器

docker ps --filter ancestor=tomcat

nginx下载 用来做负载均衡

搜索镜像
docker search nginx 搜索镜像
docker pull nginx 拉取镜像
docker images 查看镜像是否下载成功
# -d 后台运行
# --name 给容器起名字
# -p 宿主机端口
docker run -d --name nginx01 -p 3344:80 nginx 启动
curl localhost:3344
# 进入nginx
docker exec -it nginx01 /bin/bash

安装tomcat

直接在根目录下启动
下载启动
#docker pull tomcat
启动运行
#docker run -d -p 3355:8080 --name tomcat01 tomcat
a53a45fd42a53fefdedac345c1a52281edf1b20c3036da8c5b49b56c352154b6
#docker exec -it tomcat /bin/bash
进入容器
#docker exec -it tomcat01 /bin/bash
发现问题:1、Linux命令少了 没有webapps
首先我使用的是虚拟机,不能和别一样直接在网页上访问,所以需要更改一下虚拟机的配置,需要在虚拟网络编辑器上进行更改,将虚拟机映射在本地主机上,
还有一个问题:无法外部访问 解决方法:应该是服务器的防火墙拦截了请求,去相关页面(服务器的控制器台)找到防火墙将其放行

屏幕截图 2023-12-06 112444.png

部署es + kibana

es 暴露的端口很多
es 十分的耗内存
es 的数据一般需要放置到安全目录 挂载
–net somenetwork 网络配置
#下载并启动
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -e ES_JAVA_OPTS=“-Xms64m -Xmx512m” elasticsearch:7.6.2
启动 会很卡 所以限制了大小并且配置了环境变量
查看 docker stats
这里需要增加–privileged=true,也就是让docker有root权限启动容器
docker run --name elasticsearch --privileged=true -p 9200:9200 -p 9300:9300 <br />-e “discovery.type=single-node” <br />-e ES_JAVA_OPTS=“-Xms64m -Xmx512m” <br />-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml <br />-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data <br />-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins <br />-d elasticsearch:7.9.2
出现的问题:
第一个:docker: Error response from daemon: driver failed programming external connectivity on endpoint elegant_ptolemy (7fe85ca6bd744449ff82b81c1577d73b6821c4e51780c8238fad6aa0cb940522): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8004 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
原因是:docker服务启动时定义的自定义链docker由于某种原因被清掉
重启docker服务及可重新生成自定义链DOCKER
[root@docker ~]# systemctl restart docker
[root@docker ~]# docker run -it -p 8004:80 nginx:latest /bin/bash
root@92ce7cee184c:/#
root@92ce7cee184c:/#
第二个问题: 这个是进行资源的限制
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -e ES_JAVA_OPTS=“-Xms64m -Xmx512m” elasticsearch:7.6.2
名字被重复占用需要改名字,那么elasticsearch这里需要改名字 随便加点东西

使用 docker stats 查看内存损耗进程
image.png
使用Ctrl+C退出当前进程

[root@localhost /]#  curl localhost:9200
{
  "name" : "bc75aafe5b6d",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "06kr24RITIO4hKQ17jJEww",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

KIibana 访问 ES
通过内网IP地址 网络相关知识

可视化
portainer(先用着)

docker run -d -p 8080:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

Rancher (CI和CD再用)

portainer是一个图形化管理界面工具,提供一个后台面板供我们操作
docker run -d -p 8080:9000 <br />–restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
外网访问需要购买服务器 就算了 可以自己进行内网访问
curl localhost:8080;(自己设置的端口号,就是上面命令里面的8080)

Docker运行Redis

一:Docker安装Redis

docker search redis

### 二:Docker拉取镜像
docker pull <镜像名称>:<版本号>

docker pull redis

三:Docker挂载配置文件

接下来就是将redis到的配置文件进行挂载,以配置文件方式启动redis容器。(挂载:即将宿主的文件和容器内部目录相关联,相互绑定,在宿主机内修改文件的话也随之修改容器内部文件)
1)、挂载redis的配置文件
2)、挂载redis的持久化文件
因为 redis 默认配置你会发现只能够本地连接,不能进行远程访问,使用 Redis Desktop Manager连接都会报错,因此需要手动挂载 redis 配置文件
新建data和conf两个文件夹,位置随意。

mkdir -p /home/redis/data
mkdir -p /root/docker/redis/conf

四:增加配置文件redis.conf

在刚才新建的redis/conf中新建文件redis.conf,内容如下:

bind 0.0.0.0		# 只允许来自bind指定网卡的Redis请求。如没有指定,则可以接受来自任意一个网卡的Redis请求
protected-mode no
port 6379				#redis的默认端口号
tcp-backlog 511
timeout 0				# 连接超时时间,单位秒;超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0

# tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值
# 使用keepalive有两个好处:
#  1) 检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。
#  2) 在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需两倍的设置值
tcp-keepalive 0
loglevel notice	#日志文件的等级
logfile ""			#日志文件的位置 这里没有配置
databases 16		#redis默认的数据库是16个

# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# 注释掉“save”这一行配置项就可以让保存数据库功能失效
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化) 
# 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化) 
# 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
save 900 1
save 300 10
save 60 10000

# 当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作
stop-writes-on-bgsave-error yes

# 指定存储至本地数据库时是否压缩数据,耗cpu资源,默认为yes,Redis采用LZF压缩
# 如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes

# 保存rdb文件时,是否进行错误检查校验。
# 从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性
# 但是在保存rdb文件的时候,会有大概10%的性能损耗,如果你追求高性能,可以关闭该配置。
rdbchecksum yes
dbfilename dump.rdb
dir ./	 	# 数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录							
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100

# AOF持久化,指定是否在每次更新操作后进行日志记录,默认redis是异步(快照)的把数据写入本地磁盘
# redis默认使用的是rdb方式持久化,此方式在许多应用中已足够用。
# 但redis如果中途宕机,会导致可能有几分钟的数据丢失,按照上面save条件来策略进行持久化
# Append Only File是另一种持久化方式,可提供更好的持久化特性。
# Redis会把每次写入的数据在接收后都写入appendonly.aof 文件
# 每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
appendonly yes
appendfilename "appendonly.aof"  #指定文件名称
appendfsync everysec   #AOF的三种持久化方式 no:不同步,always:每次数据变化写入,everysec:每秒中写入
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100	
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000		# slog log是用来记录redis运行中执行比较慢的命令耗时。
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""

hash-max-ziplist-entries 512		# 哈希表中元素(条目)总个数<=512个,采用ziplist,否则使用hash
hash-max-ziplist-value 64				# 哈希表中每个value的长度<=64字节时,采用ziplist,否则使用hash
list-max-ziplist-size -2
list-max-ziplist-entries 512		# list元素<=512个,采用ziplist,否则用linkedlist
list-max-ziplist-value 64				# list内某个元素大小<=64字节时,采用ziplist,否则用linkedlist
list-compress-depth 0
set-max-intset-entries 512			# set内元素数量<=512个,且都是整数型值,采用inset,否则使用hashtable
zset-max-ziplist-entries 128		# zset内元素数量<=128个,采用ziplist,否则用skiplist跳表
zset-max-ziplist-value 64				# zset内某个元素大小<=64字节时,采用ziplist,否则用skiplist跳表
hll-sparse-max-bytes 3000

# Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。
# 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话
# 把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
# 指定是否激活重置哈希,默认为开启
activerehashing yes

client-output-buffer-limit normal 0 0 0		# 对客户端输出缓冲进行限制,可以强迫那些不从服务器读取数据的客户端断开连接

# 对于slave client和 MONITER client,如果client-output-buffer一旦超过256mb
# 又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit slave 256mb 64mb 60

# 对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,
# 那么服务器就会立即断开客户端连接。
client-output-buffer-limit pubsub 32mb 8mb 60

# redis执行任务的频率为1s除以hz。
hz 10

# 在AOF重写时,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。
# 这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。
aof-rewrite-incremental-fsync yes 

requirepass 123456  ##设置密码 123456  可以更改

#这几个逼不能随便用,这样配置是把这几个家伙禁用了
rename-command FLUSHALL ""
rename-command FLUSHDB  ""
rename-command CONFIG   ""
rename-command KEYS     ""

五:创建容器并启动

docker run --name redis -p 8081:8081 
						-v /root/docker/redis/data:/data 
      			-v /root/docker/redis/conf/redis.conf:/etc/redis/redis.conf 
         		-d redis redis-server /etc/redis/redis.conf  

–name:给容器起一个名
-p:端口映射 宿主机:容器
-v:挂载自定义配置 自定义配置:容器内部配置
-d:后台运行 redis-server --appendonly yes: 在容器执行redis-server启动命令,并打开redis持久化配置
查看是否启动成功 docker -ps

2023年11月16号 补记

1、为了保险,我们一般通常会给redis设置密码。之前的服务一直没有密码的。设置密码后登陆的方式和命令有一点不一样

[root@VM-4-12-centos conf]# docker exec -it 8bf3 /bin/bash
root@8bf3152fd931:/data# redis-cli -h 106.54.224.114 -p 6379

2、第二点 我的数据会被清空缓存,但数据并没有保存下来,所以我在配置文件下面添加了两行禁止flush的指令

rename-command FLUSHALL ""
rename-command FLUSHDB ""

注意 完成上面的指令要重启容器才能生效

启动客户端

[root@VM-4-12-centos /]# docker exec -it 7d92cf78dff1 /bin/bash
root@7d92cf78dff1:/data# redis-cli -h 106.54.224.114 -p 6379 -a 123456 2>/dev/null
127.0.0.1:6379> 

-a 后跟的密码

六:容器内部连接进行测试

sudo docker exec -it 757225638cab /bin/bash

docker exec -it redis redis-cli

进入容器后 可以测试一下密码

127.0.0.1:6379> auth 123456
OK

6.尝试进行删除redis容器
1.查看所有在运行的容器:

docker PS -a

2.停止运行Redis。停止命令

docker stop <容器ID或名称>

curl localhost:5000
curl: (7) Failed connect to localhost:5000; Connection refused

七:进行外部redis的连接

RedisInsight 这是redis官方推荐的 也是免费使用的
下载链接:https://redis.io/docs/connect/insight/
双击打开 点击
image.png
会出现下面的弹窗,输入对应的服务器地址和端口号,先进行测试链接 然后再点击 Add Redis Database
image.png

如何提交一个自己的镜像 commit镜像

docker commit 提交容器成为一个新得副本
docker commit -m="提交的描述信息” -a=“作者” 容器id 目标镜像名:【】



容器数据卷的挂载

让数据可持久化,避免删除容器的时候把数据删除。
需求:让数据mysql可以存储在本地
以上的需求就是数据卷的挂载,它是一种数据同步技术。
总结:容器的持久化和同步操作!容器间也是可以数据共享的;就是一个双向绑定

使用数据卷

方式一:直接使用命令进行挂载 -v(volumes):
docker run -it -v 主机目录:容器目录 //shell
docker run -it -v /home/ceshi:/home centos /bin/bash
image.png
其主要思想就是在一个指定目录下创建一个目录,上面的命令就是在home目录下面创建一个ceshi 文件并同时创建一个容器里面的home目录并将数据挂载到ceshi文件中

dokcer inspect 容器ID 用来查看容器是否挂载成功 在容器外使用
屏幕截图 2023-11-07 102113.png

docker attach 容器ID 进入容器
  1. docker attach:
    • docker attach 命令用于附加到正在运行的容器的标准输入、输出和错误流(STDIN/STDOUT/STDERR)上。这意味着你可以看到容器实际的输出,并且能够向容器发送输入。
    • 在使用 docker attach 后,你将直接连接到容器的标准输入输出流,类似于在终端中直接操作容器。但是需要注意的是,一旦你退出了 docker attach,容器并不会停止运行。
  2. docker exec:
    • docker exec 命令用于在正在运行的容器内部执行指定的命令。这个命令允许你在容器内部启动新的进程,而不影响容器原本正在运行的进程。
    • 通过 docker exec,你可以在容器内部执行各种命令,比如查看容器内部的文件、安装软件、调试等操作。执行完命令后,容器的状态并不会受到影响。
    • docker exec -it 容器id /bin/bash

个人理解:测试容器本身的数据之类的东西 使用:docker attach
:调试一些容器命令使用:docker exec

在容器内部创建的文件,外部也会有相同的文件,在外部文件中写数据会同步到内部文件中。在内部文件中写数据也会同步到外部文件

安装MySQL
思考:数据的持久化
docker pull mysql

执行数据卷的挂载和MySQL的密码配置
docker run -d -p 3301:3306 -v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
–name mysql01 mysql
第一个-v 是将MySQL的配置数据挂载出来,前面的是外部文件 后面的是MySQL的配置文件地址
第二个-v是将MySQL的数据进行挂载出来,前面的是外部文件,后面的是MySQL的数据存放地址
-e 是MySQL的环境配置,如密码
启动成功之后;别忘了将3301这个端口放行;之后再使用navicat链接数据库
主机地址:106.54.224.114
链接成功后 在本地 也就是navicat中创建一个数据库,然后再对应数据卷中查看数据库 /home/mysql/data(这是上面数据库挂载的外部目录)

具名挂载和匿名挂载

-v 容器内路径
docker run -d -p --name nginx01 -v /etc/nginx nginx 这只有容器内部的目录
具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/neginx nginx

docker volume ls 显示具名挂载信息 可以找到具名挂载的信息

Dockerfile

Dockerfile构建一个docker镜像
通过一个脚本生成一个镜像,镜像是一层一层的。

FROM centos

VOLUME ["volume01","volume02"]

CMD echo  "---end----"
CMD /bin/bash

1.创建一个dockerfile文件 写入上面的指令 这是再创建镜像的时候就挂载了
image.png
指令执行生成镜像的时候自动挂载的,数据卷目录,外面一定有一个同步目录,但没有名字,匿名挂载。

image.png
在外部创建文件
image.png
匿名挂载的数据里面有相同的文件
image.png

数据卷容器


–volumes-from 指令
image.png
通过–volumes-from 实现容器之间的数据共享
这是一个双向拷贝的过程
按照这种方式 可以实现多个数据库的共享

##启动第一个容器
docker run -d -p 3301:3306 -v /home/mysql/conf:/etc/mysql/conf.d 
                           -v /home/mysql/data:/var/lib/mysql 
                           -e MYSQL_ROOT_PASSWORD=123456 
                           --name mysql01 mysql
##启动第二个容器的时候
docker run -d -p 3301:3306  
                           -e MYSQL_ROOT_PASSWORD=123456 
													 --name mysql02   --volumes-from mysql01  mysql

创建第二个容器的时候不需要配置信息 只需要 --volume-from 挂载

DockerFile

dockerfile是用来构建doker镜像文件的 命令参数脚本
构建步骤:
1.编写一个dockerfile文件
2.docker build 构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像(DockerHub 。阿里镜像仓库)

Dockerfile的构建过程

基础知识
1.每个关键字(指令)都必须是大写字母
2.执行从上到下顺序执行
3.#表示注释
4.每一个指令都会创建一个新的镜像层,并提交
dockerfile是面向开发的,
步骤:开发,部署,运维
DockerFile:构建文件,定义了一切的步骤。
Dockerimages: 通过Dockerfile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像云的起来提供服务

DockerFile的指令

FROM      #基础镜像,一切从这里开始 centos
LABEL  #谁写的 名字+邮箱
RUN  #需要运行的指令
ADD  #步骤:tomcat镜像,这个tomcat压缩包! 添加内容
WORKDIR #镜像的工作目录
VOLUME  # 挂载的位置
EXPOSE  #暴露端口
CMD  #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加
ENV  #构建的时候设置环境变量
FROM centos
LABEL  huangchang<1556618318@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----end----"
CMD /bin/bash             

通过这个文件进行构建一个镜像

docker build -f mydockerfile -t centos:0.1 .

报错
Error: Failed to download metadata for repo ‘appstream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist
原因:centos8是在21年12月31日停止了源的服务导致,所以只能重新拉取centos7的镜像,即把命令修改了下,拉取centos:7
修改DockerFile文件的centos版本为7
官方的镜像功能很少 ,dockerfile执行后 这样会实现centos的一些功能

CMD 和ENTRYPOINT区别

CMD  #指定这个容器启动的时候要运行的命令,只有最后一个指令会生效,可被替代
ENTRYPOINT  #指定这个容器启动的时候要运行的命令,可以追加

CMD 的 在运行的时候 执行新的指令就会错
image.png
运行时,会执行dockerfile的文件指令。但再运行的时候追加了一个指令 则只运行最后一个指令。
image.png

发布镜像到阿里云容器服务

登录阿里云,找到容器镜像服务,个人可以免费创建三个,找到命名空间,创建命名空间。然后找到镜像仓库,直接创建镜像仓库。
配置密码的操作步骤:

  1. 登录容器镜像服务控制台
  2. 在顶部菜单栏,选择所需地域。
  3. 在左侧导航栏,选择实例列表
  4. 实例列表页面单击目标企业版实例。
  5. 在企业版实例管理页面左侧导航栏选择实例管理 > 访问凭证
  6. 访问凭证页面,单击设置固定密码
  7. 设置固定密码对话框中,输入密码确认密码。然后单击确定
将镜像推送到Registry

$ docker login --username=儒曦马卡龙 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ru-xi/docker-centos:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/ru-xi/docker-centos:[镜像版本号]

docker0网络

ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:00:78:05:b5 brd ff:ff:ff:ff:ff:ff
    inet 10.0.4.12/22 brd 10.0.7.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe78:5b5/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:92:2a:8e:bc brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:92ff:fe2a:8ebc/64 scope link 
       valid_lft forever preferred_lft forever

lo:本机回环地址
eth0:阿里云内网地址
docker0:docker0 地址

问题:docker是如何处理容器网络访问的?

每个容器都会有一个ip

查看容器的IP地址的时候报错

[root@VM-4-12-centos /]# docker exec -it tomcat02 ip addr
OCI runtime exec failed: exec failed: container_linux.go:380:
starting container process caused: exec: "ip": 
executable file not found in $PATH: unknown

docker在Hub上下载的是精简版的,所以没有对应的指令功能
在容器内部执行:

apt update
apt install -y iproute2

对容器使用ping报错

[root@VM-4-12-centos /]# docker exec -it tomcat02 ping 172.18.0.2
OCI runtime exec failed: exec failed: container_linux.go:380: 
starting container process caused: exec: "ping": 
executable file not found in $PATH: unknown

在容器内部执行下载ping指令

apt-get update
apt install iputils-ping

结果执行 执行链接的IP地址172.17.0.9 这个地址是54 的 网络地址10-16因为防火墙的原因是ping不通的 只有1-9可以用

[root@VM-4-12-centos /]# docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
54: eth0@if55: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.10/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@VM-4-12-centos /]# docker exec -it tomcat02 ping 172.17.0.9
PING 172.17.0.9 (172.17.0.9) 56(84) bytes of data.
64 bytes from 172.17.0.9: icmp_seq=1 ttl=64 time=0.102 ms
64 bytes from 172.17.0.9: icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from 172.17.0.9: icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from 172.17.0.9: icmp_seq=4 ttl=64 time=0.055 ms
64 bytes from 172.17.0.9: icmp_seq=5 ttl=64 time=0.055 ms
64 bytes from 172.17.0.9: icmp_seq=6 ttl=64 time=0.058 ms

上面的两个问题可以直接在一起解决

apt update
apt install -y iproute2
apt-get update
apt install iputils-ping

有一个服务,项目不重启,数据区ip地址换掉了。如何通过名字来进行访问容器。
[root@VM-4-12-centos /]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

但经过–link 链接

[root@VM-4-12-centos /]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
[root@VM-4-12-centos /]# docker exec -it tomcat03 ping tomcat02

可以ping通的,但这是单向的,反过来就ping不通
查看host的配置
image.png
可以看到tomcat02被指定地址了 所以 tomcat03 可以 ping tomcat02
现在已经不使用这种技术了。

自定义网络

image.png
subnet是子网配置
image.png
重新创建两个容器 以我们自己创建的网络为主
image.png
看这次我们的容器数据里面有俩数据,就是我们创建的容器。
image.png
这一次可以用名字直接ping通了 上一次的那个就不行
如何将tomcat-01和tomcat-net-01 链接
image.png
将Docker0和mynet联通
查询由指定镜像创建的容器

docker ps --filter ancestor=tomcat

image.png
将tomcat01链接到mynet网络上
image.png

docker network inspect mynet

联通之后直接将tomcat01 加入到mynet 一个容器两个ip
image.png
image.png
连通了

实战redis部署集群

分片 + 高可用 +集群
创建一个redis的网卡

[root@VM-4-12-centos /]# docker network create redis --subnet 172.38.0.0/16
678fbdf4ec1b0f163275ee514ad444d4af1f6e5d73fbb738444cb7c8c7075336

通过脚本创建六个redis配置

for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
cat  <<EOF>/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enable yes
cluster-config-filter nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

image.png
运行数据

docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc.redis.redis.conf \
-d --net redis --ip 172.38.0.11 redis:latest redis-server /etc/redis/redis.conf

docker run -p 6372:6379 -p 16372:16379 --name redis-2 <br />-v /mydata/redis/node-2/data:/data <br />-v /mydata/redis/node-2/conf/redis.conf:/etc.redis.redis.conf <br />-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc.redis.redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6376:6379 -p 16376:16379 --name redis-6 <br />-v /mydata/redis/node-6/data:/data <br />-v /mydata/redis/node-6/conf/redis.conf:/etc.redis.redis.conf <br />-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

启动Redis 注意 redis启动的最后是 /bin/sh

遇到问题 无法启动redis

错误日志

[root@VM-4-12-centos redis]# docker logs 85250ea12635
1:C 11 Nov 2023 14:05:52.387 # Fatal error, can't open config file '/etc/redis/redis.conf'
1:C 11 Nov 2023 14:06:37.786 # Fatal error, can't open config file '/etc/redis/redis.conf'

无法找到配置文件

Docker Compose

Docker Swarm

扩缩容

Docker Stack

Docker Secret

Docker Config

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐