首页 > 其他分享 >Docker 笔记

Docker 笔记

时间:2025-01-17 16:24:34浏览次数:1  
标签:容器 -- 网络 笔记 Docker docker 日志

目录

Docker 的基本组成

在容器化之后,我们的开发,测试环境都是高度一致的

镜像(image):

docker 镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat 镜像==> run ==>容器(提
供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

容器(container):

Docker 利用容器技术,独立运行一个或者一组应用,通过镜像来创建的.
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux系统。

仓库(repository):

仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库。(很类似 git)
Docker Hub 是国外的。
阿里云…都有容器服务器(配置镜像加速!)

Dcoker 安装

1、卸载系统之前的 docker

sudo yum remove docker \
	docker-client \
	docker-client-latest \
	docker-common \
	docker-latest \
	docker-latest-logrotate \
	docker-logrotate \
	docker-engine

2、安装 Docker-CE

安装必须的依赖

sudo yum install -y yum-utils \
	device-mapper-persistent-data \
	lvm2

设置 docker repo 的 yum 位置

sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

这里可以换成其他镜像地址
阿里云 : https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看选择docker-ce各版本

yum list docker-ce --showduplicates | sort -r

安装 docker,以及 docker-cli

sudo yum install docker-ce docker-ce-cli containerd.io

指定版本:

sudo yum install docker-ce-18.06.0.ce-3.el7 docker-ce-cli-18.06.0.ce-3.el7 containerd.io

安装docker相关的 docker-ce 社区版 而ee是企业版

3、启动 docker

sudo systemctl start docker

4、设置 docker 开机自启

sudo systemctl enable docker

5、测试 docker 常用命令,注意切换到 root 用户下

https://docs.docker.com/engine/reference/commandline/docker/

检查是否安装成功

docker version

测试

docker run hello-world

6、配置 docker 镜像加速

阿里云,容器镜像服务

针对 Docker 客户端版本大于 1.10.0 的用户
您可以通过修改 daemon 配置文件/etc/docker/daemon.json 来使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.rainbond.cc","https://dockerproxy.com","https://ntfs2efa.mirror.aliyuncs.com","https://registry.cn-hangzhou.aliyuncs.com","https://docker.m.daocloud.io","http://hub-mirror.c.163.com","https://mirror.baidubce.com","http://mirrors.ustc.edu.cn","https://docker.nju.edu.cn","https://mirror.iscas.ac.cn","https://registry.docker-cn.com"]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

Rainbond 社区为了方便拉取 Docker 镜像,自主搭建了个镜像加速服务,采用 CloudFlare + 国外服务器 Nginx 反代的方案为 Rainbond 社区的用户们提供镜像加速服务。

方式一:直接获取 Docker Hub 镜像
docker pull docker.rainbond.cc/library/node:20
docker pull docker.rainbond.cc/rainbond/rainbond:v5.17.2-release-allinone

方式二:配置镜像加速器
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://docker.rainbond.cc"]
}
EOF
systemctl daemon-reload
systemctl restart docker

技术栈参考LINK
https://www.rainbond.com/docs/quick-start/quick-install
Docker Hub 镜像加速: https://gitee.com/wanfeng789/docker-hub
国内无法访问下载Docker镜像的多种解决方案:https://www.bilibili.com/read/cv35387254/
总结目前国内加速拉取 docker 镜像的几种方法:https://zhuanlan.zhihu.com/p/703322576
从Docker Hub拉取镜像受阻?这些解决方案帮你轻松应对:https://mp.weixin.qq.com/s/pXrxedldKOoD97bMDYy3pQ

需要的安装包

yum install -y yum-utils

设置镜像的仓库

yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新yum软件包索引

yum makecache fast 

Docker 日志

Docker 引擎日志

Docker 引擎日志 一般是交给了 Upstart(Ubuntu 14.04) 或者 systemd (CentOS 7, Ubuntu 16.04)。前者一般位于 /var/log/upstart/docker.log 下,后者一般通过 jounarlctl -u docker 来读取。不同系统的位置都不一样,SO上有人总结了一份列表,我修正了一下,可以参考:

系统 日志位置
Ubuntu(14.04) /var/log/upstart/docker.log
Ubuntu(16.04) journalctl -u docker.service
CentOS 7/RHEL 7/Fedora journalctl -u docker.service
CoreOS journalctl -u docker.service
OpenSuSE journalctl -u docker.service
OSX ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/d‌​ocker.log
Debian GNU/Linux 7 /var/log/daemon.log
Debian GNU/Linux 8 journalctl -u docker.service
Boot2Docker /var/log/docker.log

Docker容器日志查看与清理

容器的日志 则可以通过 docker logs 命令来访问,而且可以像 tail -f 一样,使用 docker logs -f 来实时查看。如果使用 Docker Compose,则可以通过 docker-compose logs <服务名> 来查看。
如果深究其日志位置,每个容器的日志默认都会以 json-file 的格式存储于 /var/lib/docker/containers/<容器id>/<容器id>-json.log 下,不过并不建议去这里直接读取内容,因为 Docker 提供了更完善地日志收集方式 - Docker 日志收集驱动
关于日志收集,Docker 内置了很多日志驱动,可以通过类似于 fluentdsyslog 这类服务收集日志。无论是 Docker 引擎,还是容器,都可以使用日志驱动。比如,如果打算用 fluentd 收集某个容器日志,可以这样启动容器:

$ docker run -d \
--log-driver=fluentd \
--log-opt fluentd-address=10.2.3.4:24224 \
--log-opt tag="docker.{{.Name}}" \
nginx

其中 10.2.3.4:24224 是 fluentd 服务地址,实际环境中应该换成真实的地址。

找出Docker容器日志

在 linux 上,容器日志一般存放在/var/lib/docker/containers/container_id/下面, 以 json.log 结尾的文件(业务日志)很大,查看各个日志文件大小的脚本docker_log_size.sh,内容如下:

#!/bin/sh
echo "======== docker containers logs file size ========"  
logs=$(find /var/lib/docker/containers/ -name *-json.log)  

for log in $logs  
        do  
             ls -lh $log   
        done  
chmod +x docker_log_size.sh
./docker_log_size.sh

清理Docker容器日志(治标)

如果docker容器正在运行,那么使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。正确姿势是cat /dev/null > *-json.log,当然你也可以通过rm -rf删除后重启docker。接下来,提供一个日志清理脚本clean_docker_log.sh,内容如下:

#!/bin/sh 
  
echo "======== start clean docker containers logs ========"  
  
logs=$(find /var/lib/docker/containers/ -name *-json.log)  
  
for log in $logs  
        do  
                echo "clean logs : $log"  
                cat /dev/null > $log  
        done  

echo "======== end clean docker containers logs ========"  
chmod +x clean_docker_log.sh

./clean_docker_log.sh

设置docker容器日志大小(全局设置)

新建/etc/docker/daemon.json,若有就不用新建了。添加 log-dirver 和 log-opts ·参数,如下:

# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["http://f613ce8f.m.daocloud.io"],
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"}
}
  • max-size=500m,意味着一个容器日志大小上限是500M
  • max-file=3,意味着一个容器最多有三个日志,分别是:容器id-json.log、容器id-json.log.1、容器id-json.log.2, 当日志文件的大小达到500m时,自动划分文件保存,最多划分3个文件
  • 这两个参数设置之后说明,一个容器最多保存1500m(3 * 500)日志,超过范围的日志不会被保存,文件中保存的是最新的日志,文件会自动滚动更新。

