468 瀏覽數

Linux Docker

測試環境 Ubuntu 16.04 AMD64 (Docker 只支援 64位元的作業系統)

直接來使用,後面再說明.所需套件名稱為 docker.io

root@ubuntu:~# apt-get install docker.io
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  bridge-utils cgroupfs-mount containerd git git-man liberror-perl runc
  ubuntu-fan
Suggested packages:
  aufs-tools btrfs-tools debootstrap docker-doc rinse zfs-fuse | zfsutils
  git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk
  gitweb git-arch git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
  bridge-utils cgroupfs-mount containerd docker.io git git-man liberror-perl
  runc ubuntu-fan
0 upgraded, 9 newly installed, 0 to remove and 9 not upgraded.
Need to get 19.9 MB of archives.
After this operation, 108 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
...

安裝完 Docker 之後可以透過 docker 指令確定安裝版本,以及其他狀態是否正確.

root@ubuntu:~# docker version
Client:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.6.2
 Git commit:   23cf638
 Built:        Tue, 27 Sep 2016 12:25:38 +1300
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.1
 API version:  1.24
 Go version:   go1.6.2
 Git commit:   23cf638
 Built:        Tue, 27 Sep 2016 12:25:38 +1300
 OS/Arch:      linux/amd64
root@ubuntu:~# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 1.12.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 0
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null host bridge overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor
Kernel Version: 4.4.0-31-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 975 MiB
Name: ubuntu
ID: G6SX:GFWF:NQNJ:WQEU:MUY2:4ESX:2JQZ:5KYF:T64H:LXFS:FUOS:R22R
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Insecure Registries:
 127.0.0.0/8

好了先來開一個 Container (Image: Ubuntu 12.04),並在這個 Container 的 Sehll 執行 echo ‘Hello Docker’

root@ubuntu:~# docker run ubuntu:12.04 echo ‘Hello Docker’
Unable to find image 'ubuntu:12.04' locally
12.04: Pulling from library/ubuntu
d6ec4d0dfee2: Downloading 2.752 MB/39.07 MB
b16bbaf4c0bd: Download complete 
bcfd0f7e92b6: Download complete 
fe82d8e42dc0: Download complete 
af144ef32a67: Download complete 

不過我的系統裡面並沒有 Ubuntu12.04 的 Image ,所以第一次使用需要到 倉庫 (Repository) 來下載.下載完畢就會去 Container 的 Sehll 執行 echo ‘Hello Docker’
docker [OPTIONS] COMMAND [arg…]
run – Run a command in a new container
create – Create a new container
如果需要先修改 Container 的預設值可以用 create 修改完在 start container.

root@ubuntu:~# docker run ubuntu:12.04 echo ‘Hello Docker’
Unable to find image 'ubuntu:12.04' locally
12.04: Pulling from library/ubuntu
d6ec4d0dfee2: Pull complete 
b16bbaf4c0bd: Pull complete 
bcfd0f7e92b6: Pull complete 
fe82d8e42dc0: Pull complete 
af144ef32a67: Pull complete 
Digest: sha256:cbcc4eb9901bfa2ae38b4621315629941d22e7b2b2a7888db1c66cea88737736
Status: Downloaded newer image for ubuntu:12.04
‘Hello Docker’

剛剛做了一堆事情,裡面已經有談論到關於 Docker 基本的三個觀念. 容器 (Container) , 映像檔 (Image) , 倉庫 (Repository) .

  • 容器 (Container)
    在原作業系統中透過資源共享的方式,建立出一個獨立空間 (虛擬環境,有自己的 file system, process 與 block I/O ,network 空間) 給另外一個作業系統來使用,聽起來很像是虛擬機器 Virtual Machine 但方式不一樣,名稱也不太一樣,這樣的方式叫做 Container.
  • 映像檔 (Image)
    Container 是一個容器,我們需要將作業環境放到這一個容器,最快的方式就是透過網路下載別人已經做好的作業環境 (唯讀映像檔) 來使用,當然也是可以自己建立.因為這是一個唯讀的映像檔,所以容器啟動的時候還會提供資料可以寫入的一層地方.
  • 倉庫 (Repository)
    倉庫是用來存放映像檔的地方,預設會到 Docker Hub https://hub.docker.com 這個倉庫來找.

剛剛第一次使用使使用倉庫 (Repository)的映像檔 (Image)來產生 容器 (Container),那要如何看我系統目前有哪一些 映像檔 (Image) 與 容器 (Container)呢!
# docker images
查看系統有那一些 映像檔 (Image)
images – List images

root@ubuntu:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              12.04               aefa163f7a7e        31 hours ago        103.6 MB

