在 CentOS 7.x 上建立 docker 環境

1. 安裝 docker
# yum install docker

2. 開機啟動及啟動 docker 服務
# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
# systemctl start docker.service

3. 查看 docker 版本資訊
# docker -v
Docker version 1.12.6, build 96d83a5/1.12.6

# docker version
Client:
 Version:         1.12.6
 API version:     1.24
 Package version: docker-common-1.12.6-11.el7.centos.x86_64
 Go version:      go1.7.4
 Git commit:      96d83a5/1.12.6
 Built:           Tue Mar  7 09:23:34 2017
 OS/Arch:         linux/amd64

Server:
 Version:         1.12.6
 API version:     1.24
 Package version: docker-common-1.12.6-11.el7.centos.x86_64
 Go version:      go1.7.4
 Git commit:      96d83a5/1.12.6
 Built:           Tue Mar  7 09:23:34 2017
 OS/Arch:         linux/amd64[@more@]
4. 搜尋 FreeBSD & Arch Linux 映像檔
# docker search freebsd
INDEX       NAME                                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/lexaguskov/freebsd                   FreeBSD operating system                        9
docker.io   docker.io/auchida/freebsd                      FreeBSD docker image from distribution arc…   4                    [OK]
docker.io   docker.io/egypcio/freebsd                      FreeBSD Containers (12.0, 11.0, 10.x, or 9.3)   4
docker.io   docker.io/kazuyoshi/freebsd-minimal                                                            4
docker.io   docker.io/amontalban/freebsd                   FreeBSD Images for Docker.                      3                    [OK]
docker.io   docker.io/roobixx/docker-dg                    DansGuardian is an award winning Open Sour…   2                    [OK]
docker.io   docker.io/vongrippen/freebsd                   FreeBSD with pkg installed                      1
docker.io   docker.io/alexcrichton/port-prebuilt-freebsd                                                   0
docker.io   docker.io/bbabich/docker-mfi-controller        UBNT mfi-controller FreeBSD w/ZFS Docker S…   0                    [OK]
docker.io   docker.io/catskillmts/freebsdminimal                                                           0
docker.io   docker.io/danielstaleiny/freebsd                                                               0
docker.io   docker.io/jamesandariese/go-freebsd-386                                                        0                    [OK]
docker.io   docker.io/jamesandariese/go-freebsd-amd64                                                      0                    [OK]
docker.io   docker.io/jamesandariese/go-freebsd-arm                                                        0                    [OK]
docker.io   docker.io/japaric/i686-unknown-freebsd                                                         0
docker.io   docker.io/japaric/x86_64-unknown-freebsd                                                       0
docker.io   docker.io/mattboll/freebsd                     testing freebsd images                          0
docker.io   docker.io/ptomulik/freebsd                     FreeBSD base images                             0
docker.io   docker.io/ptomulik/freebsd-ports               FreeBSD images with ports preinstalled          0
docker.io   docker.io/qlkao/freebsd                                                                        0
docker.io   docker.io/rustci/rustci-x86_64-freebsd                                                         0
docker.io   docker.io/siffland/freebsd-memcached           FreeBSD memcached docker                        0
docker.io   docker.io/supsup5642/freebsd_ubuntu                                                            0
docker.io   docker.io/tunisiano187/docker-freebsd          FreeBSD template automated                      0                    [OK]