注意:设置的日志大小,只对新建的容器有效。

设置完成之后,需要删除容器,并重新启动容器,我们可以看到/var/lib/docker/containers/<容器id>/hostconfig.json文件的变化如下:
设置log-opts之前:

cat hostconfig.json

其中的 LogConfig 如下

"LogConfig": {
	"Type": "json-file",
	"Config": {}
}

设置log-opts之后:

cat hostconfig.json

其中的 LogConfig 如下

"LogConfig": {
	"Type": "json-file",
	"Config": {
		"max-file": "3",
		"max-size": "500m"
	}
}

k8s中的容器日志

在 k8s 集群中 docker 容器日志/var/lib/docker/containers/容器ID/目录的文件如下
与 docker 容器目录相比少了一些文件:hostname、hosts、resolv.conf、resolv.conf.hash
k8s 通过sandbox(pause容器,关于pause容器的介绍可以查阅资料)关联了这些文件,通过查看cat config.v2.json可以发现如下配置:

"HostnamePath": "/var/lib/docker/containers/27c9b0c0d1d7c8c7db515f96d5ae8c50ef7aeea02ecddcaa6546ea233dc5445c/hostname",
"HostsPath": "/var/lib/kubelet/pods/88f3a665-fdd1-4ad5-b0e0-0b613f762b4c/etc-hosts",
"ShmPath": "/var/lib/docker/containers/27c9b0c0d1d7c8c7db515f96d5ae8c50ef7aeea02ecddcaa6546ea233dc5445c/mounts/shm",
"ResolvConfPath": "/var/lib/docker/containers/27c9b0c0d1d7c8c7db515f96d5ae8c50ef7aeea02ecddcaa6546ea233dc5445c/resolv.conf",

使用命令cat /var/lib/docker/containers/<容器id>/hostconfig.json查看hostconfig.json的内容,发现有如下设置:

{
	"Binds": [
		"/var/lib/kubelet/pods/e268cba1-95c6-4c16-904c-6be0b70344ea/volumes/kubernetes.io~secret/default-token-7vpxg:/var/run/secrets/kubernetes.io/serviceaccount:ro",
		"/var/lib/kubelet/pods/e268cba1-95c6-4c16-904c-6be0b70344ea/etc-hosts:/etc/hosts",
		"/var/lib/kubelet/pods/e268cba1-95c6-4c16-904c-6be0b70344ea/containers/demo/eee5300c:/dev/termination-log"
	],
	"ContainerIDFile": "",
	"LogConfig": {
		"Type": "json-file",
		"Config": {
			"max-file": "10",
			"max-size": "100m"
		}
	},
	"NetworkMode": cd "container:ab24db5934f3a0153d9deb3c2de054c87148c3919f1bc2b1d2c11c4c8a2c8c57",
	"PortBindings": null,
	//其他参数没有列出来
	......
	......
}

说明一个容器中日志文件的大小最大为 100m,最多 10 个文件,一个容器的日志最多保存 1000m 日志数据

下面列出了一个容器的日志文件达到设置值的情况:

total 927M
drwx------ 2 root root 4.0K Sep  9 14:51 checkpoints
-rw------- 1 root root  24K Sep  9 14:51 config.v2.json
-rw-r----- 1 root root  69M Nov 16 14:21 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log
-rw-r----- 1 root root  96M Nov 16 07:24 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.1
-rw-r----- 1 root root  96M Nov 15 21:49 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.2
-rw-r----- 1 root root  96M Nov 15 12:04 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.3
-rw-r----- 1 root root  96M Nov 15 02:21 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.4
-rw-r----- 1 root root  96M Nov 14 16:47 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.5
-rw-r----- 1 root root  96M Nov 14 07:11 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.6
-rw-r----- 1 root root  96M Nov 13 21:35 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.7
-rw-r----- 1 root root  96M Nov 13 11:57 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.8
-rw-r----- 1 root root  96M Nov 13 02:21 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.9
-rw-r--r-- 1 root root 2.2K Sep  9 14:51 hostconfig.json
drwx------ 2 root root 4.0K Sep  9 14:51 mounts

Docker 启动

启动 Docker 的命令:

sudo systemctl start docker

通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community。

// 拉取镜像
sudo docker pull hello-world
// 执行hello-world
sudo docker run hello-world

如果执行之后,控制台显示如下信息,则说明 Docker 安装和启动成功:

[tmesh@hecs-75657 ~]$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
……

除了启动 Docker,一些其他启动相关的命令:

  • 守护进程重启:systemctl daemon-reload
  • 重启 Docker 服务:systemctl restart docker / service docker restart
  • 关闭 Docker 服务:docker service docker stop / docker systemctl stop docker

Docker常见命令

安装完成 Docker 之后,这里汇总列一下常见的 Docker 操作命令:

  • 搜索仓库镜像:docker search 镜像名
  • 拉取镜像:docker pull 镜像名
  • 查看正在运行的容器:docker ps
  • 查看所有容器:docker ps -a
  • 删除容器:docker rm container_id
  • 查看镜像:docker images
  • 删除镜像:docker rmi image_id
  • 启动(停止的)容器:docker start 容器 ID/容器名称
  • 停止容器:docker stop 容器 ID/容器名称
  • 重启容器:docker restart 容器 ID/容器名称D
  • 启动(新)容器:docker run -it ubuntu /bin/bash
  • 进入容器:docker attach 容器IDdocker exec -it 容器 ID/容器名称 /bin/bash,推荐使用后者。
  • 查看容器ip地址:docker inspect  容器 ID/容器名称
  • 守护进程重启:systemctl daemon-reload
  • 重启Docker服务:systemctl restart docker / service docker restart
  • 关闭Docker服务:docker service docker stop / docker systemctl stop docker
  • 查看日志:docker logs images_name
  • 查看Docker容器占用资源:docker stats
    更多的命令可以通过docker help命令来查看。

删除Docker

删除安装包:

yum remove docker-ce

删除镜像、容器、配置文件等内容:

rm -rf /var/lib/docker

问题:无权限使用docker命令

  1. 报错信息
[tmesh@192 ~]$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

如果着急可跳过中间分析过程,直接看总结命令可解决。

分析

  1. 根据报错信息(/var/run/docker.sock: connect: permission denied),可知,用户无操作权限
  2. 我们首先需要查看/var/run/docker.sock权限
    1. 情况一:只有root用户和docker组才有rw权限
    $ ll /var/run/docker.sock
    srw-rw---- 1 root docker 0 Mar 21 10:59 /var/run/docker.sock
    
    1. 情况二:只有root用户和root组才有rw权限
    $ ll /var/run/docker.sock
    srw-rw---- 1 root root 0 Mar 21 10:59 /var/run/docker.sock
    

解决

  1. 方案一:使用sudo权限
sudo docker ps
  1. 方案二:将当前用户(笔者测试机器用户是test)加入docker组(推荐)
