導航:首頁 > 異常信息 > docker導致網路異常

docker導致網路異常

發布時間:2022-07-13 01:00:29

㈠ docker run 和網路有關嗎

在Docker中,run應該是用戶使用最多的命令了,很多讀者反饋不是很明白run命令的用法,而且相關的書籍、中文資料中對run命令的描述也不是非常完整,所以DockerOne組織翻譯了Docker官方的文檔,以饗讀者。注意,本文基於最新的Docker 1.4文檔翻譯。

Docker會在隔離的容器中運行進程。當運行 docker run命令時,Docker會啟動一個進程,並為這個進程分配其獨占的文件系統、網路資源和以此進程為根進程的進程組。在容器啟動時,鏡像可能已經定義了要運行的二進制文件、暴露的網路埠等,但是用戶可以通過docker run命令重新定義(譯者註:docker run可以控制一個容器運行時的行為,它可以覆蓋docker build在構建鏡像時的一些默認配置),這也是為什麼run命令相比於其它命令有如此多的參數的原因。

命令格式
最基本的docker run命令的格式如下:
$ sudo docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

如果需要查看[OPTIONS]的詳細使用說明,請參考Docker關於OPTIONS的章節。這里僅簡要介紹Run所使用到的參數。OPTIONS總起來說可以分為兩類:

設置運行方式:
決定容器的運行方式,前台執行還是後台執行;
設置containerID;
設置網路參數;
設置容器的CPU和內存參數;
- 設置許可權和LXC參數;
設置鏡像的默認資源,也就是說用戶可以使用該命令來覆蓋在鏡像構建時的一些默認配置。

docker run [OPTIONS]可以讓用戶完全控制容器的生命周期,並允許用戶覆蓋執行docker build時所設定的參數,甚至也可以修改本身由Docker所控制的內核級參數。

Operator exclusive options
當執行docker run時可以設置以下參數:

Detached vs Foreground
Detached (-d)
- Foreground
Container Identification
Name (--name)
- PID Equivalent
IPC Setting
Network Settings
Clean Up (--rm)
Runtime Constraints on CPU and Memory
Runtime Privilege, Linux Capabilities, and LXC Configuration

接下來我們依次進行介紹。

Detached vs foreground

當我們啟動一個容器時,首先需要確定這個容器是運行在前台還是運行在後台。
-d=false: Detached mode: Run container in the background, print new container id

Detached (-d)

如果在docker run後面追加-d=true或者-d,那麼容器將會運行在後台模式。此時所有I/O數據只能通過網路資源或者共享卷組來進行交互。因為容器不再監聽你執行docker run的這個終端命令行窗口。但你可以通過執行docker attach來重新附著到該容器的回話中。需要注意的是,容器運行在後台模式下,是不能使用--rm選項的。

Foregroud
在前台模式下(不指定-d參數即可),Docker會在容器中啟動進程,同時將當前的命令行窗口附著到容器的標准輸入、標准輸出和標准錯誤中。也就是說容器中所有的輸出都可以在當前窗口中看到。甚至它都可以虛擬出一個TTY窗口,來執行信號中斷。這一切都是可以配置的:
-a=[] : Attach to `STDIN`, `STDOUT` and/or `STDERR`
-t=false : Allocate a pseudo-tty
--sig-proxy=true: Proxify all received signal to the process (non-TTY mode only)
-i=false : Keep STDIN open even if not attached

如果在執行run命令時沒有指定-a參數,那麼Docker默認會掛載所有標准數據流,包括輸入輸出和錯誤,你可以單獨指定掛載哪個標准流。
$ sudo docker run -a stdin -a stdout -i -t ubuntu /bin/bash

如果要進行互動式操作(例如Shell腳本),那我們必須使用-i -t參數同容器進行數據交互。但是當通過管道同容器進行交互時,就不需要使用-t參數,例如下面的命令:
echo test | docker run -i busybox cat

容器識別

Name(--name)

可以通過三種方式為容器命名:

1. 使用UUID長命名("")
2. 使用UUID短命令("f78375b1c487")
3. 使用Name("evil_ptolemy")

這個UUID標示是由Docker deamon生成的。如果你在執行docker run時沒有指定--name,那麼deamon會自動生成一個隨機字元串UUID。但是對於一個容器來說有個name會非常方便,當你需要連接其它容器時或者類似需要區分其它容器時,使用容器名稱可以簡化操作。無論容器運行在前台或者後台,這個名字都是有效的。

