首页 > 其他分享 >Docker 进阶

Docker 进阶

时间:2023-07-23 15:11:27浏览次数:27  
标签:容器 进阶 -- redis r7ftf 镜像 docker Docker

要暂停名为 “my-container” 的容器,可以运行以下命令:

docker pause my-container

暂停后,容器的所有进程将被挂起,不再执行任何操作。

要恢复暂停的容器并使其继续运行,可以使用 命令:docker unpause

docker unpause my-container

练习

# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
root@r7ftf-virtual-machine:/home# docker run -d --name nginx01 -p 3344:80 nginx
7985a27c68199d77d5629991a2bd452b16146683414fef47819b8735c510b544
root@r7ftf-virtual-machine:/home# docker ps
CONTAINER ID   IMAGE     COMMAND                 CREATED         STATUS         PORTS                                   NAMES
7985a27c6819   nginx     "/docker-entrypoint.…"   15 seconds ago   Up 14 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
#本机自测
root@r7ftf-virtual-machine:/home# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#进入容器
root@r7ftf-virtual-machine:/home# docker exec -it nginx01 /bin/bash
root@7985a27c6819:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

docker 来装一个tomcat

#一般用来测试,用完就删除
docker run -it --rm tomcat:9.0
#启动运行(常用)
docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
root@r7ftf-virtual-machine:/home# docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0
98a1cf261c1614e743e0957b51cd8ca7130526c090579a5ff1c9db4f7f148339
#进入容器
root@r7ftf-virtual-machine:/home# docker exec -it tomcat01 /bin/bash
root@98a1cf261c16:/usr/local/tomcat# ls
BUILDING.txt README.md conf temp
CONTRIBUTING.md RELEASE-NOTES lib webapps
LICENSE RUNNING.txt logs webapps.dist
NOTICE bin native-jni-lib work

部署es + kibana

#es 暴露的端口很多!
#es 十分的耗内存
#es 的数据一般需要放置到安全目录!挂载
# --net somenetwork ? 网络配置

#启动 elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=singlee-none" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

#docker stats 查看cpu状态

 

commit镜像

docker commit 提交容器成为一个新的副本

docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

容器数据卷

主机目录和容器目录是相互绑定的,以后修改在本地修改即可,容器内会自动同步!

#指定路径挂载 -v
docker run -it -v 主机目录:容器目录

root@r7ftf-virtual-machine:/home# docker run -it -v /home/cs:/home/ centos /bin/bash
[root@c2cb95334985 /]# cd home/
[root@c2cb95334985 home]# ls
cs r7ftf
[root@c2cb95334985 home]# touch test
[root@c2cb95334985 home]# ls
cs r7ftf test
[root@c2cb95334985 home]# exit
exit
root@r7ftf-virtual-machine:/home# ls
cs libteest.a max.h qrs r7ftf r7ftf.java tst
root@r7ftf-virtual-machine:/home# cd cs
root@r7ftf-virtual-machine:/home/cs# ls
cs r7ftf test

具名和匿名挂载

#匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有的 volume(卷) 的情况
docker volume ls

#具名挂载
-v myvolume(卷名):/app/data(容器内路径)
所有的docker容器内的卷,没有指定目录的情况下都是在'/var/lib/docker/volumes/容器名/_data'

拓展:

#通过-v容器内路径:ro rw改变读写权限
ro readonly #只读
rw readwrite#可读可写
#一旦设置了容器权限,容器就有限制了
docker run -dP --name nginx02 -v junn:/etc/nginx:ro nginx
docker run -dP --name nginx02 -v junn:/etc/nginx:rw nginx

 

初识DockerFile

Dockerfile 就是用来构建docker镜像文件的命令脚本通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个命令就是一层。

#创建一个dockerfile文件,名字可以随机,建议Dockerfile
#指令(大写)   参数
#测试文件内容
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "===end==="
CMD /bin/bash
#这里的每个命令,就是镜像的一层!
构建命令的形式为:
docker build -f <Dockerfile路径> -t <镜像标签> <上下文路径>
#eg
root@r7ftf-virtual-machine:/home# docker build -f ./dockerfile -t r7ftf/centos .