sudo chown root:docker /var/run/docker.sock # 修改docker.sock权限为root:docker
sudo groupadd docker          # 添加docker用户组 
sudo gpasswd -a $USER docker  # 将当前用户添加至docker用户组
newgrp docker                 # 更新docker用户组

容器内部时间问题

共享主机的localtime (方法一)

建容器的时候指定启动参数,挂载 localtime 文件到容器内 ,保证两者所采用的时区是一致的。

docker run --name <name> -v /etc/localtime:/etc/localtime:ro ....

复制主机的localtime (方法二)

docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime

Dcoker 命令

https://cloud.tencent.com/developer/article/2093710

帮助类启动命令

启动 Docker

systemctl start docke

停止 Docker

systemctl stop docke

重启 Docker

systemctl start docke

查看 Docker 状态

systemctl status docke

开机启动 Docker

systemctl enable docke

查看 Docker 概要信息

docker info

查看 Docker 总体帮助文档

docker --help

查看 Docker 命令帮助文档

docker 具体命令 --help

管理 Docker 命令

显示 docker 磁盘使用情况(docker system df)

显示停靠盘的使用情况
显示有关docker守护程序使用的磁盘空间量的信息。

doc
ker system df [OPTIONS]

OPTIONS说明:

  • --format: 使用Go模板打印出漂亮的图像
  • --verbose,-v: 显示空间使用情况的详细信息

实例

默认情况下,该命令只显示所使用数据的摘要:

$ docker system df

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              5                   2                   16.43 MB            11.63 MB (70%)
Containers          2                   0                   212 B               212 B (100%)
Local Volumes       2                   1                   36 B                0 B (0%)

可以使用-v, --verbose国旗:

$ docker system df -v

Images space usage:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE                SHARED SIZE         UNIQUE SIZE         CONTAINERS
my-curl             latest              b2789dd875bf        6 minutes ago       11 MB               11 MB               5 B                 0
my-jq               latest              ae67841be6d0        6 minutes ago       9.623 MB            8.991 MB            632.1 kB            0
<none>              <none>              a0971c4015c1        6 minutes ago       11 MB               11 MB               0 B                 0
alpine              latest              4e38e38c8ce0        9 weeks ago         4.799 MB            0 B                 4.799 MB            1
alpine              3.3                 47cf20d8c26c        9 weeks ago         4.797 MB            4.797 MB            0 B                 1

Containers space usage:

CONTAINER ID        IMAGE               COMMAND             LOCAL VOLUMES       SIZE                CREATED             STATUS                      NAMES
4a7f7eebae0f        alpine:latest       "sh"                1                   0 B                 16 minutes ago      Exited (0) 5 minutes ago    hopeful_yalow
f98f9c2aa1ea        alpine:3.3          "sh"                1                   212 B               16 minutes ago      Exited (0) 48 seconds ago   anon-vol

Local Volumes space usage:

NAME                                                               LINKS               SIZE
07c7bdf3e34ab76d921894c2b834f073721fccfbbcba792aa7648e3a7a664c2e   2                   36 B
my-named-vol                                                       0                   0 B

各个选项说明:

  • SHARED SIZE 是图像与另一个图像共享的空间量(即它们的公共数据)
  • UNIQUE SIZE 是仅由给定图像使用的空间量
  • SIZE 是图像的虚拟大小,它是的总和SHARED SIZEUNIQUE SIZE

从服务器获取实时事件(docker system events)

docker system events [OPTIONS]

OPTIONS说明:

  • --filter, -f: 根据提供的条件过滤输出
  • --format: 使用给定的Go模板格式化输出
  • --since: 显示自时间戳以来创建的所有事件
  • --until 在此时间戳之前将事件流化

扩展描述

使用docker system events从服务器获取实时事件。每个Docker对象类型都有不同的事件。

对象类型
容器

Docker容器报告下列事件:

  • attach
  • commit
  • copy
  • create
  • destroy
  • detach
  • die
  • exec_create
  • exec_detach
  • exec_start
  • export
  • health_status
  • kill
  • oom
  • pause
  • rename
  • resize
  • restart
  • start
  • stop
  • top
  • unpause
  • update
图像

Docker图像报告了以下事件:

  • delete
  • import
  • load
  • pull
  • push
  • save
  • tag
  • untag
插件

Docker插件报告下列事件:

  • install
  • enable
  • disable
  • remove

Docker卷报告了下列事件:

  • create
  • mount
  • unmount
  • destroy
网络

Docker网络报告了下列事件:

  • create
  • connect
  • disconnect
  • destroy
守护进程

Docker守护进程报告下列事件:

  • reload
限制,筛选和格式化输出
按时间限制事件

--since--until参数可以是Unix的时间戳,日期格式时间戳,或持续时间的字符串(例如去10m1h30m)来计算相对于客户机的时间。如果您不提供该--since选项,则该命令仅返回新事件和/或现场事件。支持的格式为日期格式时间戳包括RFC3339Nano,RFC3339, ,2006-01-02T15:04:052006-01-02T15:04:05.9999999992006-01-02Z07:002006-01-02。如果您不提供a Z或a ,客户端将使用本地时区+-00:00时间戳结束时的时区偏移量。在提供Unix时间戳时,输入seconds [.nanoseconds],其中seconds是自1970年1月1日(午夜UTC / GMT)以来经过的秒数,不包括闰秒(又名Unix时代或Unix时间)和可选项。纳秒字段是一秒不到9位数字的一小部分。

过滤

过滤标志(-f--filter)格式为“key = value”。如果你想使用多个过滤器,传递多个标志(例如 --filter "foo=bar" --filter "bif=baz"
多次使用相同的过滤器将作为_OR_处理; 例如 --filter container=588a23dac085 --filter container=a8f7720b8c22 将显示容器588a23dac085_或_容器a8f7720b8c22的事件
使用多个过滤器将作为_AND_处理; 例如 --filter container=588a23dac085 --filter event=start将显示事件容器器588a23dac085 与_事件类型是_开始
目前支持的过滤器是:

  • 容器(container=<name or id>
  • 守护进程(daemon=<name or id>)
  • 事件(event=<event action>)
  • 图像 (image=<tag or id>)
  • 标签 (label=<key> or label=<key>=<value>)
  • 网络 (network=<name or id>)
  • 插件 (plugin=<name or id>)
  • 类型 (type=<container or image or volume or network or daemon or plugin>)
  • 体积 (volume=<name or id>)
格式

如果格式 (--format) 指定,则将执行给定的模板,而不是默认格式。Go的文本/模板包描述格式的所有细节。
如果格式设置为{{json .}}事件作为有效的JSON行流。有关JSON行的信息,请参阅http://jsonlines.org/.

显示系统范围内的信息(docker system info)

docker system info [OPTIONS]

OPTIONS说明:

  • --format, -f : 使用给定的Go模板格式化输出

删除未使用的数据(docker system prune)

docker system prune [OPTIONS]

OPTIONS说明:

  • --all, -a : 删除所有未使用的图像,而不仅仅是挂起的图像
  • --filter : 提供过滤器值(例如'label = =')
  • --force, -f : 不要提示确认
  • --volumes : 修剪卷

扩展描述

删除所有未使用的容器、卷、网络和图像(---同时挂起和未引用的)。

过滤

过滤标志(-f or --filter) 格式为“key=value”。如果有多个筛选器,则传递多个标志 (例如 --filter "foo=bar" --filter "bif=baz")
目前支持的过滤器是:

  • until(<timestamp>) - 仅删除在给定时间戳之前创建的容器,图像和网络
  • label (label=<key>, label=<key>=<value>, label!=<key>,或label!=<key>=<value>)-仅删除带有%的容器、图像、网络和卷(以防万一label!=...使用)指定的标签。
    until过滤器可以是Unix的时间戳,日期格式的时间戳,或持续时间字符串(例如,去10m1h30m)计算相对于守护机器的时间。支持的格式为日期格式时间戳包括RFC3339Nano,RFC3339, ,2006-01-02T15:04:052006-01-02T15:04:05.9999999992006-01-02Z07:002006-01-02。如果您在时间戳结束时未提供时区偏移Z+-00:00时区偏移,则将使用守护程序上的本地时区。在提供Unix时间戳时输入seconds.nanoseconds,其中seconds是自1970年1月1日(UTC/GMT午夜)以来经过的秒数,不包括闰秒(又名Unix纪元或Unix时间)以及可选的.nanoseconds字段是一秒不超过九位数的一小部分。
    label过滤器接受两种格式。一个是label=...label=<key>label=<key>=<value>),它使用指定的标签删除容器、图像、网络和卷。另一种格式是label!=...label!=<key>label!=<key>=<value>),它在没有指定标签的情况下删除容器、图像、网络和卷。