# docker ps -a
一個映像檔 (Image) 可以產生多個 容器 (Container),這邊可以檢查產生幾個容器 (Container)了.注意狀態都是已退出.
ps – List containers

root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                   PORTS               NAMES
4ba89a46959c        ubuntu:12.04        "echo ‘Hello Docker"   6 hours ago         Exited (0) 6 hours ago                       elated

這邊先來討論一下 Container 的生命週期,執行 docker run/create 時會透過 映像檔 (Image) 產生新的 Container ,執行完畢的 Container 就會被關閉,如果要完全移除需要透過 docker rm Container 來移除.

我們剛剛建立的 Container 是沒有設定虛擬終端 (pseudo-tty),可供使用者登入使用.所以可以透過下面的參數建立一個有 虛擬終端 (pseudo-tty) 的 Container.

root@ubuntu:~# docker run -t -i ubuntu:12.04 /bin/bash
root@e3df182ba22b:/# ls
bin   dev  home  lib64  mnt  proc  run   selinux  sys  usr
boot  etc  lib   media  opt  root  sbin  srv      tmp  var
root@e3df182ba22b:/# exit
exit
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS               NAMES
e3df182ba22b        ubuntu:12.04        "/bin/bash"            17 seconds ago      Exited (0) 12 seconds ago                       stoic_mclean
4ba89a46959c        ubuntu:12.04        "echo ‘Hello Docker"   2 days ago          Exited (0) 2 days ago                           elated_ritchie_ritchie   

-t : 將 Container 的輸出轉向到 虛擬終端(pseudo-tty),也就是我們在系統上終端機看到的.
-i : 透過系統的鍵盤將資料輸入到 Container 裡面.

剛剛的 Container 會執行 /bin/bash 並等待有使用者結束這個指令 exit 之後就會關閉,不過下次我們一樣可以用手動的方式將它打開並登入進去看看.

  • start – Start one or more stopped containers
  • stop – Stop one or more running containers
  • stats – Display a live stream of container(s) resource usage statistics
  • attach – Attach to a running container
root@ubuntu:~# docker start e3df182ba22b
e3df182ba22b
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                  PORTS               NAMES
e3df182ba22b        ubuntu:12.04        "/bin/bash"            13 hours ago        Up 2 seconds                                stoic_mclean
4ba89a46959c        ubuntu:12.04        "echo ‘Hello Docker"   3 days ago          Exited (0) 2 days ago                       elated_ritchie
root@ubuntu:~# docker stats e3df182ba22b
CONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
e3df182ba22b        0.00%               4.148 MiB / 975 MiB   0.43%               6.946 kB / 648 B    3.826 MB / 0 B      1

Container 已經執行 /bin/bash 並等待使用者登入,可以透過 attch

root@ubuntu:~# docker attach e3df182ba22b
root@e3df182ba22b:/# ls
bin   dev  home  lib64  mnt  proc  run   selinux  sys  usr
boot  etc  lib   media  opt  root  sbin  srv      tmp  var
root@e3df182ba22b:/# exit
exit
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
e3df182ba22b        ubuntu:12.04        "/bin/bash"            13 hours ago        Exited (0) 8 seconds ago                       stoic_mclean
4ba89a46959c        ubuntu:12.04        "echo ‘Hello Docker"   3 days ago          Exited (0) 2 days ago                          elated_ritchie

當這個 Container 不用時就可以移除他.
rm – Remove one or more containers

root@ubuntu:~# docker rm  e3df182ba22b
e3df182ba22b
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                  PORTS               NAMES
4ba89a46959c        ubuntu:12.04        "echo ‘Hello Docker"   3 days ago          Exited (0) 2 days ago                       elated_ritchie

之前用過 LXC 虛擬化 http://benjr.tw/95955

LXC 提供類似於作業系統層級的虛擬化 OS-Level Virtualization ,LXC 採用類似的方式在原作業系統中透過資源共享的方式,建立出一個獨立空間 (虛擬環境,有自己的 file system, process 與 block I/O ,network 空間) 給另外一個作業系統來使用,這邊不再稱它為虛擬機器 Virtual Machine 而是叫做 Container.Container 的軟體不只有 LXC ,chroot , schroot 也算是一種 Container 技術.

那 Docker 是什麼? Docker 與 Container (LXC) 的關聯是? 如下圖所示.
docker01
軟體 Docker 用來管理 Container 的環境,虛擬層不一定是要 LXC ,可以是其他虛擬化技術.Docker 預設已經直接使用 Docker 本身提供的 Container 不會使用 LXC , 現在的 LXC 搭配另一套 LXD 來使用.

參考文件:
10個Q&A快速認識Docker
http://www.ithome.com.tw/news/91847

GitBook
https://www.gitbook.com/@joshhu
https://www.gitbook.com/@philipzheng

發表迴響