PID equivalent

如果在使用Docker時有自動化的需求,你可以將containerID輸出到指定的文件中(PIDfile),類似於某些應用程序將自身ID輸出到文件中,方便後續腳本操作。
--cidfile="": Write the container ID to the file

Image[:tag]

當一個鏡像的名稱不足以分辨這個鏡像所代表的含義時,你可以通過tag將版本信息添加到run命令中,以執行特定版本的鏡像。例如: docker run ubuntu:14.04

IPC Settings

默認情況下,所有容器都開啟了IPC命名空間。
--ipc="" : Set the IPC mode for the container,
'container:<name|id>': reuses another container's IPC namespace
'host': use the host's IPC namespace inside the container

IPC(POSIX/SysV IPC)命名空間提供了相互隔離的命名共享內存、信號燈變數和消息隊列。

共享內存可以提高進程數據的交互速度。共享內存一般用在資料庫和高性能應用(C/OpenMPI、C++/using boost libraries)上或者金融服務上。如果需要容器中部署上述類型的應用,那麼就應該在多個容器直接使用共享內存了。

Network settings

默認情況下,所有的容器都開啟了網路介面,同時可以接受任何外部的數據請求。
--dns=[] : Set custom dns servers for the container
--net="bridge" : Set the Network mode for the container
'bridge': creates a new network stack for the container on the docker bridge
'none': no networking for this container
'container:<name|id>': reuses another container network stack
'host': use the host network stack inside the container
--add-host="" : Add a line to /etc/hosts (host:IP)
--mac-address="" : Sets the container's Ethernet device's MAC address

你可以通過docker run --net none來關閉網路介面,此時將關閉所有網路數據的輸入輸出,你只能通過STDIN、STDOUT或者files來完成I/O操作。默認情況下,容器使用主機的DNS設置,你也可以通過--dns來覆蓋容器內的DNS設置。同時Docker為容器默認生成一個MAC地址,你可以通過--mac-address 12:34:56:78:9a:bc來設置你自己的MAC地址。

Docker支持的網路模式有:

none。關閉容器內的網路連接
bridge。通過veth介面來連接容器,默認配置。
host。允許容器使用host的網路堆棧信息。 注意:這種方式將允許容器訪問host中類似D-BUS之類的系統服務,所以認為是不安全的。
container。使用另外一個容器的網路堆棧信息。
None模式

將網路模式設置為none時,這個容器將不允許訪問任何外部router。這個容器內部只會有一個loopback介面,而且不存在任何可以訪問外部網路的router。

Bridge模式

Docker默認會將容器設置為bridge模式。此時在主機上面將會存在一個docker0的網路介面,同時會針對容器創建一對veth介面。其中一個veth介面是在主機充當網卡橋接作用,另外一個veth介面存在於容器的命名空間中,並且指向容器的loopback。Docker會自動給這個容器分配一個IP,並且將容器內的數據通過橋接轉發到外部。

Host模式

當網路模式設置為host時,這個容器將完全共享host的網路堆棧。host所有的網路介面將完全對容器開放。容器的主機名也會存在於主機的hostname中。這時,容器所有對外暴露的埠和對其它容器的連接,將完全失效。

Container模式

當網路模式設置為Container時,這個容器將完全復用另外一個容器的網路堆棧。同時使用時這個容器的名稱必須要符合下面的格式:--net container:<name|id>.

比如當前有一個綁定了本地地址localhost的Redis容器。如果另外一個容器需要復用這個網路堆棧,則需要如下操作:
$ sudo docker run -d --name redis example/redis --bind 127.0.0.1
$ # use the redis container's network stack to access localhost
$ sudo docker run --rm -ti --net container:redis example/redis-cli -h 127.0.0.1

管理/etc/hosts
/etc/hosts文件中會包含容器的hostname信息,我們也可以使用--add-host這個參數來動態添加/etc/hosts中的數據。
$ /docker run -ti --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts
172.17.0.22 09d03f76bf2c
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
86.75.30.9 db-static

Clean up (--rm)

默認情況下,每個容器在退出時,它的文件系統也會保存下來,這樣一方面調試會方便些,因為你可以通過查看日誌等方式來確定最終狀態。另外一方面,你也可以保存容器所產生的數據。但是當你僅僅需要短暫的運行一個容器,並且這些數據不需要保存,你可能就希望Docker能在容器結束時自動清理其所產生的數據。