镜像命令

列出本地主机上的镜像(docker images)

docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS说明:

  • -a :列出本地所有的镜像(含历史映像层)
  • -q :只显示镜像ID。
  • -f :显示满足条件的镜像;
  • --digests :显示镜像的摘要信息;
  • --format :指定返回值的模板文件;
  • --no-trunc :显示完整的镜像信息;

实例

查看本地镜像列表。

root@root:~$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
mymysql                 v1                  37af1236adef        5 minutes ago       329 MB
redis                   latest              4465e4bcad80        3 weeks ago         185.7 MB
java                     5.6-fpm             025041cd3aa5        3 weeks ago         456.3 MB
python                  3.5                 045767ddf24a        3 weeks ago         684.1 MB
...

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签版本号
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

官方搜索网址:https://hub.docker.com/

docker search [OPTIONS] TERM

OPTIONS说明:

  • --automated : 只列出 automated build类型的镜像;
  • --no-trunc : 显示完整的镜像描述;
  • --limit : 条数
  • -f <过滤条件>: 列出收藏数不小于指定值的镜像。
参数 说明
NAME 镜像名称
DESCRIPTION 镜像说明
STARS 点赞数量
OFFICIAL 是否是官方的
AUTOMATED 是否是自动构建的

拉取(下载)镜像(docker pull)

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

从镜像仓库中拉取或者更新指定镜像
OPTIONS说明:

  • -a : 拉取所有 tagged 镜像
  • --disable-content-trust : 忽略镜像的校验,默认开启

没有TAG就是最新版
等价于:docker pull 镜像名字:latest

删除镜像

删除一个或多个容器(docker rm)

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -f : 通过 SIGKILL 信号强制删除一个运行中的容器。
  • -l : 移除容器间的网络连接,而非容器本身。
  • -v : 删除与容器关联的卷。
实例

强制删除容器 db01、db02:

docker rm -f db01 db02

移除容器 nginx01 对容器 db01 的连接,连接名 db:

docker rm -l db 

删除容器 nginx01, 并删除容器挂载的数据卷:

docker rm -v nginx01

删除所有已经停止的容器:

docker rm $(docker ps -a -q)

删除本地一个或多个镜像(docker rmi)

docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS说明:

  • -f : 强制删除;
  • --no-prune : 不移除该镜像的过程镜像,默认移除;
实例

删除单个

docker rmi  -f 镜像ID

删除多个

docker rmi -f 镜像名1:TAG 镜像名2:TAG 

删除全部

docker rmi -f $(docker images -qa)

容器命令

创建一个新的容器并运行一个命令(docker run)

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a, --attach=[]:   登录容器(必须是以 docker run -d 启动的容器);
  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d, --detach=false: 指定容器运行于前台还是后台,并返回容器 ID,默认为false;
  • -i, --interactive=false: 以交互模式运行容器,通常与 -t 同时使用, 打开STDIN,用于控制台交互;
  • -P, --publish-all=false: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p, --publish=[]: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t, --tty=false: 为容器重新分配一个伪输入终端,通常与 -i 同时使用,分配 tty 设备,该可以支持终端登录,默认为 false;
  • -u, --user="" :, 指定容器的用户;
  • -w, --workdir="" :, 指定容器的工作目录;
  • -c, --cpu-shares=0 : 设置容器 CPU 权重,在 CPU 共享场景使用
  • -h, --hostname="" "mars": 指定容器的 hostname;
  • -e,--env=[] : 设置环境变量,容器中可以使用该环境变量(username="ritchie");
  • -m --memory="" : 设置容器使用内存最大值;
  • -v,--volume : 绑定一个卷
  • --volume-driver :指定容器使用的卷驱动程序。
    • 示例:docker run --volume-driver my_driver image_name
  • --name="nginx-lb" : 为容器指定一个名称;
  • --privileged=false :指定容器是否为特权容器,特权容器拥有所有的 capabilities
  • --restart="no" :指定容器停止后的重启策略:
    • no:容器退出时不重启
    • on-failure:容器故障退出(返回值非零)时重启
    • always:容器退出时总是重启
  • --dns=[] 8.8.8.8: 指定容器使用的 DNS 服务器,默认和宿主一致;
  • --dns-search=[] example.com: 指定容器 DNS 搜索域名,默认和宿主一致;
  • --dns-option :为容器的 DNS 配置添加自定义选项。
    • 示例:docker run --dns-option=timeout:5 image_name
  • --add-host :向容器的 /etc/hosts 文件添加自定义主机名和 IP 映射。
    • 示例:docker run --add-host myhost:192.168.0.100 image_name
  • --env-file=[]: 从指定文件读入环境变量;
  • --cpus="":限制 CPU 核数占比,这里设置 0.5 实际占用 CPU25%
  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定 CPU 运行;
  • --cpu-period :设置容器的 CPU 周期,以微秒为单位。
    • 示例:docker run --cpu-period=100000 image_name
  • --net,--network="bridge": 指定容器的网络连接类型,支持
    • bridge: 使用 docker daemon 指定的网桥
    • host: 容器使用主机的网络
    • container:NAME_or_ID: 使用其他容器的网路,共享 IP 和 PORT 等网络资源
    • none: 容器使用自己的网络(类似--net=bridge),但是不进行配置
    • net_id_or_name : 自己创建的网络
  • --ip : 指定容器网络下的 ip
  • --link=[]: 添加链接到另一个容器;
  • --expose=[]: 开放一个端口或一组端口;
  • --log-driver="" :日志驱动程序
    • max-size
    • max-file
    • labels
    • env
    • env-regex
    • 其他日志驱动系统
      • fluentd
      • syslog
      • logentries
        • 使用 –log-opt NAME = VALUE,指定 Logentries 日志记录驱动程序的参数。
        • logentries-token
          logentries 驱动程序的日志集令牌
        • line-only
          是否将日志消息包装到容器数据中(默认)或发送原始日志行
      • gelf
        gelf 日志驱动程序是一种方便的格式,兼容许多工具,例如Graylog、Logstash和Fluentd。在 GELF 中,每个日志消息都是一个字典,具有以下字段:版本、主机(最初发送消息的人)、时间戳、消息的短版本和长版本以及您自己配置的任何自定义字段。
        • 使用 –log-opt NAME = VALUE,指定 gelf 日志记录驱动程序的参数。
        • gelf-address
          必需
          GELF 服务器的地址。 支持 tcp 和 udp,必须指定端口。
          –log-opt gelf-address=udp://192.168.0.42:12201
        • gelf-compression-type
          可选 UDP Only
          压缩类型。参数值可以是 gzip、zlib 和 none。默认值为 gzip。注意,启用压缩会导致过多的 CPU 使用率,因此强烈建议将其设置为 none。
          –log-opt gelf-compression-type=gzip
        • gelf-compression-level
          可选 UDP Only
          当 gelf-compression-type 为 gzip 或 zlib 时的压缩级别。范围为 -1 到 9(BestCompression)的整数。默认值为 1(BestSpeed)。较高的级别提供更低速度的更多压缩。-1 或 0 都会禁用压缩。
          –log-opt gelf-compression-level=2
        • gelf-tcp-max-reconnect
          可选 TCP Only
          连接断开时重新连接尝试的最大次数。正整数。默认值为 3。
          –log-opt gelf-tcp-max-reconnect=3
        • gelf-tcp-reconnect-delay
          可选 TCP Only
          重新连接尝试之间等待的秒数。正整数。默认值为 1。
          –log-opt gelf-tcp-reconnect-delay=1
        • tag
          可选
          附加到 gelf 消息中 APP-NAME 的字符串。默认容器 ID 的前 12 个字符来标记日志消息。
          –log-opt tag=mailer
        • labels
          可选
          启动 Docker 守护程序时配置。用于配置日志格式。参考 自定义日志tag
          –log-opt labels=production_status,geo
        • labels-regex
          可选
          –log-opt labels-regex=^(production_status|geo)
        • env
          可选
          启动 Docker 守护程序时应用。
          –log-opt env=os,customer
        • env-regex
          可选
          用于匹配与日志记录相关的环境变量的正则表达式。
          –log-opt env-regex=^(os|customer)
  • --log-opt : 添加 log 参数
    • max-size=10m : 滚动日志之前的最大大小。正整数加上表示度量单位(k、m或g)的修饰符。默认为20m
    • max-file=3 : 可以存在的日志文件的最大数量。如果滚动日志创建了多余的文件,则删除最旧的文件。正整数。默认为5
    • compress=false : 切换旋转日志文件的压缩。默认启用
