Docker基礎之五: 使用Docker容器
使用Docker容器
(對Docker感興趣的朋友可以加我的微信ghostcloud2016,然後我把你加到我們的一個Docker愛好者群組裏麵。)
這一節我們將從運行一個簡單的Hello world入手,來講解如何使用容器。
1 運行Hello World
root@shev:~# docker run ubuntu:14.04 echo hello-world
hello-world
root@shev:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0cef7fa7468d ubuntu:14.04 "echo hello-world" 3 seconds ago Exited (0) 2 seconds ago condescending_visvesvaraya
剖析:
- 本條命令啟動ubuntu:14.04版本的鏡像,並在其中運行打印hello world的命令;
- 由於我們的命令是一個簡單的語句,並不會持續很長時間,當命令執行完畢時,容器就退出了
- 因此,我們通過docker ps –a可以看到容器的狀態是停止狀態
2 運行一個可交互的容器
之前的例子裏麵,容器在運行完指令後就自動退出了,那麼我們可不可以運行一個可交互的容器呢?
root@shev:~# docker run -it ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
Digest: sha256:f91f9bab1fe6d0db0bfecc751d127a29d36e85483b1c68e69a246cf1df9b4251
Status: Downloaded newer image for ubuntu:latest
root@558531c2b215:/# ll
total 72
drwxr-xr-x 32 root root 4096 Dec 2 09:16 ./
drwxr-xr-x 32 root root 4096 Dec 2 09:16 ../
-rwxr-xr-x 1 root root 0 Dec 2 09:16 .dockerenv*
-rwxr-xr-x 1 root root 0 Dec 2 09:16 .dockerinit*
drwxr-xr-x 2 root root 4096 Oct 28 04:34 bin/
drwxr-xr-x 2 root root 4096 Apr 10 2014 boot/
drwxr-xr-x 5 root root 380 Dec 2 09:16 dev/
drwxr-xr-x 64 root root 4096 Dec 2 09:16 etc/
drwxr-xr-x 2 root root 4096 Apr 10 2014 home/
drwxr-xr-x 12 root root 4096 Oct 28 04:34 lib/
drwxr-xr-x 2 root root 4096 Oct 28 04:33 lib64/
drwxr-xr-x 2 root root 4096 Oct 28 04:33 media/
drwxr-xr-x 2 root root 4096 Apr 10 2014 mnt/
drwxr-xr-x 2 root root 4096 Oct 28 04:33 opt/
dr-xr-xr-x 160 root root 0 Dec 2 09:16 proc/
drwx------ 2 root root 4096 Oct 28 04:34 root/
drwxr-xr-x 7 root root 4096 Oct 28 04:34 run/
drwxr-xr-x 2 root root 4096 Nov 10 00:35 sbin/
drwxr-xr-x 2 root root 4096 Oct 28 04:33 srv/
dr-xr-xr-x 13 root root 0 Dec 2 09:16 sys/
drwxrwxrwt 2 root root 4096 Oct 28 04:34 tmp/
drwxr-xr-x 11 root root 4096 Nov 10 00:35 usr/
drwxr-xr-x 12 root root 4096 Nov 10 00:35 var/
root@558531c2b215:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
剖析:
- 本例中,我們在ubuntu:latest鏡像中,執行/bin/bash,由於bash本身是一個包含了交互的終端,因此我們可以長時間的運行容器;
- 但是,我們必須指定-it,同shell的stdiin和stdout綁定起來
- 進入容器後,我們實際進入了一個shell終端,裏麵不僅可以訪問文件將,還有一個虛擬網卡和IP。這是不是跟一個linux主機是一樣的呢?
3 在容器中運行一個後台守護進程
所謂後台守護進程,就是運行在後台,並不會阻塞當前的進程。
在後台運行一個腳本,每隔1秒打印一句hello world:
root@shev:~# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
ba50b5023bb15b50608d855671d40c09690f5b1a956a40e3544acde791e04aa3
查看後台的運行日誌:
root@shev:~# docker logs ba50
hello world
hello world
hello world
hello world
hello world
hello world
hello world
查看當前正在運行的容器列表:
root@shev:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba50b5023bb1 ubuntu:14.04 "/bin/sh -c 'while tr" 2 minutes ago Up 2 minutes ecstatic_bell
e221abf45a0b ghostcloud.cn:5000/gcali:1.2 "/usr/local/ghostclou" 49 minutes ago Up 49 minutes gcsagent
停止指定的容器:
root@shev:~# docker stop ba50
ba50
再次查看正在運行的容器:
root@shev:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e221abf45a0b ghostcloud.cn:5000/gcali:1.2 "/usr/local/ghostclou" 50 minutes ago Up 50 minutes gcsagent
剖析:
- 本例中,我們通過-d屬性,讓容器運行在後台,我們並不進入容器內部
- 執行完畢後,返回了一個id,該id是容器的id。上麵顯示的是容器的完整id,但是我們實際操作的時候,一般可以隻輸入前麵幾位即可,docker會自動進行匹配
- 我們通過docker logs 來查看容器運行的情況,也就是我們循環打印的日誌
- 由於該容器是長時間運行的,所以我們可以通過docker ps,查看該容器
- docker stop則是停止該容器,停止後,我們就看不到該容器了
最後更新:2017-04-01 13:37:06