Docker運行以太坊公有鏈
1. 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提交容器時,開發人員可以設定一些鏡像默認參數。
2. docker啟動容器後如何更新參數
如果只是restart參數可以用docker container update 命令實現。
掛載目錄是無法動態修改的,正常的做法是把持久化數據映射出來,然後把原來的容器刪除再重新跑一個容器,數據不會丟失,k8s/mesos之類的編排工具的邏輯也是這樣的,不針對容器本身做修改。
如果非要改,我記得是把docker服務停掉,然後修改docker主目錄下容器的配置文件,譬如/var/lib/docker/container/容器id/config.v2.json和hostconfig.json , 然後啟動docker和容器。因為操作涉及停服務,所以還不如重新跑一個容器。
3. docker進入container之後能運行什麼命令
操作命令如下: Docker會在隔離的容器中運行進程。當運行docker run命令時,Docker會啟動一個進程,並為這個進程分配其獨占的文件系統、網路資源和以此進程為根進程的進程組。在容器啟動時,
4. 如何在 docker 容器之間設置網路
在使用weave之前,你需要在所有宿主機上安裝Docker環境,參考這些教程,在Ubuntu或CentOS/Fedora發行版中安裝Docker。Docker環境部署完成後,使用下面的命令安裝weave:$wget/zettio/weave/releases/download/latest_release/weave$chmoda+xweave$sudocpweave/usr/local/bin注意你的PATH環境變數要包含/usr/local/bin這個路徑,請在/etc/profile文件中加入一行(LCTT譯註:要使環境變數生效,你需要執行這個命令:source/etc/profile):exportPATH="$PATH:/usr/local/bin"在每台宿主機上重復上面的操作。Weave在TCP和UDP上都使用6783埠,如果你的系統開啟了防火牆,請確保這兩個埠不會被防火牆擋住。在每台宿主機上啟動Weave路由器當你想要讓處於在不同宿主機上的容器能夠互相通信,第一步要做的就是在每台宿主機上啟動weave路由器。第一台宿主機,運行下面的命令,就會創建並開啟一個weave路由器容器(LCTT譯註:前面說過了,weave路由器也是一個容器):$sudoweavelaunch第一次運行這個命令的時候,它會下載一個weave鏡像,這會花一些時間。下載完成後就會自動運行這個鏡像。成功啟動後,終端會輸出這個weave路由器的ID號。下面的命令用於查看路由器狀態:$sudoweavestatus第一個weave路由器就緒了,目前為止整個peer對等網路中只有一個peer成員。你也可以使用docker的命令來查看weave路由器的狀態:$dockerps第二台宿主機部署步驟稍微有點不同,我們需要為這台宿主機的weave路由器指定第一台宿主機的IP地址,命令如下:$sudoweavelaunch當你查看路由器狀態,你會看到兩個peer成員:當前宿主機和第一個宿主機。當你開啟路由器,這個peer成員列表會更長。當你新開一個路由器時,要指定前一個宿主機的IP地址,請注意不是第一個宿主機的IP地址(LCTT譯註:鏈狀結構)。現在你已經有了一個weave網路了,它由位於不同宿主機的weave路由器組成。把不同宿主機上的容器互聯起來接下來要做的就是在不同宿主機上開啟Docker容器,並使用虛擬網路將它們互聯起來。假設我們創建一個私有網路10.0.0.0/24來互聯Docker容器,並為這些容器隨機分配IP地址。如果你想新建一個能加入weave網路的容器,你就需要使用weave命令來創建,而不是docker命令。原因是weave命令內部會調用docker命令來新建容器然後為它設置網路。下面的命令是在宿主機hostA上建立一個Ubuntu容器,然後將它放到10.0.0.0/24網路中,分配的IP地址為10.0.0.1:hostA:~$sudoweaverun10.0.0.1/24-t-iubuntu成功運行後,終端會顯示出容器的ID號。你可以使用這個ID來訪問這個容器:hostA:~$dockerattach在宿主機hostB上,也創建一個Ubuntu容器,IP地址為10.0.0.2:hostB:~$sudoweaverun10.0.0.2/24-t-iubuntu訪問下這個容器的控制台:hostB:~$dockerattach這兩個容器能夠互相ping通,你可以通過容器的控制台檢查一下。如果你檢查一下每個容器的網路配置,你會發現有一塊名為「ethwe」的網卡,你分配給容器的IP地址出現在它們那裡(比如這里分別是10.0.0.1和10.0.0.2)。Weave的其他高級用法weave提供了一些非常巧妙的特性,我在這里作下簡單的介紹。應用分離使用weave,你可以創建多個虛擬網路,並為每個網路設置不同的應用。比如你可以為一群容器創建10.0.0.0/24網路,為另一群容器創建10.10.0.0/24網路,weave會自動幫你維護這些網路,並將這兩個網路互相隔離。另外,你可以靈活地將一個容器從一個網路移到另一個網路而不需要重啟容器。舉個例子:首先開啟一個容器,運行在10.0.0.0/24網路上:$sudoweaverun10.0.0.2/24-t-iubuntu然後讓它脫離這個網路:$sudoweavedetach10.0.0.2/24最後將它加入到10.10.0.0/24網路中:$sudoweaveattach10.10.0.2/24現在這個容器可以與10.10.0.0/24網路上的其它容器進行通信了。這在當你創建一個容器而網路信息還不確定時就很有幫助了。將weave網路與宿主機網路整合起來有時候你想讓虛擬網路中的容器能訪問物理主機的網路。或者相反,宿主機需要訪問容器。為滿足這個功能,weave允許虛擬網路與宿主機網路整合。舉個例子,在宿主機hostA上一個容器運行在10.0.0.0/24中,運行使用下面的命令:hostA:~$sudoweaveexpose10.0.0.100/24這個命令把IP地址10.0.0.100分配給宿主機hostA,這樣一來宿主機hostA也連到了10.0.0.0/24網路上了。顯然,你在為宿主機選擇IP地址的時候,需要選一個沒有被其他容器使用的地址。現在hostA就可以訪問10.0.0.0/24上的所有容器了,不管這些容器是否位於hostA上。好巧妙的設定啊,32個贊
5. docker從容器中怎麼訪問宿主機
例如你的docker環境的虛擬IP是192.168.99.100,那麼宿主機同樣會託管一個和192.168.99.100同網段的虛擬IP,並且會是主IP:192.168.99.1,那麼就簡單了,在容器中訪問192.168.99.1這個地址就等於訪問宿主機。
注意,通過192.168.99.1訪問宿主機,等於換了一個ip,如果資料庫或中間件限制了本機訪問或者做了ip段限制,要記得添加192.168.99.1到白名單。
Docker容器運行的時候有 host 、 bridge 、 none 三種網路可供配置。默認是 bridge ,即橋接網路,以橋接模式連接到宿主機; host 是宿主網路,即與宿主機共用網路; none 則表示無網路,容器將無法聯網。
當容器使用 host 網路時,容器與宿主共用網路,這樣就能在容器中訪問宿主機網路,那麼容器的 localhost 就是宿主機的 localhost 。
(5)Docker運行以太坊公有鏈擴展閱讀
宿主機和容器通信原理的問題:
考慮重啟速度:在實際的運維過程中,部分場景下,會出現主機卡死,或者docker進程卡死, 這時,最快恢復業務的方法是重啟主機。
容器在主機重啟後,可以自動恢復,因此可以做到在1到2分鍾內快速恢復業務。這一點太重要了,物理機重啟由於需要做各種硬體檢測,重啟時間一般在5到10分鍾, 虛擬機重啟一般在1分鍾以內 , 物理機顯然無法滿足需求。
重建能力很重要:
容器平台經常需要更新操作系統,或者根據需要調整主機規格。
運行一段時間後,發現內存配置偏少了, 需要添加內存。這時候申請一台新的機器加入到集群中,將舊機器下線即可。
運行多年的 ubuntu 12.04 官方已經不再維護, 需要全量替換,工作量相當大。好的方法就是使用全新的伺服器替換舊伺服器。
當發生故障,主機無法恢復時, 直接申請新伺服器加入集群即可。
6. 收到一個含有dockerfile的工程文件,要怎樣運行起來
docker build -t了解下
7. 如何在docker容器中運行一個程序
1. 安裝 Docker
在開始前,我們首先得確保在Linux主機中已經安裝了Docker。這里,我運行的是CentOS 7 主機,我們將運行yum管理器和下面的命令來安裝Docker。
# yum install docker
# systemctl restart docker.service
2. 創建 Dockerfile
現在,Docker守護進程已經在運行中了,我們現在准備創建自己的Firefox Docker容器。我們要創建一個Dockerfile,在其中我們要輸入需要的配置來創建一個可以工作的Firefox容器。為了運行 Docker 鏡像我們需要使用最新版本的CentOS。要創建 Docker 鏡像,我們需要用文本編輯器創建一個名為Dockerfile的文件。
# nano Dockerfile
接著,在Dockerfile中添加下面的行並保存。
#!/bin/bashFROM centos:7RUN yum install -y firefox# 用你自己的 uid /gid 替換下面的0RUN export uid=0 gid=0RUN mkdir -p /home/developerRUN echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwdRUN echo "developer:x:${uid}:" >> /etc/groupRUN echo "developer ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoersRUN chmod 0440 /etc/sudoersRUN chown ${uid}:${gid} -R /home/developerUSER developerENV HOME /home/developerCMD /usr/bin/firefox
注意:在第四行的配置中,用你自己的用戶和組id來替換0。 我們可以用下面的命令在shell或者終端中得到uid和gid。
8. docker容器內運行的進程,容器外也運行
鏡像不獨立了,你這個要重新安裝一下,沒有起到隔離作用啊
9. 對於一個已有的docker容器,怎麼添加運行參數
從util-linux版本2.23開始,nsenter工具就包含在其中。它用來訪問另一個進程的名字空間。nsenter要正常工作需要有root許可權。很不幸,Ubuntu 14.4仍然使用的是util-linux版本2.20。安裝最新版本的util-linux(2.24)版,請按照以下步驟: 為了連接到容器,你還需要找到容器的第一個進程的PID。 docker inspect --format "{{ .State.Pid }}" <container-id> 通過這個PID,你就可以連接到這個容器: nsenter --target $PID --mount --uts --ipc --net --pid nsinit 從0.9版本開始,Docker自身就具有一個管理容器的庫,名字為 libcontainer。libcontainer中的nsinit工具允許用戶直接訪問linux名字空間和cgroup內核。在安裝nsinit之前,你首先需要安裝Go運行時環境: apt-get install git golang-go mkdir -p $HOME/go-dev/binmkdir -p $HOME/go-dev/src echo "export GOPATH=\$HOME/go-dev" >> ~/.profileecho "PATH=\$PATH:\$GOPATH/bin" >> ~/.profile source ~/.profile 接下來才安裝nsinit: mkdir -p $GOPATH/src/github.com/dotcloudcd $GOPATH/src/github.com/dotcloud git clone https://github.com/dotcloud/docker.gitcd $GOPATH/src/github.com/dotcloud/docker /usr/bin/go get -v github.com/dotcloud/docker/vendor/src/github.com/docker/libcontainer/nsinit nsinit讀取的是位於/var/lib/docer/execdriver/native/<container-id>容器目錄下的配置數據。要運行nsinit,你需要切換到容器目錄下。由於/var/lib/docker目錄對於root用戶是只讀許可權,因此你還需要root許可權。通過docker的ps命令,你可以確定容器ID。一旦你進入/var/lib/docker目錄,你就可以連接容器了: nsinit exec /bin/bash lxc(-attach) 直到Docker 0.8.1版本為止,LXC一直是管理容器的基本工具,Docker一直支持這個工具。但是從0.9.0版本開始,Docker默認使用libcontainer管理容器,不再依賴LXC了。因此默認情況下,你不能使用lxc-attach了。 如果你仍然希望使用lxc-attach,那麼你需要使用-e lxc選項來重新啟動Docker服務進程。使用這個選項,Docker的內部將再次使用LXC管理容器了。完成這個任務最簡單的做法就是創建/etc/default/docker文件(如果這個文件仍然不存在),並添加以下內容: DOCKER_OPTS=" -e lxc" 現在你可以重新啟動Docker服務了。要連接容器,你需要知道完整的容器ID: docker ps --no-trunc 接下來,你就可以連接這個容器了。要完成下面工作,你還需要root許可權: lxc-attach -n <container-id> -- /bin/bash sshd 上面所有三種方法都要求具有主機系統的root許可權。為了不採用root許可權,通過ssh訪問容器將是一個很好的選擇。 要做到這一點,你需要構建一個支持SSH服務的基礎映像。此時,我們可能遇到這樣的問題:我們是不是用Docker CMD或者ENTRYPOINT運行一條命令就可以了?如果此時有sshd進程運行,那麼我們就不要再運行其他進程了。接下來的工作是創建一個腳本或者使用像supervisord這樣的進程管理工具來啟動其它所有需要啟動的進程。有關如何使用supervisord的 優秀的文檔可以在Docker的web站點上找到。一旦你啟動了具有sshd進程的容器,你就可以像以往一樣通過ssh客戶端了連接這個容器了。