运行容器:create、run、pause、unpause、stop、kill、start、restart、attach、exec、logs、rm、ps/ls;容器交互;容器资源限额:memory/cpu-shares/blkio-weight;底层技术:cgroup 和 namespace;配置docker跨host远程管理

 

 ###docker inspect 4ce62f5581b5 |grep RestartPolicy -A2   确认容器是否自动拉起

复制代码
docker容器运行相关操作:create、run、pause、unpause、stop、kill、start、restart、attach、exec、logs、rm、ps/ls
===================================================================================================================================
create      创建容器  
run         运行容器  
pause       暂停容器  
unpause     取消暂停继续运行容器  
stop        发送 SIGTERM 停止容器  
kill        发送 SIGKILL 快速停止容器  
start       启动容器  
restart     重启容器  
attach      attach 到容器启动进程的终端  
exec        在容器中启动新进程,通常使用 "-it" 参数  
logs        显示容器启动进程的控制台输出,用 "-f" 持续打印  
rm          从磁盘中删除容器

ps            列出运行容器
docker container ls     #等效 docker ps
docker container ps        #等效 docker ps
------------------------------------------------------------------------------------------
运行一个新容器
    docker run [OPTIONS] IMAGE [COMMAND]          #run一个新容器时,要么就用镜像ID;如果用镜像名称的话要带上版本号,否则默认使用最新版本!
    docker run 170e243861ec
    docker run mypython:3.6    #本地没有镜像,则会自动去docker hub搜索并下载
    # 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!(所以这里启动一个新容器时,使用了-e进行设置密码)
    docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
        --network/--net                #指定自定义容器网络
        --ip                        #指定容器IP
        --link=CONTAINER_NAME:ALIAS    #使用这个选项去run一个容器将在此容器的/etc/hosts文件中增加一个主机名ALIAS,这个主机名是名为CONTAINER_NAME 的容器的IP地址的别名。这使得新容器的内部进程可以访问主机名为ALIAS的容器而不用知道它的IP。
            --link=CONTAINER_NAME:ALIAS,可以设置多个--link,这个参数只对run的容器有效,不会影响到其他容器,实现方式其实就是在容器文件/etc/hosts中添加解析,所以这个解析只对容器自身有效
        --name                        #设置容器名称
        -it                            #-i交互式操作,-t终端
        -h                             #设置容器的主机名
        -dns x.x.x.x                #设置dns
        --dns-search                #DNS搜索设置
        --rm                         #退出后即删除容器
        --add-host hostname:IP        #注入host
        -d                            #后台运行;同时想要容器挂在后台,有-d参数是不够的,还需要容器本身有可运行的内容
        -P(大写)                    #将容器内部使用的网络端口随机映射到我们使用的主机上。
        -p 4444:5000                 #指定端口映射,容器端口5000映射到本地端口4444
        -e 环境变量key:环境变量value        #设置环境变量并传递进容器中,例如-e MYSQL_ROOT_PASSWORD=123456;-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m"
        --restart=always               #容器自动重启(重启docker守护进程后,没有该参数的容器是不会自动up的)
        /bin/bash                    #放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
        
        #####容器必须有一个前台的守护进程,否则该容器启动后会自动退出。

查看容器
    docker ps -a                               #查看本地的容器进程
    docker logs -f bf08b7f2cd89               #查看容器的日志
    docker top wizardly_chandrasekhar         #查看容器内部运行的进程
    docker inspect bf08b7f2cd89             #查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
    docker stats bf08b7f2cd89 
操作容器
    docker start/restart/stop <容器 ID> 
    docker start b750bbbcfd88               #启动已停止的容器
    docker stop <容器 ID>                   #停止容器
    docker restart <容器 ID>                #重启容器
    docker attach                             #(不建议用这种方式)进入容器,attach如果从这个容器退出,会导致容器的停止。
    docker exec -it 71be3370b9d3 /bin/bash     #进入容器,推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
    docker rm -f 1e560fca3906                  #删除容器
    docker rm -f `docker ps -aq`            #批量删除容器,实验常用命令

    exit #容器直接退出
    ctrl +P +Q #容器不停止退出
docker容器运行相关操作:create、run、pause、unpause、stop、kill、start、restart、attach、exec、logs、rm、ps/ls
复制代码

 

复制代码
stop/start/restart/kill/rm/create/run
================================================================================
容器在 docker host 中实际上是一个进程,docker stop 命令本质上是向该进程发送一个 SIGTERM 信号。如果想快速停止容器,可使用 docker kill 命令,其作用是向容器进程发送 SIGKILL 信号。
    --restart     容器因某种错误而停止运行时,自动重启
    --restart=always
    --restart=on-failure:3
        只有当容器的启动进程退出时,--restart 才生效。 
        退出包括正常退出或者非正常退出。
            启动进程正常退出或发生 OOM,此时 docker 会根据 --restart 的策略判断是否需要重启容器。但如果容器是因为执行 docker stop 或docker kill 退出,则不会自动重启。
---------------------------------
docker rm 
docker rm -v $(docker ps -aq -f status=exited)

docker create         #可以先创建容器,稍后再启动
docker run 命令实际上是 docker create 和 docker start 的组合。
stop/start/restart/kill/rm/create/run
复制代码

复制代码
指定容器启动时执行的命令;进入容器(attach、exec);容器用途(服务类容器、工具类容器);容器运行相关的知识点
===================================================================================================
3种方式指定容器启动时执行的命令:
    1.CMD 指令。
    2.ENDPOINT 指令。
    3.在 docker run 命令行中指定。