选项 描述 示例值
max-size 滚动前日志的最大大小。一个正整数加上一个代表测量单位(k,m 或 g)的修饰符。默认为 -1(无限制)。 --log-opt max-size=10m
max-file 可以存在的最大日志文件数量。如果滚动日志会创建多余文件,则会删除最旧的文件。只有在设置了 max-size 时才有效。一个正整数。 默认为1。 --log-opt max-file=3
labels 在启动 Docker 守护进程时适用。守护进程接受的日志相关标签的逗号分隔列表。用于高级日志标记选项。 --log-opt labels=production_status,geo
env 在启动 Docker 守护进程时适用。此守护程序接受的与日志相关的环境变量的逗号分隔列表。用于高级日志标记选项。 --log-opt env=os,customer
env-regex 与 env 类似且兼容。一个正则表达式来匹配与日志相关的环境变量。用于高级日志标记选项。 `–log-opt env-regex=^(os
logentries logentries日志驱动程序将容器日志发送到Logentries服务器。 --log-driver = logentries --log-opt logentries-token = abcd1234-12ab-34cd-5678-0123456789ab
gelf gelf日志驱动程序 --log-driver gelf --log-opt gelf-address = \udp://1.2.3.4:12201 \
  • --volumes-from=[] : 给容器挂载其他容器上的卷,挂载到容器的某个目录
  • --cap-add=[] :, 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
  • --cap-drop=[] :, 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
  • --cidfile="" :, 运行容器后,在指定文件中写入容器 PID 值,一种典型的监控系统用法
  • --device=[] :, 添加主机设备给容器,相当于设备直通
  • --entrypoint="" : 覆盖 image 的入口点
  • --lxc-conf=[] : 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
  • --rm=false :指定容器停止后自动删除容器(不支持以 docker run -d 启动的容器)
  • --sig-proxy=true :设置由代理接受并处理信号,但是 IGCHLD、SIGSTOP 和 SIGKILL 不能被代理
  • --ulimit:设置容器的资源限制,如最大打开文件数、最大进程数等。
    • 示例:docker run --ulimit nofile=1024:1024 image_name
  • --security-opt:设置容器的安全选项,如 AppArmor 配置、Seccomp 配置等。
    • 示例:docker run --security-opt seccomp:unconfined image_name
  • --shm-size :设置容器的共享内存大小。
    • 示例:docker run --shm-size 2g image_name
  • --read-only :将容器的文件系统设置为只读模式。
    • 示例:docker run --read-only image_name25. –cpu-quota:设置容器的 CPU 配额,以微秒为单位。 示例:docker run --cpu-quota=50000 image_name`
  • --sysctl :设置容器的内核参数。
    • 示例:docker run --sysctl net.ipv4.ip_forward=1 image_name
  • --label :为容器添加标签,用于识别和组织容器。
    • 示例:docker run --label env=production image_name
  • --workdir :设置容器的工作目录。
    • 示例:docker run --workdir /app image_name
  • --tmpfs :在容器内创建临时文件系统,用于存储临时数据。
    • 示例:docker run --tmpfs /tmp image_name
参数 说明
-p hostPort:containerPort 端口映射 -p 8080:80
-p hostPort:containerPort 配置监听地址 -p 10.0.0.100:8080:80
-p ip::containerPort 随机分配端口 -p 10.0.0.100::80
-p hostPort:containerPort:udp 指定协议 -p 8080:80:tcp
-p 81:80 -p 443:443 指定多个

列出当前所有正在运行的容器(docker ps)

docker ps [OPTIONS]

OPTIONS说明:

  • -a : 显示所有的容器,包括未运行的。
  • -f : 根据条件过滤显示的内容。
  • --format : 指定返回值的模板文件。
  • -l : 显示最近创建的容器。
  • -n : 列出最近创建的n个容器。
  • --no-trunc : 不截断输出。
  • -q : 静默模式,只显示容器编号。
  • -s : 显示总的文件大小。
    输出详情介绍:
  • CONTAINER ID: 容器 ID。
  • IMAGE: 使用的镜像。
  • COMMAND: 启动容器时运行的命令。
  • CREATED: 容器的创建时间。
  • STATUS: 容器状态。
    • 状态有7种:
      • created(已创建)
      • restarting(重启中)
      • running(运行中)
      • removing(迁移中)
      • paused(暂停)
      • exited(停止)
      • dead(死亡)
  • PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
  • NAMES: 自动分配的容器名称。

实例

列出所有在运行的容器信息。