# docker search archlinux
INDEX       NAME                                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/base/archlinux                 Basic ArchLinux installation                    212                  [OK]
docker.io   docker.io/finalduty/archlinux            A minimal Arch Linux base image for Docker…   17                   [OK]
docker.io   docker.io/logankoester/archlinux         A fully updated Arch Linux base image buil…   8                    [OK]
docker.io   docker.io/derjudge/archlinux                                                             7                    [OK]
docker.io   docker.io/greyltc/archlinux              Baseline Arch Linux image with an open, tr…   5                    [OK]
docker.io   docker.io/archlinuxjp/archlinux          The latest Arch Linux Docker image              4                    [OK]
docker.io   docker.io/thedcg/tl-archlinux            tl-archlinux                                    2                    [OK]
docker.io   docker.io/archlinuxjp/archlinux-min      The mini Arch Linux Docker image                1                    [OK]
docker.io   docker.io/archlinuxjp/archlinux-yaourt   + Yaourt to base image                          1                    [OK]
docker.io   docker.io/finalduty/archlinux-base       Personalised ArchLinux image                    1                    [OK]
docker.io   docker.io/obedmr/archlinux               ArchLinux Base Image                            1                    [OK]
docker.io   docker.io/opamp/archlinux                my archlinux base image with yaourt             1                    [OK]
docker.io   docker.io/ac1965/archlinux               A minimum environment of ArchLinux with Do…   0                    [OK]
docker.io   docker.io/admiringworm/archlinux         Archlinux base image based on pritunl/arch…   0                    [OK]
docker.io   docker.io/alekzonder/archlinux           fresh archlinux image every day                 0                    [OK]
docker.io   docker.io/alekzonder/archlinux-yaourt    fresh archlinux with yaourt tool for build…   0                    [OK]
docker.io   docker.io/archlinuxjp/archlinux-test     test image                                      0                    [OK]
docker.io   docker.io/colajam93/archlinux            Arch Linux Dockerfile for my testing / pac…   0                    [OK]
docker.io   docker.io/desiato/build-archlinux        archlinux-bootstrap builder                     0                    [OK]
docker.io   docker.io/freenas/archlinux              Simple Arch Linux interactive container         0                    [OK]
docker.io   docker.io/jackus/archlinux               Archlinux updated on build                      0                    [OK]
docker.io   docker.io/masm/archlinux                 A fully updated Arch Linux base image buil…   0                    [OK]
docker.io   docker.io/oblique/archlinux-pacaur       ArchLinux + pacaur                              0                    [OK]
docker.io   docker.io/smartentry/archlinux           archlinux with smartentry                       0                    [OK]
docker.io   docker.io/soem/archlinux                 Archlinux Minimal installation                  0                    [OK]

5. 下載
# docker pull docker.io/egypcio/freebsd
Using default tag: latest
Trying to pull repository docker.io/egypcio/freebsd …
latest: Pulling from docker.io/egypcio/freebsd

a3ed95caeb02: Pull complete
14a15dd57b8b: Pull complete
Digest: sha256:02f6c33382982db829ba63a52ed2467145c290f71f83ae5d8b304c274f809bbd

# docker pull docker.io/base/archlinux
Using default tag: latest
Trying to pull repository docker.io/base/archlinux …
latest: Pulling from docker.io/base/archlinux
ae06c652a19e: Pull complete
dd332190f0f1: Pull complete
3e401a3e6fe9: Pull complete
Digest: sha256:fe0829b6d78fd834a5300a84c559eab9cfe2056fe3c54b5418984ea374075506

6. 已下載安裝的映像檔
# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/base/archlinux    latest              ef9803580a16        16 hours ago        563.4 MB
docker.io/egypcio/freebsd   latest              8f539b0870b1        6 months ago        331.3 MB

7. 在容器中執行命令
# docker run docker.io/base/archlinux ls -l
total 4
lrwxrwxrwx   1 root root    7 Dec  5 23:43 bin -> usr/bin
drwxr-xr-x   2 root root    6 Dec  5 23:43 boot
drwxr-xr-x   5 root root  360 Apr  1 03:44 dev
drwxr-xr-x  27 root root 4096 Apr  1 03:44 etc
drwxr-xr-x   2 root root    6 Dec  5 23:43 home
lrwxrwxrwx   1 root root    7 Dec  5 23:43 lib -> usr/lib
lrwxrwxrwx   1 root root    7 Dec  5 23:43 lib64 -> usr/lib
drwxr-xr-x   2 root root    6 Dec  5 23:43 mnt
drwxr-xr-x   2 root root    6 Dec  5 23:43 opt
dr-xr-xr-x 187 root root    0 Apr  1 03:44 proc
drwxr-x—   3 root root   20 Mar 31 11:21 root
drwxr-xr-x   4 root root   33 Apr  1 03:44 run
lrwxrwxrwx   1 root root    7 Dec  5 23:43 sbin -> usr/bin
drwxr-xr-x   4 root root   29 Mar 31 11:21 srv
dr-xr-xr-x  13 root root    0 Apr  1 03:15 sys
drwxrwxrwt   2 root root    6 Mar 31 11:21 tmp
drwxr-xr-x   8 root root  105 Mar 31 11:21 usr
drwxr-xr-x  12 root root  160 Mar 31 11:22 var

當使用 docker run 來建立容器時,Docker 在後台會進行下列的工作:

  • 檢查本地端是否存在指定的映像檔,如果不存在就從公有的倉庫下載
  • 利用映像檔建立並啟動一個容器
  • 分配一個檔案系統,並在唯讀的映像檔層外面掛載一層可讀寫層
  • 從 Host 主機設定的網路橋接介面中橋接一個虛擬埠到容器之中
  • 從位址 Pool 中設定一個 IP 位址給容器
  • 執行使用者指定的應用程式
  • 執行完畢後容器終止

