容器和 VM(虛擬機)的主要區別是,容器提供了基於進程的隔離,而虛擬機提供了資源的完全隔離。虛擬機可能需要一分鍾來啟動,而容器只需要一秒鍾或更短。容器使用宿主操作系統的內核,而虛擬機使用獨立的內核。
Docker 的局限性之一是,它只能用在 64 位的操作系統上。
docker 是一個linux 上的LXC 容器項目,是很輕量級的虛擬化技術。
docker雖然基於lxc技術(cgroup、namespace等),但是思路完全和lxc不一樣。
lxc看起來更像是一個虛擬機,多用於操作系統級別的虛擬化,背后的哲學是 IAAS;
而docker看起來是一個程序,跑在沙箱里的程序,屬於應用程序級別的虛擬化,背后的哲學是 PAAS。
RHEL 6.5 開始提供docker 支持,我們使用 CentOS 6.6 x64 進行實驗。
阿里巴巴價值
商業
傳統
當下
阿里巴巴這樣的電商帶來的最大價值在於降低了商品的社會交易成本
docker價值
現在我們把商業發展的邏輯搬到軟件交付這里。傳統的軟件交付面臨同傳統商業類似的問題:
傳統
軟件開發者和軟件使用者雙方信息不對稱。盡管開發者對軟件的代碼編譯、參數配置、運行環境等信息了如指掌,但使用者卻很可能一知半解。因此,我們會經常看到使用者抱怨,明明按照用戶手冊一步步操作,卻仍然跑不起來。這種情況也時常出現在軟件流程中,開發將程序和文檔交付給測試或運維,測試或運維卻總是無法重現期望的運行狀態,幾經輾轉發現是機器環境 、系統環境、軟件依賴版本、參數配置等等原因導致。這樣低效的軟件流程將使持續集成與持續交付很難真正實施起來,僅僅流於形式。
當下
Docker之所以如此受人矚目,並不是因為它創造了多么神奇的技術,而是因為它重新定義了軟件的交付方式,進而將改變傳統“開發-測試-部署”的軟件流程。尤其是在雲計算和開源軟件大行其道的今天,Docker的出現正好順應了時代的發展,占盡了天時地利人和。
Docker的出現則將軟件從開發方到使用方的交付過程變得集中化、標准化、透明化:
集中化:軟件使用者可以從Docker倉庫找到琳琅滿目的軟件鏡像,一個鏡像包含商業軟件或開源軟件,也可以包含單個軟件或任意的軟件組合。
標准化:Docker鏡像的“構建-發布-存儲-下載-運行”是標准化的,統一通過Docker工具來執行,而且所有操作都可以移植到任意的機器或平台。
透明化:Docker鏡像是自包含的,包括程序、軟件依賴、參數配置等所有運行環境,使用者無需了解細節,只需運行同樣的Docker命令就能達到與開發者同樣的運行狀態。
綜上所述,可以說Docker帶來的最大價值在於降低了軟件的交付成本。
在生產環境中存在的問題
Docker的發展勢頭一天比一天強勁,它顯然在試圖解決實際的問題。然而,對如今許多的生產環境用戶來說,沒有出現優點壓倒缺點的局面。在開發、測試和持續性集成等環境下,Docker在讓容器吸引廣大開發人員方面確實有上佳的表現,不過它還沒有顛覆生產環境。
從2013年起,負責Docker開源項目的商業公司Docker, Inc.,開始主導容器虛擬化的市場。最近,包括擁有LXD技術的Canonical以及擁有Rocket技術的CoreOS等其他供應商,也開始進入容器市場。
[root@kvm2 ~]# yum install docker
Dependencies Resolved
=============================================================================================================================================================================================================================================
Package Arch Version Repository Size
=============================================================================================================================================================================================================================================
Installing:
docker x86_64 1.9.1-40.el7.centos extras 7.8 M
Installing for dependencies:
docker-common x86_64 1.9.1-40.el7.centos extras 55 k
docker-forward-journald x86_64 1.9.1-40.el7.centos extras 827 k
docker-selinux x86_64 1.9.1-40.el7.centos extras 73 k
Transaction Summary
=============================================================================================================================================================================================================================================
Install 1 Package (+3 Dependent packages)
[root@kvm2 ~]# systemctl status docker -l
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2016-06-12 11:01:52 CST; 10s ago
Docs: http://docs.docker.com
Main PID: 5881 (sh)
CGroup: /system.slice/docker.service
├─5881 /bin/sh -c /usr/bin/docker-current daemon $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY 2>&1 | /usr/bin/forward-journald -tag docker
├─5882 /usr/bin/docker-current daemon --selinux-enabled
└─5883 /usr/bin/forward-journald -tag docker
Jun 12 11:01:51 kvm2.zf.com forward-journal[5883]: time="2016-06-12T11:01:51.866493994+08:00" level=warning msg="Docker could not enable SELinux on the host system"
Jun 12 11:01:51 kvm2.zf.com forward-journal[5883]: time="2016-06-12T11:01:51.891206059+08:00" level=info msg="Firewalld running: false"
Jun 12 11:01:52 kvm2.zf.com forward-journal[5883]: time="2016-06-12T11:01:52.010246032+08:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
Jun 12 11:01:52 kvm2.zf.com forward-journal[5883]: time="2016-06-12T11:01:52.847400089+08:00" level=info msg="Loading containers: start."
Jun 12 11:01:52 kvm2.zf.com forward-journal[5883]:
Jun 12 11:01:52 kvm2.zf.com forward-journal[5883]: time="2016-06-12T11:01:52.847530886+08:00" level=info msg="Loading containers: done."
Jun 12 11:01:52 kvm2.zf.com forward-journal[5883]: time="2016-06-12T11:01:52.847625100+08:00" level=info msg="Daemon has completed initialization"
Jun 12 11:01:52 kvm2.zf.com forward-journal[5883]: time="2016-06-12T11:01:52.847640536+08:00" level=info msg="Docker daemon" commit="ab77bde/1.9.1" execdriver=native-0.2 graphdriver=devicemapper version=1.9.1
Jun 12 11:01:52 kvm2.zf.com forward-journal[5883]: time="2016-06-12T11:01:52.856632634+08:00" level=info msg="API listen on /var/run/docker.sock"
Jun 12 11:01:52 kvm2.zf.com systemd[1]: Started Docker Application Container Engine.
[root@kvm2 ~]# docker version
Client:
Version: 1.9.1
API version: 1.21
Package version: docker-common-1.9.1-40.el7.centos.x86_64
Go version: go1.4.2
Git commit: ab77bde/1.9.1
Built:
OS/Arch: linux/amd64
Server:
Version: 1.9.1
API version: 1.21
Package version: docker-common-1.9.1-40.el7.centos.x86_64
Go version: go1.4.2
Git commit: ab77bde/1.9.1
Built:
OS/Arch: linux/amd64
搜索鏡像
man docker search
Search Docker Hub for images that match the specified TERM.
https://hub.docker.com/
下載鏡像
man docker pull
pulls down an image or a repository from a registry.
docker pull registry.hub.docker.com/fedora:20
If you do not specify a REGISTRY_HOST, the command uses Docker's public registry located at registry-1.docker.io by default.
docker pull centos
默認下載庫名為centos,tag為latest的鏡像,否則就指定registry/repository:tag
查看鏡像
To list the images in a local repository (not the registry) run:
docker images
This command lists the images stored in the local Docker repository.
The title REPOSITORY for the first title may seem confusing. It is essentially the image name
運行鏡像
man docker run
docker-run - Run a command in a new container
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
查看容器
man docker ps
加入--no-trunc=true這個選項就不會截斷描述列了。
[root@kvm2 ~]# docker history --no-trunc=true d6d IMAGE CREATED CREATED BY SIZE COMMENT d6d9ec2e67f1389197bf61eb8c07ba782dbe480bae1ea775dd1992ee5f632e4b 4 weeks ago /bin/sh -c #(nop) CMD ["supervisord" "-n"] 0 B f818b50199268782cbac6930cda936d3ef4c390f95acd4b8fe2c07cf1fa33ff4 4 weeks ago /bin/sh -c #(nop) EXPOSE 22/tcp 443/tcp 80/tcp 0 B afa600610768c5815a1cb7ad539f58a8d9e218246e31bde380be46636f1d9a9d 4 weeks ago /bin/sh -c #(nop) ADD file:c987af8588740fdd52d1bfbb399323e51fb87f254fce88dc541312d3170307a1 in /etc/ 1.414 kB 1aa4911f40c7d92d33da1ad1431c32a04be94509084ba2bfca5e7efe0b52a091 4 weeks ago /bin/sh -c #(nop) ADD file:77dbd518f0925a02442836e97b8840c54a3e7c1658bf60dac904ee540127c08e in /var/www/html/ 22 B ee207207752fe93d37e59a6a6f583a2996e28ffd057bb40470ca853826c8978a 4 weeks ago /bin/sh -c mkdir -p /root/.ssh && touch /root/.ssh/authorized_keys && chmod 700 /root/.ssh 0 B b03bf16299774b8a0272ecc53d97041d40ba2dc8ac11dc82f9acaf509058afe1 4 weeks ago /bin/sh -c sed -ri 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config && echo 'root:changeme' | chpasswd 5.044 kB 3f97351ce7a954e2a7474d7942a0151723bdc6f0eee450e9ca1c5e3d75854632 4 weeks ago /bin/sh -c ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key && ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key 3.353 kB 341fee58aa0f9fbac5552729659d342d8476e57f2ea03813ba8397e3231c1ce1 4 weeks ago /bin/sh -c yum install -y openssh-server openssh-clients passwd 17.02 MB 4121ea2cc40134f7a06e050977e3ac9f9915076dae488a54f97d1875b6fd1a2e 4 weeks ago /bin/sh -c pip install supervisor 2.707 MB 724c96ad712b19ea281f55b49a6b2dc2cce151babe0e5b595289a6b7cd3ea677 4 weeks ago /bin/sh -c yum install -y python-pip && pip install "pip>=1.4,<1.5" --upgrade 18.18 MB 306cfb3b53df0671704091ed4a3620d08d30cf11bcc8736d474e48443b893cdc 4 weeks ago /bin/sh -c yum install -y php php-mysql php-devel php-gd php-pecl-memcache php-pspell php-snmp php-xmlrpc php-xml 50.27 MB 5c0d565c6fa254516c514a8ad5ec2f370351e516e8fb8f0d33ad7085e583970e 4 weeks ago /bin/sh -c service mysqld start 21.84 MB 4fd77ea1aba2a4dcdfcbffd61a79c50e6b528663213aa6454d3fef80dcd7d82c 4 weeks ago /bin/sh -c echo "NETWORKING=yes" > /etc/sysconfig/network 15 B 205a003e4718da4ddfba7b9595a89274ba3a0c0bd6833e9123d7b80c1c5bbb48 4 weeks ago /bin/sh -c yum install -y mysql mysql-server 47.11 MB 5f5b0aafb036866c5b87fe5c5777698f19f734bdc1520d50cafadfc7d1ecf655 4 weeks ago /bin/sh -c yum -y install httpd vim-enhanced bash-completion unzip 168.3 MB b10e99758b954c268ac3fe6a9b28e148604222155f3d693f8c297583d027c25e 4 weeks ago /bin/sh -c rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 10.34 MB 4a98883d437e364a6d103abdebfcb88c026af9c09aa43e8cb83c2e6b1a2e746a 4 weeks ago /bin/sh -c #(nop) MAINTAINER Nicholas Istre <nicholas.istre@e-hps.com> 0 B d65a92bab695a23057d02823b5d718822faaa413641f719764dc82bd47e6ea61 8 months ago /bin/sh -c #(nop) ADD file:9ff85de7a936502e83fadeed82d6f11231ce7e842eea23d73f6f5fb7182f1111 in / 202.6 MB 3690474eb5b4b26fdfbd89c6e159e8cc376ca76ef48032a30fa6aafd56337880 14 months ago /bin/sh -c #(nop) MAINTAINER The CentOS Project <cloud-ops@centos.org> - ami_creator 0 B
[root@kvm2 ~]# docker search --no-trunc=true centos
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/centos The official build of CentOS. 2323 [OK]
docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.7 x86_64 / CentOS-7 7.2.1511 x86_64 - SCL/EPEL/IUS Repos / Supervisor / OpenSSH. 25 [OK]
docker.io docker.io/jdeathe/centos-ssh-apache-php CentOS-6 6.7 x86_64 / Apache / PHP / PHP Memcached / PHP APC. 17 [OK]
docker.io docker.io/nimmis/java-centos This is docker images of CentOS 7 with different versions of java 12 [OK]
docker.io docker.io/million12/centos-supervisor Base CentOS-7 with supervisord launcher, highly extensible. 11 [OK]
docker.io docker.io/consol/centos-xfce-vnc Centos container with "headless" VNC session and preinstalled Firefox and Chrome browser 9 [OK]
docker.io docker.io/torusware/speedus-centos Always updated official CentOS docker image with Torusware Speedus acceleration software 8 [OK]
docker.io docker.io/nickistre/centos-lamp LAMP on centos setup 4 [OK]
docker.io docker.io/centos/mariadb55-centos7 3 [OK]
docker.io docker.io/nathonfowlie/centos-jre Latest CentOS image with the JRE pre-installed. 3 [OK]
docker.io docker.io/consol/sakuli-centos-xfce Sakuli end-2-end testing and monitoring container based on CentOS and Xfce4. 2 [OK]
docker.io docker.io/blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK]
docker.io docker.io/darksheer/centos Base Centos Image -- Updated hourly 1 [OK]
docker.io docker.io/lighthopper/orientdb-centos A Dockerfile for creating an OrientDB image on top of the official CentOS distribution. 1 [OK]
docker.io docker.io/timhughes/centos Centos with systemd installed and running 1 [OK]
docker.io docker.io/yajo/centos-epel CentOS with EPEL and fully updated 1 [OK]
docker.io docker.io/ericuni/centos centos dev 0 [OK]
docker.io docker.io/grayzone/centos auto build for centos. 0 [OK]
docker.io docker.io/grossws/centos CentOS 6 and 7 base images with gosu and locales 0 [OK]
docker.io docker.io/januswel/centos yum update-ed CentOS image 0 [OK]
docker.io docker.io/jsmigel/centos-epel Docker base image of CentOS w/ EPEL installed 0 [OK]
docker.io docker.io/kz8s/centos Official CentOS plus epel-release 0 [OK]
docker.io docker.io/labengine/centos Centos image base 0 [OK]
docker.io docker.io/repositoryjp/centos Docker Image for CentOS. 0 [OK]
docker.io docker.io/ustclug/centos USTC centos
上面需要的東西后,就可以用下面的命令開始下載了。
鏡像都是按照用戶名/鏡像名的方式來存儲的。有一組比較特殊的鏡像,比如ubuntu這類基礎鏡像,經過官方的驗證,值得信任,可以直接用鏡像名來檢索到。
[root@kvm1 tmp]# docker pull centos/mariadb55-centos7
Using default tag: latest
Trying to pull repository docker.io/centos/mariadb55-centos7 ... latest: Pulling from centos/mariadb55-centos7
1544084fad81: Pull complete
ddca430e683e: Downloading [=============> ] 19.44 MB/70.54 MB
bb35b9816560: Download complete
ddca430e683e: Pull complete
bb35b9816560: Pull complete
000ef0017d51: Pull complete
02b68f50c545: Pull complete
699ae6f1afb0: Pull complete
bb36ed4c0771: Pull complete
509e402b8043: Pull complete
5510bcbd751b: Pull complete
c65b7f76a8c0: Pull complete
d5bf20ab0e00: Pull complete
4e6bcf53b594: Pull complete
d480ffa2a79e: Pull complete
1cca63c752fe: Pull complete
b8476e51b045: Pull complete
b9232fb50895: Pull complete
56aa3ea11826: Pull complete
18fe7a620d97: Pull complete
Digest: sha256:96bf01600a6b0c43eebd435eb863468a42816cb3a08d747d79e3e5d4dfd69df5
Status: Downloaded newer image for docker.io/centos/mariadb55-centos7:latest
[root@kvm1 tmp]#
[root@kvm2 docker]# docker pull httpd
Using default tag: latest
Trying to pull repository docker.io/library/httpd ... latest: Pulling from library/httpd
23286f48d129: Pull complete
cbee5247e891: Pull complete
b88cfb2ab04b: Pull complete
f6f65ab94dc8: Pull complete
622e17bfb07d: Pull complete
c400bf2459b2: Pull complete
8c87d07c0fd8: Pull complete
b02f86f012c3: Pull complete
fade6d358f5e: Pull complete
2882c5b19e6a: Pull complete
9fce1c51710f: Pull complete
6ff460a5471f: Pull complete
6bce6ad2c6a9: Pull complete
Digest: sha256:c89a26acb0edf2f5ef196db39837f3fc2a323ba149f966f7dbb0f0ad659cb4e1
Status: Downloaded newer image for docker.io/httpd:latest
[root@kvm2 ~]# docker run -it httpd bash
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
root@e392fae6a6bd:/usr/local/apache2#
docker run的命令參數,映射容器端口80到主機端口8076,這樣以后就可以用瀏覽器訪問宿主機的ip+8076
[root@kvm2 ff]# docker run -p 8076:80 -d -it httpd
27df118645f56d32cef13021150e484bb0737ce12c388414286e621035acb760
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
To mount a host directory(/var/db) as a container volume(/data1)
docker run -v /var/db:/data1 -it httpd bash
鏡像只有一個,但是容器有n個,每次啟動都會生成一個不同的。
[root@kvm2 ff]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc8d8dce5ad9 httpd "bash" 2 minutes ago Exited (0) About a minute ago clever_sammet
27df118645f5 httpd "httpd-foreground" 14 minutes ago Up 14 minutes 0.0.0.0:8076->80/tcp thirsty_jang
6208f9ef6253 httpd "httpd-foreground" 21 minutes ago Exited (0) 16 minutes ago distracted_varahamihira
48987af82c5a httpd "bash" 24 minutes ago Exited (0) 23 minutes ago reverent_hawking
58769180232c httpd "bash" 24 minutes ago Exited (0) 24 minutes ago cocky_shaw
de3a82a9fddd httpd "httpd-foreground" 38 minutes ago Up 26 minutes 80/tcp condescending_wilson
32101274af20 httpd "bash" 40 minutes ago Exited (127) 39 minutes ago focused_khorana
788c6fa29a70 httpd "/usr/sbin/sshd -D" 40 minutes ago Created compassionate_meitner
e392fae6a6bd httpd "bash" 50 minutes ago Exited (0) 41 minutes ago nostalgic_nobel
110dca752a67 httpd "httpd-foreground" 50 minutes ago Exited (0) 50 minutes ago compassionate_mestorf
7dc69d4edbcc httpd "httpd-foreground" About an hour ago Exited (0) 58 minutes ago gloomy_jang
9cdb405e0e0b httpd "httpd-foreground" About an hour ago Exited (0) About an hour ago adoring_fermi
[root@kvm2 ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dc69d4edbcc httpd "httpd-foreground" 12 minutes ago Exited (0) 11 minutes ago gloomy_jang
[root@kvm2 ~]# docker start 7dc69d4edbcc
7dc69d4edbcc
[root@kvm2 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d3eae263c005 d6d9ec2e67f1 "supervisord -n" 17 hours ago Up 3 seconds 22/tcp, 443/tcp, 0.0.0.0:8075->80/tcp backstabbing_booth [root@kvm2 ~]# docker exec d3e ls /var/www/html phpinfo.php [root@kvm2 ~]# cat co.php <?php echo "今天是 " . date("Y/m/d") . "<br>"; echo "今天是 " . date("Y.m.d") . "<br>"; echo "今天是 " . date("Y-m-d") . "<br>"; echo "今天是 " . date("l"); ?> [root@kvm2 ~]# docker cp co.php d3eae263c005cb34c74b4bceb834eb1e08a341a8c56d3563e026400ac0eb3764:/var/www/html/ [root@kvm2 ~]# docker exec d3e ls /var/www/html co.php phpinfo.php 只要復制進去,即刻生效,即使docker stop d3e,然后再docker start d3e也還是生效的 然后瀏覽器訪問下面的地址返回是正常的。 http://192.168.1.22:8075/co.php 提交的作用是以剛才修改后的容器為藍本,重新生成一個本地鏡像 [root@kvm2 ~]# docker commit d3eae263c005cb34c74b4bceb834eb1e08a341a8c56d3563e026400ac0eb3764 lamp c11ac41e64b6bdc85edac4ce57d786d3622d7d75b5d36651a7c0120d8ced3e54 [root@kvm2 ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE lamp latest c11ac41e64b6 7 seconds ago 554.1 MB nickistre/centos-lamp latest 4f5630df2cde 22 minutes ago 554.1 MB <none> <none> 241befbcd605 26 minutes ago 554.1 MB <none> <none> 915e007c5e90 17 hours ago 554.1 MB docker.io/httpd latest 6bce6ad2c6a9 8 days ago 198.5 MB docker.io/nickistre/centos-lamp latest d6d9ec2e67f1 4 weeks ago 538.4 MB <none> <none> 39843ad887c7 14 months ago 0 B 1091 docker run -d -p 8654:80 lamp 1092 docker ps 1093 docker port 0bc 1094 docker exec 0bc ls /var/www/html [root@kvm2 ~]# docker run -it lamp bash Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning. [root@60b5f3dd1074 /]# passwd Changing password for user root. New password: BAD PASSWORD: it is based on a dictionary word BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully. [root@60b5f3dd1074 /]# exit exit
[root@kvm2 ~]# docker run httpd
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
[Wed Jun 15 08:22:23.630259 2016] [mpm_event:notice] [pid 1:tid 140015674001280] AH00489: Apache/2.4.20 (Unix) configured -- resuming normal operations
[Wed Jun 15 08:22:23.630341 2016] [core:notice] [pid 1:tid 140015674001280] AH00094: Command line: 'httpd -D FOREGROUND'
運行一次run,就會生成一個新的容器,然后就可以對這個容器進行start,stop等操作
[root@kvm2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
588dd2b3b8a1 httpd "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp fervent_brown
63deabe2d1a8 httpd "httpd-foreground" 7 minutes ago Up 2 minutes 80/tcp angry_bohr