-f ./dockerfile:指定了用于构建定义的Dockerfile文件的路径。
-t r7ftf/centos:指定了构建完成后的镜像标签,即。r7ftf/centos
.:指定了上下文路径,这表示当前目录是构建上下文(即Docker将以此为基础构建镜像)。

数据卷容器

多个mysql同步数据

root@r7ftf-virtual-machine:/var/lib/docker/volumes# docker run -d -p 3310:3306 -v conf:/etc/mysql/conf.d/ -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=12345 --name mysql01 mysql:5.7
4a6696ad3fa6c3cb4af79cf780512984d9c9b6d7d68f909f77bd8e44a98b8168
root@r7ftf-virtual-machine:/var/lib/docker/volumes# docker run -dP -e MYSQL_ROOT_PASSWORD=12345 --name mysql02 --volumes-from mysql01 mysql:5.7
394ae05904b790939db3dc974a0c7306d62a3c6424192038cb3af704a2de0105

DockerFile

DockerFile介绍

dockerfile 是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

1.编写一个dockerfile文件

2.docker build 构建成为一个镜像

3.docker run 运行镜像

4.docker push 发布镜像(DockerHub,阿里云镜像仓库!)

DockerFile构建过程

基础知识:

1.每个保留关键字(指令)必须都是大写字母

2.指令从上到下顺序执行

3.#表示注释

4.每条指令都会创建一个新的镜像层,并提交!

DockerFile指令

FROM       #指定基础镜像,即用于构建当前镜像的基础操作系统或软件环境。
MAINTAINER #指定镜像的维护者信息
LABEL      #为镜像添加元数据,例如版本、作者、描述等信息。
RUN   #在镜像构建过程中要执行的命令,可用于安装软件、运行脚本等。
COPY       #将文件从构建环境复制到镜像中
ADD        #类似于COPY,但可以自动处理URL和解压缩文件
WORKDIR    #镜像的工作目录
VOLUME     #挂载的目录
EXPOSE     #暴露端口
CMD        #指定容器启动的时候要运行的命令,只有最后一个会生效,可被覆盖
ENTRYPOINT #与 CMD 类似但不会被命令覆盖,可追加命令
ENV        #设置环境变量

在 Dockerfile 中的 指令需要使用 JSON 数组的形式来定义要执行的命令和参数。正确的格式应该是 ,使用双引号将命令和参数括起来。CMD``CMD ["ls", "-a"]

下面是正确格式的示例:

CMD ["ls", "-a"]

docker history 容器id(容器名:版本号) #查看镜像生成的过程

上传镜像到Docker Hub

docker login -u 用户名 -p 密码

docker tag 镜像 标签

docker push 镜像

要将镜像上传到 Docker Hub 或其他 Docker Registry,您需要完成以下步骤:

登录到 Docker Hub(或其他 Docker Registry)账户:使用 命令来登录到您的 Docker Hub 账户或其他 Docker Registry。docker login
bash
docker login
您将被要求输入 Docker Hub 或 Registry 的用户名和密码。确保提供正确的凭据以成功登录。

标记您要上传的镜像:使用 命令来为要上传的镜像添加一个标签。标签必须包括您的 Docker Hub 用户名(或 Registry 的 URL)加上您为镜像选择的名称。docker tag
bash
docker tag IMAGE_ID YOUR_USERNAME/IMAGE_NAME:TAG
将 替换为您要上传的镜像的实际 IMAGE ID, 替换为您在 Docker Hub(或 Registry)上的用户名, 替换为您为镜像选择的名称, 替换为适当的标签(例如:latest)。IMAGE_IDYOUR_USERNAMEIMAGE_NAMETAG

上传镜像:使用 命令将镜像推送到 Docker Hub(或 Registry)。docker push
bash
docker push YOUR_USERNAME/IMAGE_NAME:TAG
确保提供正确的用户名、镜像名称和标签。上传镜像的过程可能需要一些时间,具体取决于您的网络连接速度和镜像的大小。

