測試環境 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 ,透過搜尋 Ubuntu12.04 可以找到一堆關於 Ubuntu 12.04 的 Image ,執行並在這個 Container 的 Sehll 執行 echo ‘Hello Docker’
root@ubuntu:~# docker search ubuntu:12.04 NAME DESCRIPTION STARS OFFICIAL AUTOMATED widerplan/ubuntu-12.04 Basic Ubuntu 12.04 builds with a few utili... 0 [OK] ....
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
- images – List images ,查看系統有那一些 映像檔 (Image)
root@ubuntu:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 12.04 aefa163f7a7e 31 hours ago 103.6 MB
# docker ps -a
- ps – List containers ,一個映像檔 (Image) 可以產生多個 容器 (Container),這邊可以檢查產生幾個容器 (Container)了.注意狀態都是已退出.
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 是沒有設定虛擬終端 (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
要把 image 移除要使用下面的參數.
- rmi – Remove one or more images
這 Docker 與之前用過 LXC 虛擬化 https://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) 的關聯是? 如下圖所示.
軟體 Docker 用來管理 Container 的環境,虛擬層不一定是要 LXC ,可以是其他虛擬化技術.Docker 預設已經直接使用 Docker 本身提供的 Container 不會使用 LXC , 現在的 LXC 搭配另一套 LXD 來使用.
參考文件:
10個 Q&A 快速認識 Docker – http://www.ithome.com.tw/news/91847
2 thoughts on “Linux – Docker”