tmesh@192.168:~$ docker ps
CONTAINER ID   IMAGE          COMMAND                ...  PORTS                    NAMES
09b93464c2f7   nginx:latest   "nginx -g 'daemon off" ...  80/tcp, 443/tcp          mytmesh
96f7f14e99ab   mysql:5.6      "docker-entrypoint.sh" ...  0.0.0.0:3306->3306/tcp   mymysql

列出最近创建的5个容器信息。
tmesh@192.168:~$ docker ps -n 5

CONTAINER ID        IMAGE               COMMAND                   CREATED           
09b93464c2f7        nginx:latest        "nginx -g 'daemon off"    2 days ago   ...     
b8573233d675        nginx:latest        "/bin/bash"               2 days ago   ...     
b1a0703e41e7        nginx:latest        "nginx -g 'daemon off"    2 days ago   ...    
f46fb1dec520        5c6e1090e771        "/bin/sh -c 'set -x \t"   2 days ago   ...   
a63b4a5597de        860c279d2fec        "bash"                    2 days ago   ...

列出所有创建的容器ID。

tmesh@192.168:~$ docker ps -a -q
09b93464c2f7
b8573233d675
...

进去容器 / 在运行的容器中执行命令(docker exec)

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

  • -d : 分离模式: 在后台运行
  • -i : 即使没有附加也保持STDIN 打开
  • -t : 分配一个伪终端
    也可以通过 docker ps -a 命令查看已经在运行的容器,然后使用容器 ID 进入容器。
    查看已经在运行的容器 ID:
# docker ps -a ...
9df70f9a0714        openjdk             "/usercode/script.sh…" 
...

第一列的 9df70f9a0714 就是容器 ID。
通过 exec 命令对指定的容器执行 bash:

sudo docker exec -it $DOCKER_ID /bin/bash -c 'cd /packages/detectron && python tools/train.py'

# 或

sudo docker exec $DOCKER_ID /bin/bash -c 'cd /packages/detectron && python tools/train.py'

进入容器

docker exec -it 9df70f9a0714 /bin/bash

连接到正在运行中的容器(docker attach)

docker attach [OPTIONS] CONTAINER

要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。

exec 和 attach 的区别

  • attach 直接进入容器启动命令的终端,不会启动新的进程,用 exit 退出,会导致容器的停止。
  • exec 是在容器中打开新的终端,并且可以启动新的进程,用 exit 退出,不会导致容器的停止。

推荐大家使用docker exec 命令,因为退出容器终端,不会导致容器的停止。

退出容器

  • exit: 退出容器并结束容器运行
  • ctrl + p + q: 退出容器但是容器仍在执行会回到宿主机桌面,容器不停止

启动一个或多个处于停止中的的容器(docker start)