上传完成后,您的镜像将在 Docker Hub(或 Registry)的仓库中可见。

 

Docker网络

理解Docker0

#查看容器内部网络地址
ip addr

--link

root@r7ftf-virtual-machine:/home/r7ftf# docker run -d --name tomcat02 tomcat
d4b8d34c7517726c024a00ed9358abe797fda74ac453ddb66599d6e0823d3aa1
root@r7ftf-virtual-machine:/home/r7ftf# docker run -d -P --name tomcat03 --link tomcat02 tomcat
3a6b26617601443da664bbf077d2bc5801c7dc71e597e28384af95b5933d5103
这是在 Linux 机器上执行的 Docker 命令。以下是每个命令的解释:

docker run -d --name tomcat02 tomcat:

此命令使用 tomcat 镜像创建一个名为 tomcat02 的新 Docker 容器。
-d 选项在后台运行容器(分离模式)。
--name 选项为容器分配名称 tomcat02。
docker run -d -P --name tomcat03 --link tomcat02 tomcat:

此命令使用 tomcat 镜像创建另一个名为 tomcat03 的 Docker 容器。
-d 选项在后台运行容器(分离模式)。
-P 选项将所有暴露的端口发布到主机接口的随机端口上。
--name 选项为容器分配名称 tomcat03。
--link 选项在 tomcat03 容器和 tomcat02 容器之间创建链接。
tomcat 镜像是 Apache Tomcat Web 服务器的预构建镜像。第一个命令使用此镜像创建一个新容器,并将其命名为 tomcat02。第二个命令从同样的镜像创建另一个容器,命名为 tomcat03,并将其链接到 tomcat02 容器。此链接允许 tomcat03 容器与 tomcat02 容器进行通信。-P 选项将 tomcat03 的暴露端口发布到主机机器的随机端口上,使 Web 服务器可以从 Docker 网络外部访问。
#查看docker网络
docker network ls
#查看hosts配置
root@r7ftf-virtual-machine:/home/r7ftf# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 tomcat02 d4b8d34c7517
172.17.0.3 3a6b26617601
#--link 就是在hosts配置中增加了172.17.0.2 tomcat02 d4b8d34c7517映射

自定义网络

#查看所有的docker网络
docker network ls
root@r7ftf-virtual-machine:/home/r7ftf# docker network ls
NETWORK ID     NAME     DRIVER   SCOPE
c5b2fce04078   bridge   bridge   local
e30b5814e239   host     host     local
0ec7bb09d4b4   none     null     local

网络模式

bridge:桥接 docker(默认)

none:不配置网络

host:和宿主机共享网络

container:容器内网络连通(用的少,局限很大)

#我们直接启动的命令 docker run -d -P --name tomcat01 tomcat 默认添加 --net bridge,这个就是docker0网络
等价于:
docker run -d -P --name tomcat01 --net bridge tomcat

#docker0特点:是默认的,域名不能访问, --link可以打通连接!

#自定义一个网络:
#--driver bridge (默认添加)
#--subnet 192.168.0.0/16
#--gateway 192.168.0.1 mynet
root@r7ftf-virtual-machine:/home/r7ftf# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
616e69f30340a783bbd9ca7afa4f1e5d3eeaa0042beb1c95a0a227ae7fdd18c9
root@r7ftf-virtual-machine:/home/r7ftf# docker network ls
NETWORK ID     NAME     DRIVER   SCOPE
c5b2fce04078   bridge   bridge   local
e30b5814e239   host     host     local
616e69f30340   mynet     bridge   local
0ec7bb09d4b4   none     null     local
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

该命令将创建一个名为 mynet 的 Docker 网络,并使用 bridge 作为驱动程序。--subnet 选项指定该网络的子网为 192.168.0.0/16--gateway 选项指定网络的网关为 192.168.0.1