這個時候你就需要--rm這個參數了。 注意:--rm 和 -d不能共用!
--rm=false: Automatically remove the container when it exits (incompatible with -d)

Security configuration
--security-opt="label:user:USER" : Set the label user for the container
--security-opt="label:role:ROLE" : Set the label role for the container
--security-opt="label:type:TYPE" : Set the label type for the container
--security-opt="label:level:LEVEL" : Set the label level for the container
--security-opt="label:disable" : Turn off label confinement for the container
--secutity-opt="apparmor:PROFILE" : Set the apparmor profile to be applied to the container

你可以通過--security-opt修改容器默認的schema標簽。比如說,對於一個MLS系統來說(譯者註:MLS應該是指Multiple Listing System),你可以指定MCS/MLS級別。使用下面的命令可以在不同的容器間分享內容:
#docker run --security-opt label:level:s0:c100,c200 -i -t fedora bash

如果是MLS系統,則使用下面的命令:
# docker run --security-opt label:level:TopSecret -i -t rhel7 bash

使用下面的命令可以在容器內禁用安全策略:
# docker run --security-opt label:disable -i -t fedora bash

如果你需要在容器內執行更為嚴格的安全策略,那麼你可以為這個容器指定一個策略替代,比如你可以使用下面的命令來指定容器只監聽Apache埠:
# docker run --security-opt label:type:svirt_apache_t -i -t centos bash

注意:此時,你的主機環境中必須存在一個名為svirt_apache_t的安全策略。

Runtime constraints on CPU and memory

下面的參數可以用來調整容器內的性能。
-m="": Memory limit (format: <number><optional unit>, where unit = b, k, m or g)
-c=0 : CPU shares (relative weight)

通過docker run -m可以調整容器所使用的內存資源。如果主機支持swap內存,那麼可以使用-m可以設定比主機物理內存還大的值。

同樣,通過-c可以調整容器的CPU優先順序。默認情況下,所有的容器擁有相同的CPU優先順序和CPU調度周期,但你可以通過Docker來通知內核給予某個或某幾個容器更多的CPU計算周期。

比如,我們使用-c或者--cpu-shares =0啟動了C0、C1、C2三個容器,使用-c/--cpu-shares=512啟動了C3容器。這時,C0、C1、C2可以100%的使用CPU資源(1024),但C3隻能使用50%的CPU資源(512)。如果這個主機的操作系統是時序調度類型的,每個CPU時間片是100微秒,那麼C0、C1、C2將完全使用掉這100微秒,而C3隻能使用50微秒。