docker start [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • 该命令中的CONTAINER既可以是容器的Name,也可以是容器的ID。
  • -a : 在前台运行容器并输出日志
  • -i : 启动并进入交互模式

重启容器(docker restart)

docker restart [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -s, --signal : 发送给容器一个信号
  • -t, --time : 多少秒之后杀死容器

停止一个或多个正在运行的容器(docker stop)

docker stop [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -t, --time: 在杀死容器之前等待时间,单位为秒,默认10s

强制停止容器(docker kill)

docker kill [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -s, --signal: 向容器内发送一个信号量,默认的信号量是SIGKILL

docker stop和docker kill的差别

相同点

docker stop 和 docker kill 都可以终止运行中的 docker 容器,都是通过信号量的方式来通知容器

不同点

docker stop:docker 通过 containerd 先发送 SIGTERM 信号量到容器主进程,允许其在一定时间(默认10秒)内进行一些必要的回收操作,如果通过 containerd 收到了容器退出的消息则表示退出成功,如果这段时间没有收到容器退出的消息,则发送 SIGKILL 信号强行杀死容器,整个过程比较优雅
docker kill:docker 通过 containerd 默认直接发送 SIGKILL 信号量,直接杀死容器,也可以通过 -s 命令发送其它信号量
上述两个命令类似于 linux 中的 kill 和 kill -9 这两个命令,kill 与 docker stop 相似,kill -9 与 docker kill 类似

删除一个或多个容器(docker rm)

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -f : 通过 SIGKILL 信号强制删除一个运行中的容器。
  • -l : 移除容器间的网络连接,而非容器本身。
  • -v : 删除与容器关联的卷。

实例

强制删除容器 db01、db02:

docker rm -f db01 db02

移除容器 nginx01 对容器 db01 的连接,连接名 db:

docker rm -l db

删除容器 nginx01, 并删除容器挂载的数据卷:

docker rm -v nginx01

删除所有已经停止的容器:

docker rm $(docker ps -a -q)

获取容器的日志(docker logs)

docker logs [OPTIONS] CONTAINER

OPTIONS说明:

-f : 跟踪日志输出
-t : 显示时间戳
--since :显示某个开始时间的所有日志
--tail :仅列出最新N条容器日志

查看容器中运行的进程信息(docker top)

docker top [OPTIONS] CONTAINER [ps OPTIONS]

容器运行时不一定有 /bin/bash 终端来交互执行 top 命令,而且容器还不一定有 top 命令,可以使用 docker top 来实现查看 container 中正在运行的进程。

实例

查看容器 mysql 的进程信息。

tmesh@192.168:~/mysql$ docker top mymysql
UID    PID    PPID    C      STIME   TTY  TIME       CMD
999    40347  40331   18     00:58   ?    00:00:02   mysqld

查看所有运行容器的进程信息。

for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done

获取容器/镜像的元数据(docker inspect)

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS说明:

  • -f : 指定返回值的模板文件。
  • -s : 显示总的文件大小。
  • --type : 为指定类型返回JSON。
    获取正在运行的容器mymysql的 IP。
tmesh@192.168:~$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mymysql
172.17.0.3

容器与主机之间的数据拷贝(docker cp)

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

实例

将主机/www/tmesh目录拷贝到容器96f7f14e99ab的/www目录下。

docker cp /www/tmesh 96f7f14e99ab:/www/

将主机/www/tmesh目录拷贝到容器96f7f14e99ab中,目录重命名为www。

docker cp /www/tmesh 96f7f14e99ab:/www

将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。

docker cp  96f7f14e99ab:/www /tmp/

导出容器

将文件系统作为一个tar归档文件导出到STDOUT

docker export [OPTIONS] CONTAINER

OPTIONS说明:

  • -o : 将输入内容写到文件。

实例

将id 为 a404c6c174a2 的容器按日期保存为 tar 文件。

tmesh@192.168:~$ docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
tmesh@192.168:~$ ls mysql-`date +%Y%m%d`.tar
mysql-20160711.tar

docker export 3065f084c80d > centos.tar.gz

导入容器(docker import)

从归档文件中创建镜像。

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

OPTIONS说明:

  • -c : 应用docker 指令创建镜像;
  • -m : 提交时的说明文字;

实例

从镜像归档文件 my_ubuntu_v3.tar 创建镜像,命名为 tmesh/ubuntu:v4

tmesh@tmesh:~$ docker import  my_ubuntu_v3.tar tmesh/ubuntu:v4  
sha256:63ce4a6d6bc3fabb95dbd6c561404a309b7bdfc4e21c1d59fe9fe4299cbfea39
tmesh@tmesh:~$ docker images tmesh/ubuntu:v4
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tmesh/ubuntu       v4                  63ce4a6d6bc3        20 seconds ago      142.1 MB

容器网路(docker network)

Docker 网络模式(Network Modes)

1、桥接模式(Bridge Network)

Docker 的 bridge 网络模式是 Docker 的默认网络模式。当 Docker 进程启动时,它会在主机上创建一个名为 docker0 的虚拟网桥。此主机上启动的 Docker 容器会连接到这个虚拟网桥上。这个虚拟网桥的工作方式类似于物理交换机,使得主机上的所有容器都通过交换机连接在一个二层网络中。
[Pasted image 20240425144717.png]
在这种模式下,Docker 会为每个新创建的容器分配独立的 Network Namespace 和 IP 段等,同时文件系统、进程等也是隔离的。容器内部会有一个虚拟网卡,名为 eth0,容器之间可以通过这个虚拟网卡和内部的IP地址进行通信。另外,从 docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。
然而,处于桥接模式的容器和宿主机网络不在同一个网段,容器一般使用 172.16.0.xx/24 这种网段。因此,容器不能直接和宿主机以外的网络进行通信,而必须要经过 NAT 转换。同时,容器需要在宿主机上竞争端口,完成端口映射的配置后,从外部到容器内的网络访问 tcp 流量将会通过 DNAT 从宿主机端口转发到容器内对应的端口上。此外,容器对于宿主机以外是不可见的,从容器发出的网络请求会通过 SNAT 从已对接的虚拟网桥(如宿主机的 docker0)上统一发出。

2、Host 网络

Docker 的 host 网络模式是另一种网络模式,与 bridge 模式不同,它将容器直接融入到主机的网络栈中,使得容器直接使用主机的网络接口和 IP 地址。在这种模式下,容器不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。因此,容器内部的服务可以使用宿主机的网络地址和端口,无需进行 NAT 转换,网络性能较好。
使用 host 网络模式的一个典型场景是需要容器与宿主机共享网络资源或者容器需要快速访问宿主机网络服务的场景。例如,如果需要在容器内部运行一些网络相关的应用,如网络监控、日志收集等,这些应用需要直接访问宿主机的网络接口和 IP 地址,此时就可以使用 host 网络模式。
[Pasted image 20240425144906.png]
需要注意的是,由于容器与宿主机共用一个网络栈,因此容器的网络隔离性较差,可能存在安全隐患。如果需要在不同主机上运行容器并实现跨主机通信,则不能使用 host 网络模式。

总的来说,Docker 的 host 网络模式提供了一种将容器与宿主机网络栈直接融合的方式,使得容器可以直接使用宿主机的网络接口和IP地址,适用于一些需要快速访问宿主机网络服务的场景。但是需要注意的是,该模式下容器的网络隔离性较差,需要谨慎使用

3、None 网络
  • Docker 的 none 网络模式是 Docker 提供的一种特殊网络模式,它将容器与宿主机隔离开来,不提供任何网络能力。在这种模式下,容器内部没有网卡、IP 地址、路由等信息,只有一个回环网络(loopback)接口。这意味着容器不能访问外部网络,也不能被外部网络访问。
  • none 网络模式通常用于一些特殊场景,比如需要在容器内部运行一些独立的、与网络无关的应用程序,或者需要进行一些网络调试。由于容器与外部网络完全隔离,这种模式可以增加容器的安全性。
4、container 模式

Docker 的 container 网络模式是指新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。这意味着新创建的容器不会创建自己的网卡、配置自己的 IP 地址,而是和一个已存在的容器共享 IP 地址、端口范围等网络资源。同时,这两个容器的进程可以通过 lo 网卡设备通信。然而,这两个容器在其他方面,如文件系统、进程列表等,仍然是隔离的。
[Pasted image 20240425145011.png]
使用 container 网络模式的一个典型场景是,当需要多个容器之间共享网络配置时,可以使用该模式。例如,可以使用该模式创建一个 nginx 容器,并指定其网络模型为 container 模式,和另一个已经存在的容器共享网络命名空间。这样,nginx 容器就可以直接使用另一个容器的IP地址和端口,无需进行额外的网络配置。

Docker 网络驱动程序

Docker 使用 Linux 内核的一些特性来实现其网络功能,而这些功能是通过不同的网络驱动程序来实现的。Docker 支持多种网络驱动程序,每种驱动程序都有其特定的用途和场景。

  • bridge(桥接):这是 Docker 的默认网络驱动程序。它会在宿主机上创建一个虚拟网桥(通常是 docker0),并将容器连接到这个网桥上。容器之间以及容器与宿主机之间可以通过这个网桥进行通信。bridge 模式适用于单个宿主机上的容器互联场景。
  • host:host 网络驱动程序将容器直接融入主机的网络栈中,容器将共享主机的网络接口和IP地址。这意味着容器内部的服务可以直接使用主机的网络地址和端口,无需进行 NAT 转换。host 模式适用于需要容器与宿主机共享网络资源的场景,但需要注意安全性和隔离性问题。
  • overlay:overlay 网络驱动程序用于创建跨多个 Docker 守护进程的分布式网络。它通过内置的 DNS 服务实现容器之间的跨主机通信。overlay 模式适用于需要构建分布式应用程序的场景,可以让容器在不同宿主机之间进行通信。
  • macvlan:macvlan 网络驱动程序允许容器使用宿主机的物理网络接口,并为其分配一个 MAC 地址。这样,容器可以像虚拟机一样直接连接到物理网络上,并与其他设备通信。macvlan 模式适用于需要容器直接访问物理网络的场景。
  • ipvlan:ipvlan 是另一种类似于 macvlan 的网络驱动程序,但它基于 IP 地址而不是 MAC 地址来分配网络。ipvlan 模式提供了更好的扩展性和灵活性,适用于不同的网络场景。
  • none:none 网络驱动程序不提供任何网络功能,容器将处于完全隔离的状态。它通常用于一些特殊场景,如运行与网络无关的应用程序或进行网络调试。
    [Pasted image 20240425145145.png]

创建网络(create)

docker network create 命令用于在 Docker 中创建一个新的网络。这个命令允许指定网络的名称、驱动程序以及其他选项,以满足不同的网络需求。

语法
docker network create [OPTIONS] NETWORK
选项
名称,简写 默认 说明
--attachable false API 1.25+,启用手动容器安装
--aux-address map[] Network驱动程序使用的辅助 IPv4 或 IPv6 地址
--driver, -d bridge 驱动程序管理网络
--gateway 用于主子网的 IPv4 或 IPv6 网关
--internal false 限制对网络的外部访问
--ip-range 从子范围分配容器 ip
--ipam-driver default IP 地址管理驱动程序
--ipam-opt map[] 设置 IPAM 驱动程序的具体选项
--ipv6 false 启用 IPv6 网络
--label 在网络上设置元数据
--opt, -o map[] 设置驱动程序特定选项
--subnet 表示网段的 CIDR 格式的子网,代表网络段
--config-from API 1.30+,从中复制配置的网络
--config-only API 1.30+,仅创建配置网络
--ingress API 1.29+,创建Swarm路由网格网络
--scope API 1.30+,控制网络的范围
自定义网络
  • 自定义网络模式,docker 主要提供了三种自定义网络驱动:
    • bridge
    • overlay
    • macvlan
      bridge 驱动类似默认的 bridge 网络模式,但增加了一些新的功能,overlay 和 macvlan 是用于创建跨主机网络
  • 建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动 DNS 解析容器名称到 IP地址。
示例
docker network create \
--driver bridge \
--subnet=172.18.12.0/16 \
--gateway=172.18.1.1 \
--ip-range=172.18.50.0/24 \
--aux-address="my-router=172.18.50.10" \
mynet
  • --driver bridge 表示使用桥接模式
  • --subnet 172.18.12.0/16 表示子网ip 可以分配 172.18.1.2 到 172.18.255.255
  • --gateway 172.18.1.1 表示网关
    • --ip-range:指定网络的 IP 地址范围。
  • --aux-address:指定网络的辅助地址。
  • mynet 表示网络名

列出网络(ls)

docker network ls命令用于列出网络。列出引擎守护进程知道的所有网络。 这包括跨群集中多个主机的网络。

语法
docker network ls [OPTIONS]
选项
名称,简写 默认 说明
--filter, -f 提供过滤器值(例如’driver = bridge‘)
--format 使用Go模板的美化网络
--no-trunc false 不要截断输出
--quiet, -q false 只显示网络ID

显示网络信息(inspect)

docker network inspect命令用于显示一个或多个网络的详细信息。它返回有关一个或多个网络的信息。 默认情况下,此命令将所有结果呈现在 JSON 对象中。

语法
docker network inspect [OPTIONS] NETWORK [NETWORK...]
选项
名称,简写 默认 说明
--format, -f 使用给定的Go模板格式化输出

将容器连接到网络(connect)

docker network connect命令用于将容器连接到网络。可以按名称或 ID 连接容器。 一旦连接,容器可以与同一网络中的其他容器通信。

语法
docker network connect [OPTIONS] NETWORK CONTAINER
选项
名称,简写 默认 说明
--alias 为容器添加网络范围的别名
--ip 指定IP地址
--ip6 指定IPv6地址
--link 添加链接到另一个容器
--link-local-ip 添加容器的链接本地地址

断开容器的网络(disconnect)

docker network disconnect命令用于断开容器的网络。容器必须运行才能将其与网络断开连接。

语法
docker network disconnect [OPTIONS] NETWORK CONTAINER
选项
名称,简写 默认 说明
--force, -f false 强制容器断开网络的连接

删除一个或多个网络(rm)

docker network rm命令用于删除一个或多个网络。按名称或标识符删除一个或多个网络。 要删除网络,必须要先断开连接到它的任何容器的网络。

语法
docker network rm NETWORK [NETWORK...]
选项
名称,简写 默认 说明
--force, -f false 不要提示确认

删除所有未使用的网络(prune)

docker network prune命令用于删除所有未使用的网络。未使用的网络是不被任何容器引用的网络。

语法
docker network prune [OPTIONS]
选项
名称,简写 默认 说明
--force, -f false 不要提示确认

标签:容器,--,网络,笔记,Docker,docker,日志
From: https://www.cnblogs.com/TMesh/p/18677238

相关文章

  • 前端 http学习笔记
    1.http全称是HyperTextTransferProtocol超文本传输协议2.TCP/IP协议栈分为应用层,传输层,网络层,数据链路层。HTTP工作在应用层。底层数据传输由TCPUDP负责3.HTTP的版本1.最常用的是HTTP/1.1 HTTP/2HTTP/32.HTTP/1.1依然在被广泛使用, http/2引入了多路复用,二进制帧......
  • CentOS等各类Linux系统安装配置Docker详细教程(全网最详细,步骤简洁,看完包懂)
    文章目录前言详细步骤1.安装相关依赖2.安装阿里云的DockerGPG密钥3.设置stable仓库4.安装Docker5.启动服务6.验证测试常见问题及对应解决方案补充1.Ubuntu等系统配置Docker详细教程CentOS9配置Docker-速通版前言Docker是一个非常常用的工具,但是由于其涉及......
  • juju的电脑基本操作学习笔记_打开CMD与bash命令
    juju的电脑基本操作学习笔记_打开CMD与bash命令普普通通滴打开CMD方式一:任务栏搜索CMD方式二:按住win+R打开运行在里面输入cmd方式三:在文件夹的任何一个位置单击右键,选择Openinterminal方式四:在资源管理器的地址栏的最前面加上cmd空格再回车以管理员方式运行CMD常用的b......
  • Docker Desktop
    目录介绍下载DockerDesktop安装程序安装DockerDesktop启动DockerDesktop配置DockerDesktop验证安装解决常见问题安装失败或依赖问题卸载DockerDesktop介绍DockerDesktop是一款针对个人开发者和小型团队设计的桌面应用程序,它提供了一种简单、方便的方式来创建、管理......
  • [docker逃逸] 使用DirtyPipe漏洞逃逸
    本文作者CVE-柠檬iCSDN:https://blog.csdn.net/weixin_49125123博客园:https://www.cnblogs.com/CVE-Lemon微信公众号:Lemon安全前言本文使用代码下载链接:利用CVE-2022-0847(DirtyPipe)实现容器逃逸(github.com)由于本人才疏学浅,本文不涉及漏洞原理,仅有复现。本文是通过利......
  • STM32学习笔记—SPI总线通信原理与实验
    SPI总线通信原理SPI总线简介SPI接口是Motorola首先提出的全双工三线同步串行外围接口,采用主从模式(MasterSlave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSBfirst);SPI接口有2根单向数据线,为全双工通信,......
  • Docker 安装 Nacos
    目录拉取nacos镜像挂载目录启动nacos并复制文件到宿主机,删除容器启动容器复制文件删除容器启动naocs语句讲解访问nacos修改配置文件进入容器内部扩展–nacos配置mysql数据库application.properties(nacos完整配日志文件)nacos-mysql(nacosmysql表)拉取nacos镜像......
  • Docker 安装 Seata
    目录创建数据库拉取Seata镜像挂载目录启动临时容器拷贝临时容器的配置至宿主机完成之后删除临时容器(过河拆桥)自定义配置Nacos配置命名空间配置文件启动Seata坑1.Nacos显示Seata服务的ip为容器内网ip导致微服务无法访问2.使用host宿主机网络3.seataThedistribu......
  • 【后端笔记】系统功能概览
    一、后端系统功能总结(详细版)后端系统承担着数据处理、业务逻辑执行、前端交互以及与外部系统的集成等任务。一个高效的后端系统应具备各项功能,以保证系统的稳定性、扩展性和安全性。以下是后端系统功能的详细总结:(一)用户管理功能(1)用户注册与登录注册:提供用户创建账户......
  • 原根学习笔记+BSGS复习笔记
    学原根发现拔山盖世算法忘光了,干脆一块儿写了吧。\(BSGS\)算法\(BSGS\)算法,又名拔山盖世算法、北上广深算法。他解决的问题如下:求解最小的可行的\(k\),满足\(a^k\equivb(\bmodp)\),其中保证\(\gcd(a,p)=1\)。容易想到暴力枚举,时间复杂度\(O(p)\),但是巨劣,考虑优化。......