2017-05-06

使用 docker 建立 CentOS 7 container

這是個奇特的情境:在 CentOS 7 實體機器上使用 docker 透過 CentOS 7 建立 CentOS 7 container ,聽來怪怪的XD,原因是 docker hub 上現有的 image 不符合公司使用需求,所以想要自行製作合適的 image,當然正統方式是使用 dockerfifle 來建立,但就目前我對 linux 語法熟悉度還做不到,只好用這招先解決問題,不過換個角度想:下個學習計劃就是 linux 了,真的永遠都學不完呀;

在建立 CentOS 7 container 的過程中有出現錯誤,所以紀錄一下


docker hub 建議建立方式(無法建立成功)

  • 建立語法

    docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/c7-systemd-httpd

  • 錯誤訊息
    [root@DK01 /]# docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/c7-systemd-httpd
    Unable to find image 'local/c7-systemd-httpd:latest' locally
    Trying to pull repository docker.io/local/c7-systemd-httpd ... 
    Pulling repository docker.io/local/c7-systemd-httpd
    /usr/bin/docker-current: Error: image local/c7-systemd-httpd:latest not found.
    See '/usr/bin/docker-current run --help'.
    

    1errormsg

正確建立方式

  1. 建立語法 一(由 docker hub 建議語法改善而來)

    docker run --privileged --name centos7 -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 -d renizgo/c7-systemd-httpd /usr/sbin/init

  2. 建立語法 二(語法較直覺)

    docker run --privileged --name centos7 -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 -d centos /usr/sbin/init

心得

docker 還在快速發展,語法常有異動,錯誤的解決方式也經常有變化,使用時需要多留意;

另外再次提醒大家:客製 image 正統作法是透過 dockerfile 來 build 出適合的 image,不是將 container 裝上所需工具後再 commit 為 image

參考資訊

  1. The official build of CentOS

1 則留言:

  1. 雖然版大應該早已解決問題了,不過之前也是新手的我來分享一下,好像之後路過的人可以參考。
    docker hub CentOS 官方的建議作法其實是這樣:

    1. Build c7-systemd

    1.1. 首先準備 Dockerfile
    FROM centos:7
    ENV container docker
    RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
    systemd-tmpfiles-setup.service ] || rm -f $i; done); \
    rm -f /lib/systemd/system/multi-user.target.wants/*;\
    rm -f /etc/systemd/system/*.wants/*;\
    rm -f /lib/systemd/system/local-fs.target.wants/*; \
    rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
    rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
    rm -f /lib/systemd/system/basic.target.wants/*;\
    rm -f /lib/systemd/system/anaconda.target.wants/*;
    VOLUME [ "/sys/fs/cgroup" ]
    CMD ["/usr/sbin/init"]

    1.2 在 Dockerfile 所在的資料夾下指令 build image:
    $ docker build --rm -t local/c7-systemd .

    ---

    2. 利用剛剛建好的 image 再來 build 一個把 httpd 包進去的 image

    2.1 準備 Dockerfile (請在另一個資料夾)
    FROM local/c7-systemd
    RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
    EXPOSE 80

    CMD ["/usr/sbin/init"]

    2.2. 在 Dockerfile 所在的資料夾下指令 build image:
    $ docker build --rm -t local/c7-systemd-httpd .

    ---

    3. 最後才把這個包含 httpd 的 image 開起來:
    $ docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/c7-systemd-httpd

    回覆刪除