---------------------------------------------------------------------------------------
两种进入容器的方法:
docker attach            #attach 到容器启动命令的终端
    注:可通过 Ctrl+p 然后 Ctrl+q 组合键退出 attach 终端;使用exit的话,将会退出容器
docker exec -it <container> bash|sh


attach 与 exec 主要区别如下:
    1.attach 直接进入容器 启动命令 的终端,不会启动新的进程。
    2.exec 则是在容器中打开新的终端,并且可以启动新的进程。
    3.如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。
        如果只是为了查看启动命令的输出,可以使用 docker logs 命令:docker logs -f <container>

-----------------------------------------------------------------------------------------
按用途容器大致可分为两类:服务类容器和工具类的容器。
    1. 服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器。
    2. 工具类容器通常给能我们提供一个临时的工作环境,通常以 run -it 方式运行
        工具类容器多使用基础镜像,例如 busybox、debian、ubuntu 等。

-----------------------------------------------------------------------------------------
容器运行相关的知识点:
    1.当 CMD 或 Entrypoint 或 docker run 命令行指定的命令运行结束时,容器停止。
    2.通过 -d 参数在后台启动容器。
    3.通过 exec -it 可进入容器并执行命令。
指定容器启动时执行的命令;进入容器(attach、exec);容器用途(服务类容器、工具类容器);容器运行相关的知识点
复制代码

 

 

复制代码
容器资源限额:--memory/--cpu-shares/--blkio-weight
============================================================================================
-m 或 --memory:设置内存的使用限额,例如 100M, 2G。默认参数为-1,即对容器内存没有限制。
--memory-swap:设置 内存+swap 的使用限额。默认为 -m 的两倍;当-m为-1时,--memory-swap也没有限制。

docker run -m 200M --memory-swap=300M ubuntu            #允许该容器最多使用 200M 的内存和 100M 的 swap。
docker run -it -m 200M ubuntu                            #容器最多使用 200M 物理内存和 200M swap。

progrium/stress 镜像:测试容器内存的使用
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
--vm 1:启动 1 个内存工作线程。
--vm-bytes 280M:每个线程分配 280M 内存。

限制容器对内存的使用 - 每天5分钟玩转 Docker 容器技术(27----------------------------------------------------------------------
-c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。
    与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。

docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu
    container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。

限制容器对CPU的使用 - 每天5分钟玩转 Docker 容器技术(28----------------------------------------------------------------------
--blkio-weight 参数来改变容器 block IO 的优先级。默认情况下,所有容器能平等地读写磁盘。

--blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。

docker run -it --name container_A --blkio-weight 600 ubuntu   
docker run -it --name container_B --blkio-weight 300 ubuntu


bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。

可通过以下参数控制容器的 bps 和 iops:
--device-read-bps,限制读某个设备的 bps。
--device-write-bps,限制写某个设备的 bps。
--device-read-iops,限制读某个设备的 iops。
--device-write-iops,限制写某个设备的 iops。

下面这个例子限制容器写 /dev/sda 的速率为 30 MB/s

docker run -it --device-write-bps /dev/sda:30MB ubuntu

限制容器的 Block IO - 每天5分钟玩转 Docker 容器技术(29)
容器资源限额:--memory/--cpu-shares/--blkio-weight
复制代码

 

 

复制代码
容器的底层实现技术:cgroup 和 namespace 
===========================================================================
容器的底层实现技术:cgroup 和 namespace 
    cgroup 实现资源限额, namespace 实现资源隔离。

cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。
    --cpu-shares、-m、--device-write-bps 实际上就是在配置 cgroup。


cgroup配置目录:/sys/fs/cgroup
                /sys/fs/cgroup/cpu/docker
                /sys/fs/cgroup/memory/docker
                /sys/fs/cgroup/blkio/docker

---------------------------------------------------------------------------
namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离。
Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User
容器的底层实现技术:cgroup 和 namespace
复制代码

系统默认的network namespace目录/var/run/netns/
但是docker network namespace目录为/var/run/docker/netns/?????

 

复制代码
实验:配置docker daemon允许远程请求(docker跨host远程管理)
默认配置下,Docker daemon 只能响应来自本地 Host 的客户端请求。
1.修改文件
vim /usr/lib/systemd/system/docker.service
    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock    #修改前
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0 --containerd=/run/containerd/containerd.sock   #修改后

2.重新加载docker文件并重启docker daemon
    systemctl daemon-reload
    systemctl restart docker.service

3.远程查看docker
    [root@yefeng ~]# docker -H 192.168.1.111 ps     #变更前
    Cannot connect to the Docker daemon at tcp://192.168.1.111:2375. Is the docker daemon running?
    [root@yefeng ~]# docker -H 192.168.1.111 ps -a  #变更后
    CONTAINER ID   IMAGE                 COMMAND              CREATED        STATUS                    PORTS     NAMES
    6462d4b17018   httpd:2.4.48-alpine   "httpd-foreground"   6 months ago   Exited (0) 6 months ago             docker01
    [root@yefeng ~]# docker -H 192.168.1.111 run -d httpd
    43e93a22fe745a5554f0a3fb3fabec495328318e8438b75c8edb9caf9f8e047c
实验:配置docker daemon允许远程请求(docker跨host远程管理)
复制代码

 

posted @   雲淡風輕333  阅读(180)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示