Runtime privilege, Linux capabilities, and LXC configuration
--cap-add: Add Linux capabilities
--cap-drop: Drop Linux capabilities
--privileged=false: Give extended privileges to this container
--device=[]: Allows you to run devices inside the container without the --privileged flag.
--lxc-conf=[]: (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"

默認情況下,Docker的容器是沒有特權的,例如不能在容器中再啟動一個容器。這是因為默認情況下容器是不能訪問任何其它設備的。但是通過"privileged",容器就擁有了訪問任何其它設備的許可權。

當操作者執行docker run --privileged時,Docker將擁有訪問主機所有設備的許可權,同時Docker也會在apparmor或者selinux做一些設置,使容器可以容易的訪問那些運行在容器外部的設備。你可以訪問Docker博客來獲取更多關於--privileged的用法。

同時,你也可以限制容器只能訪問一些指定的設備。下面的命令將允許容器只訪問一些特定設備:
$ sudo docker run --device=/dev/snd:/dev/snd ...

默認情況下,容器擁有對設備的讀、寫、創建設備文件的許可權。使用:rwm來配合--device,你可以控制這些許可權。
$ sudo docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc

Command (m for help): q
$ sudo docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc
You will not be able to write the partition table.

Command (m for help): q

$ sudo docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk /dev/xvdc
crash....

$ sudo docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc
fdisk: unable to open /dev/xvdc: Operation not permitted

使用--cap-add和--cap-drop,配合--privileged,你可以更細致的控制人哦怒氣。默認使用這兩個參數的情況下,容器擁有一系列的內核修改許可權,這兩個參數都支持all值,如果你想讓某個容器擁有除了MKNOD之外的所有內核許可權,那麼可以執行下面的命令:
$ sudo docker run --cap-add=ALL --cap-drop=MKNOD ...

如果需要修改網路介面數據,那麼就建議使用--cap-add=NET_ADMIN,而不是使用--privileged。
$ docker run -t -i --rm ubuntu:14.04 ip link add mmy0 type mmy
RTNETLINK answers: Operation not permitted
$ docker run -t -i --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add mmy0 type mmy

如果要掛載一個FUSE文件系統,那麼就需要--cap-add和--device了。
$ docker run --rm -it --cap-add SYS_ADMIN sshfs sshfs [email protected]:/home/sven /mnt
fuse: failed to open /dev/fuse: Operation not permitted
$ docker run --rm -it --device /dev/fuse sshfs sshfs [email protected]:/home/sven /mnt
fusermount: mount failed: Operation not permitted
$ docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs
# sshfs [email protected]:/home/sven /mnt
The authenticity of host '10.10.10.20 (10.10.10.20)' can't be established.
ECDSA key fingerprint is 25:34:85:75:25:b0:17:46:05:19:04:93:b5:dd:5f:c6.
Are you sure you want to continue connecting (yes/no)? yes
[email protected]'s password:
root@30aa0cfaf1b5:/# ls -la /mnt/src/docker
total 1516
drwxrwxr-x 1 1000 1000 4096 Dec 4 06:08 .
drwxrwxr-x 1 1000 1000 4096 Dec 4 11:46 ..
-rw-rw-r-- 1 1000 1000 16 Oct 8 00:09 .dockerignore
-rwxrwxr-x 1 1000 1000 464 Oct 8 00:09 .drone.yml
drwxrwxr-x 1 1000 1000 4096 Dec 4 06:11 .git
-rw-rw-r-- 1 1000 1000 461 Dec 4 06:08 .gitignore

如果Docker守護進程在啟動時選擇了lxc lxc-driver(docker -d --exec-driver=lxc),那麼就可以使用--lxc-conf來設定LXC參數。但需要注意的是,未來主機上的Docker deamon有可能不會使用LXC,所以這些參數有可能會包含一些沒有實現的配置功能。這意味著,用戶在操作這些參數時必須要十分熟悉LXC。

特別注意:當你使用--lxc-conf修改容器參數後,Docker deamon將不再管理這些參數,那麼用戶必須自行進行管理。比如說,你使用--lxc-conf修改了容器的IP地址,那麼在/etc/hosts裡面是不會自動體現的,需要你自行維護。

Overriding Dockerfile image defaults

當開發者使用Dockerfile進行build或者使用commit提交容器時,開發人員可以設定一些鏡像默認參數。

㈡ docker拉取鏡像失敗,提示埠錯誤

具體報錯信息是什麼?
估計是網路不通吧,或者你沒有許可權訪問該docker鏡像倉庫,有些docker鏡像倉庫是需要登陸後才能拉取鏡像的。

㈢ docker路由器第三項一直轉圈

原因可能是:
1、你要看一下你的網線是不是好的,有時候網線用久了以後,水晶頭可能會被氧化,導致你的電腦網路看上去是通的,但是實際上是沒有通的。這時候你只需要重新把你網路的水晶頭換掉即可。當然也有可能是你的網線那裡斷了,這時你就需要重新換條網線。
2、然後你可以將你的路由器的電源切斷5分鍾左右,因為有時候你的路由器一直處於開啟的狀態,儲存的數據過多,導致路由器反應不過來,這時只要我們將路由器電源切斷硬重啟,清楚緩存的數據。
3、再接下來就是打開電腦的殺毒軟體,進行病毒和木馬的查殺,因為我們在上網的過程中,難免會重病毒和木馬。我們只需要開啟我們電腦中殺毒軟體進行查殺,查殺完病毒和木馬之後重啟電腦,看能不能解決問題。

㈣ 使用docker-compose-cli.yaml啟動網路出錯,找不到路徑

根據你報錯截圖,應該是掛載卷路徑和服務啟動指定路徑不一致,請檢查docker-compose-cli.yaml文件,如果方便可以把此文件提出來,根據你實際的配置進行明確回答。

㈤ docker容器里網路請求慢怎麼解決

docker網路里的速度取決於你的網路模式和dns配置,具體看下面的博客介紹
docker容器內網路請求緩慢問題解決:
https://www.embbnux.com/2016/10/06/docker-container-network-too-slow-timeout/

㈥ docker與宿主通信突然斷了

docker網卡地址沖突。
docker網路模式默認使用的bridge模式,當創建容器時,每個容器會有它自己的虛擬網路介面連接到橋接網路docker0,並獲取一個ip。可以通過ifconfig查看docker0的信息,使用route -n命令可以看到。 docker網段,佔用了172.17.0.0網段。

㈦ docker添加靜態路由 不通

1.通過查看,很明顯的可以看出172.17路由出現了路由黑洞。原因是在默認情況下,靜態路由優先於默認路由。
2.解決這個問題,可以有很多方法,例如刪除docker的介面,或者關閉介面,或者把docker的地址改成其他私網地址。但是這些方法都比較麻煩,有可能影響用戶的使用,並且docker已經在使用了。
我認為比較簡單的就是加一條明細的靜態路由,這個方法更加快捷,方便,安全。
三.解決方法,增加靜態路由,並且永久添加,防止伺服器重啟或者重置網路之後路由丟失。

㈧ 這是網路不通,不讓拉docker鏡像嗎

這是docker服務沒有啟動導致的。提示已經很清楚了the docker daemon is not running.
你執行docker ps之類的命令時是需要保持docker服務在後台運行的,這個跟其它Linux命令不一樣。

㈨ docker網路問題 怎麼解決

網路基礎 Docker 現有的網路模型主要是通過使用 Network namespace、Linux Bridge、iptables、veth pair 等技術實現的。(出處8) Network namespace:它主要提供了網路資源的隔離,包括網路設備、IPv4/IPv6 協議棧、IP 路由表、防火牆、/proc/net 目錄、/sys/class/net 目錄、埠(socket)等。 Linux Bridge:功能相當於物理交換機,為連在其上的設備(容器)轉發數據幀,如 docker0 網橋。 Iptables:主要為容器提供 NAT 以及容器網路安全。 veth pair:兩個虛擬網卡組成的數據通道。在 Docker 中,用於連接 Docker 容器和 Linux Bridge。一端在容器中作為 eth0 網卡,另一端在 Linux Bridge 中作為網橋的一個埠。 容器的網路模式 用來設置網路介面的 docker run --net 命令,它的可用參數有四個: none:關閉了 container 內的網路連接。容器有獨立的 Network namespace,但並沒有對其進行任何網路設置,如分配 veth pair 和網橋連接,配置 IP 等。 bridge:通過 veth 介面來連接其他 container。這是 docker 的默認選項。 host:允許 container 使用 host 的網路堆棧信息。容器和宿主機共享 Network namespace。 container:使用另外一個 container 的網路堆棧信息。kubernetes 中的 pod 就是多個容器共享一個 Network namespace。 我們需要從中選一個作為我們的網路方案,實際上只有 bridge 和 host 兩種模式可選。(想了解這四個參數,請翻到附錄B之 Network settings。) 在 docker 默認的網路環境下,單台主機上的容器可以通過 docker0 網橋直接通信,如下圖(圖作者馮明振)所示:

㈩ centos7啟動docker服務後,xshell就會斷開連接

我用的也是centos7,網路連接模式是NAT,最開始沒有修改ifcfg-ensXX文件,
聯網、ssh連接都正常。安裝docker,啟動後就出現xshell連接不了,發現命令窗口無法telnet通22埠,
網上查看資料,有網友說這種情況是因為設定的是動態ip(沒有修改ifcfg-ens文件,NAT模式下,ip是動態的)就有可能出現xshell無法連接的狀況,
我嘗試把ip設置為靜態後,發現確實好用!

閱讀全文

與docker導致網路異常相關的資料

熱點內容
網路共享中心沒有網卡 瀏覽:527
電腦無法檢測到網路代理 瀏覽:1377
筆記本電腦一天會用多少流量 瀏覽:598
蘋果電腦整機轉移新機 瀏覽:1381
突然無法連接工作網路 瀏覽:1081
聯通網路怎麼設置才好 瀏覽:1230
小區網路電腦怎麼連接路由器 瀏覽:1058
p1108列印機網路共享 瀏覽:1215
怎麼調節台式電腦護眼 瀏覽:721
深圳天虹蘋果電腦 瀏覽:956
網路總是異常斷開 瀏覽:618
中級配置台式電腦 瀏覽:1017
中國網路安全的戰士 瀏覽:638
同志網站在哪裡 瀏覽:1422
版觀看完整完結免費手機在線 瀏覽:1464
怎樣切換默認數據網路設置 瀏覽:1114
肯德基無線網無法訪問網路 瀏覽:1290
光纖貓怎麼連接不上網路 瀏覽:1500
神武3手游網路連接 瀏覽:969
局網列印機網路共享 瀏覽:1005