8. 進入 Arch Linux 容器
-t 讓 Docker 分配一個虛擬終端機(pseudo-tty) 並綁定到容器的標準輸入上
-i 讓容器的標準輸入保持打開
[root@docker ~]# docker run -t -i docker.io/base/archlinux /bin/bash
[root@a3ae68c6ee14 /]# pacman -Syy
:: Synchronizing package databases…
 core                     124.3 KiB   302K/s 00:00 [######################] 100%
 extra                   1678.7 KiB  2.65M/s 00:01 [######################] 100%
 community                  3.8 MiB  4.42M/s 00:01 [######################] 100%

[root@a3ae68c6ee14 /]# pacman -S vim
resolving dependencies…
looking for conflicting packages…

Packages (3) gpm-1.20.7-7  vim-runtime-8.0.0427-1  vim-8.0.0427-1

Total Download Size:    6.53 MiB
Total Installed Size:  29.65 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages…
 gpm-1.20.7-7-x86_64      127.5 KiB   310K/s 00:00 [######################] 100%
 vim-runtime-8.0.042…     5.2 MiB  4.48M/s 00:01 [######################] 100%
 vim-8.0.0427-1-x86_64   1247.8 KiB  5.25M/s 00:00 [######################] 100%
(3/3) checking keys in keyring                     [######################] 100%
(3/3) checking package integrity                   [######################] 100%
(3/3) loading package files                        [######################] 100%
(3/3) checking for file conflicts                  [######################] 100%
(3/3) checking available disk space                [######################] 100%
:: Processing package changes…
(1/3) installing vim-runtime                       [######################] 100%
(2/3) installing gpm                               [######################] 100%
(3/3) installing vim                               [######################] 100%
Optional dependencies for vim
    python2: Python 2 language support
    python: Python 3 language support
    ruby: Ruby language support
    lua: Lua language support
    perl: Perl language support [installed]
    tcl: Tcl language support
:: Running post-transaction hooks…
(1/1) Arming ConditionNeedsUpdate…

9. 退出 exit 或 Ctrl+D
[root@a3ae68c6ee14 /]# exit
exit
[root@docker ~]#

10. 二者使用的核心是相同的
# docker run docker.io/base/archlinux uname -a
Linux dfa510f8be80 3.10.0-514.10.2.el7.x86_64 #1 SMP Fri Mar 3 00:04:05 UTC 2017 x86_64 GNU/Linux
# uname -a
Linux docker.test.ilc.edu.tw 3.10.0-514.10.2.el7.x86_64 #1 SMP Fri Mar 3 00:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

11.儲存映像檔到本地端
# docker save -o archlinux.tar docker.io/base/archlinux
# ls -l *.tar
-rw——-. 1 root root 584920064  4月  1 12:12 archlinux.tar

12. 載入本地端映像檔
# docker load –input archlinux.tar

# docker load < archlinux.tar

13. 移除映像檔
# docker rmi docker.io/egypcio/freebsd:latest
Untagged: docker.io/egypcio/freebsd:latest
Untagged: docker.io/egypcio/freebsd@sha256:02f6c33382982db829ba63a52ed2467145c290f71f83ae5d8b304c274f809bbd
Deleted: sha256:8f539b0870b1ec6c1552172da492201166440a6f6199a0cd9208820cd377d03a
Deleted: sha256:c92b5d0f8475d3bb10df0bc5e8092da839777747e3653f3cf1cb63b33f17a3ff
Deleted: sha256:474999c372aa6b14e7b8e2afdcab83e2f89b783b243f87d2bbfa9b1a7346962b
Deleted: sha256:7800f80a93336d416612f372faa5f69eb67b353ce6ae9535fa0848f8784c74b1
Deleted: sha256:170b376f64fb30995c140276be3d71dfb256b308d86183ca3b22aa93a79ad548
Deleted: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef

# docker run -i -d -t docker.io/base/archlinux /bin/bash2332c0ada7596a74cafa5ea4fca41f37259c9cfa6a762a207ec7b313a743e37a

# docker ps
CONTAINER ID        IMAGE                      COMMAND             CREATED              STATUS              PORTS               NAMES
2332c0ada759        docker.io/base/archlinux   “/bin/bash”         About a minute ago   Up About a minute                       agitated_yalow

# docker attach agitated_yalow
[root@2332c0ada759 /]#