创建网络后,可以使用 docker network ls 命令列出所有的 Docker 网络,包括新创建的 mynet 网络。可以使用 docker network inspect mynet 命令查看 mynet 网络的详细信息,包括子网和网关等配置信息。

接下来,可以使用 --network 选项将容器连接到 mynet 网络,以便容器可以使用该网络提供的网络连接。例如:

docker run --name my-container --network mynet myimage

这样,my-container 容器就会连接到 mynet 网络,并可以使用该网络提供的网络连接。在容器内部,可以使用 ping 命令测试网络连接是否正常。例如,可以使用 ping 192.168.0.1 命令测试容器是否可以连接到网络网关。

网络连通

#docker network connect mynet tomcat01
root@r7ftf-virtual-machine:/home/r7ftf# docker network connect mynet tomcat01

这是在 Linux 机器上执行的 Docker 命令,用于将现有的容器 tomcat01 连接到名为 mynet 的 Docker 网络中。命令的语法为:


docker network connect NETWORK CONTAINER
其中,NETWORK 参数是要连接的 Docker 网络的名称,CONTAINER 参数是要连接到网络中的容器名称或 ID。

在这个例子中,执行了以下命令:


docker network connect mynet tomcat01
该命令将现有的 tomcat01 容器连接到名为 mynet 的 Docker 网络中。容器连接到网络后,可以使用网络中的其他容器或服务进行通信。

需要注意的是,容器只能连接到一个 Docker 网络中。如果要将容器连接到其他网络中,必须先将其从当前网络中断开,然后再连接到其他网络中。可以使用 docker network disconnect 命令将容器断开与网络的连接。例如,要将 tomcat01 容器从 mynet 网络中断开连接,可以执行以下命令:


docker network disconnect mynet tomcat01
这样,tomcat01 容器就会从 mynet 网络中断开连接。如果要将容器连接到其他网络中,可以使用 docker network connect 命令将其连接到其他网络中。

实战:部署Redis集群

#创建网卡
docker network create redis --subnet 172.38.0.0/16
#通过脚本创建六个redis配置
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat <<EOF>/mydata/redis/none-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file 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

这是一个 Shell 脚本示例,用于在 /mydata/redis 目录中创建六个 Redis 节点,并为每个节点创建一个配置文件 redis.conf。每个节点都指定了不同的端口号、集群配置和 IP 地址,以便它们可以相互独立地运行。

#!/bin/bash

# 创建六个 Redis 节点
for port in $(seq 1 6);
do
   # 创建节点目录和配置文件
   mkdir -p /mydata/redis/node-${port}/conf
   touch /mydata/redis/node-${port}/conf/redis.conf

   # 将 Redis 配置写入文件
   cat <<EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file 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

该脚本使用循环语句创建六个 Redis 节点。在创建节点时,使用 mkdir -p 命令创建节点目录,并使用 touch 命令创建 redis.conf 配置文件。使用 cat <<EOF 命令将 Redis 配置写入配置文件,并使用 $port 变量指定节点的端口号和集群配置。

在每个节点的配置文件中,使用 port 指定节点的端口号,使用 bind 0.0.0.0 指定节点可以通过任何 IP 地址访问,使用 cluster-enabled yes 开启节点的集群功能,使用 cluster-config-file nodes.conf 指定集群配置文件的名称,使用 cluster-node-timeout 5000 指定节点在集群中的超时时间,使用 cluster-announce-ipcluster-announce-portcluster-announce-bus-port 指定节点的 IP 地址和端口号,以便其他节点可以发现该节点。最后,使用 appendonly yes 开启 Redis 的 AOF 持久化功能,以便节点可以持久化数据。

可以将脚本保存为 create_redis_nodes.sh 文件,并使用 bash create_redis_nodes.sh 命令运行该脚本。执行脚本后,将创建六个 Redis 节点,并为每个节点创建一个配置文件 redis.conf。每个节点都指定了不同的端口号、集群配置和 IP 地址,以便它们可以相互独立地运行。

#启动
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port}
-v /mydata/redis/node-${port}/data:/data
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
 

 

标签:容器,进阶,--,redis,r7ftf,镜像,docker,Docker
From: https://www.cnblogs.com/ptm2/p/17575033.html

相关文章

  • mysql arm dockerfile
    MySQLonARMwithDockerfileIntroductionWiththeincreasingpopularityofARM-baseddevices,itisbecomingmorecommontorunapplicationsandservicesonARMarchitecture.OnesuchapplicationisMySQL,apowerfulandwidelyusedrelationaldatabasem......
  • mac在本地docker启动mysql提示chown: changing ownership of '/var/lib/mysql': O
    解决mac在本地docker启动mysql提示chown:changingownershipof'/var/lib/mysql':O问题介绍在使用Docker在本地启动MySQL时,有时会遇到权限问题,导致出现chown:changingownershipof'/var/lib/mysql':O的错误提示。这篇文章将向您展示如何解决这个问题,并为您提供了一些代码......
  • 很全面的 Docker 教程,从入门到精通
    docker不是一个值得投入的领域,它解决的问题是Unix系统最初设计的一个疏忽。从一个不会用docker的小白,自己一步一步的摸索,中间也踩过许多坑。但任然,坚持从哪里跌倒就从哪里爬起来。不求感动自己,但求人生无悔。 1容器简介1.1什么是Linux容器1.2容器不就是虚拟化吗1.3容器发......
  • docker 一键安装脚本
    官方脚本(推荐)curl-fsSLhttps://get.docker.com|shcurl-L"https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname-s)-$(uname-m)"-o/usr/local/bin/docker-composechmod+x/usr/local/bin/docker-compose查看docker版......
  • K3S+Docker常用命令
    Docker启动镜像,检验是否成功dockerrun-timagesName:tag查询镜像文件dockerimages查询启动的镜像,可以获得容器的iddockerps停止容器dockerstop容器id查看docker相关信息dockerinfo查询容器的相关信息dockerinspect容器id移除镜像dockerrmi-fimagesNam......
  • windows10 安装docker
    如何在Windows10上安装Docker简介在开始之前,我们需要确保你的电脑满足Docker的安装要求。接下来,我将为你提供一步一步的指导,教你如何在Windows10上安装Docker。以下是整个安装过程的步骤概览:步骤动作1检查系统要求2下载DockerDesktop安装程序3......
  • docker部署zabbix 6.0高可用集群实验
    0实验环境虚拟机,postgresql本地部署,zabbixserver及nginx容器部署1postgresql参看前作《postgresql+timescaledb离线安装笔记》完成部署,对外端口tcp15432,账号zabbix,密码1232zabbixserver2.1拉取镜像dockerpullzabbix/zabbix-server-pgsql:6.0-alpine-latest2.2......
  • win11安装docker及应用
    一、win11安装docker在docker官网DownloadDockerDesktop|Docker下载安装。安装后启动,可能碰到图示异常://在cmd输入命令,稍等片刻即好wsl--update二、docker常用命令(在cmd中执行)//安装镜像dockerpull[镜像名称]:[镜像版本]比如安装rabbitmq3.12.2版本,命令为do......
  • 使用 Dockerfile 构建生产环境镜像
    传统部署的坑:1202年了,如果你连Docker都不知道是什么,我建议买一本书看看——或者谷歌一下,博客已经写烂了。为什么有这篇文章,是因为我在真正做容器化改造的时候,发现公司生产环境存在大量的坑:传统虚拟机部署,基本依赖克隆或者手工编译。由于人力原因,SRE历来单传,编译出来的PHP......
  • 在docker内定位占用cpu过高的java线程
    参考​​>确定进程信息判断该进程是否在Docker容器中。使用cat/proc/<pid>/cgroup查看打印内容是否包含:/docker/。原理是Docker使用了Linuxcgroups使用pstree-s<pid>查看打印的进程树是否包含docker-containe,显示信息如下:systemd(1)───docker(1101)───docke......