Centos7安裝Docker 基於Dockerfile 搭建httpd運行環境
本文檔完成目標內容如下
使用Docker搭建http服務器一台。
要求搭建完成后映射docker80端口。httpd頁面顯示自己的名字和IP地址
CentOS 7 下Docker的安裝
-
Docker簡介
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。Docker 容器通過 Docker 鏡像來創建。容器與鏡像的關系類似於面向對象編程中的對象與類。官網地址:http://www.docker.com/ -
docker所需環境准備
系統要求CentOS 7.X 以上版本,內核至少3.10,64-bit
- uname -r //查看內核
- 3.10.0-327.el7.x86_64
- yum update //升級本地yum包
創建docker的yum庫
- # cd /etc/yum.repos.d/ && vi docker.repo
-
- [dockerrepo]
- name=DockerRepository
- baseurl=https://yum.dockerproject.org/repo/main/centos/7
- enabled=1
- gpgcheck=1
- gpgkey=https://yum.dockerproject.org/gpg
安裝docker
- yum install docker-io
啟動docker服務並設置開機自動啟動
- systemctl start docker.service
- systemctl enable docker.service
- Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
驗證docker是否安裝成功
- docker info
- Containers: 0
- Running: 0
- Paused: 0
- Stopped: 0
- Images: 0
- Server Version: 1.10.3
- Storage Driver: devicemapper
- Pool Name: docker-253:0-34868263-pool
- Pool Blocksize: 65.54 kB
- Base Device Size: 10.74 GB
- Backing Filesystem: xfs
- Data file: /dev/loop0
- Metadata file: /dev/loop1
- Data Space Used: 11.8 MB
- Data Space Total: 107.4 GB
- Data Space Available: 26.96 GB
- Metadata Space Used: 581.6 kB
- Metadata Space Total: 2.147 GB
- Metadata Space Available: 2.147 GB
- Udev Sync Supported: true
- Deferred Removal Enabled: false
- Deferred Deletion Enabled: false
- Deferred Deleted Device Count: 0
- Data loop file: /var/lib/docker/devicemapper/devicemapper/data
- WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
- Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
- Library Version: 1.02.135-RHEL7 (2016-09-28)
- Execution Driver: native-0.2
- Logging Driver: journald
- Plugins:
- Volume: local
- Network: host bridge null
- Kernel Version: 3.10.0-327.el7.x86_64
- Operating System: CentOS Linux 7 (Core)
- OSType: linux
- Architecture: x86_64
- Number of Docker Hooks: 2
- CPUs: 2
- Total Memory: 3.86 GiB
- Name: localhost.localdomain
- ID: WZJQ:VTFD:LVRA:SSU3:MFNC:75V3:JEZT:KTVR:HF2G:WXR5:34AR:N2N5
- WARNING: bridge-nf-call-iptables is disabled
- WARNING: bridge-nf-call-ip6tables is disabled
- Registries: docker.io (secure)
查看安裝后的docker版本
- docker version
- Client:
- Version: 1.10.3
- API version: 1.22
- Package version: docker-common-1.10.3-59.el7.centos.x86_64
- Go version: go1.6.3
- Git commit: 3999ccb-unsupported
- Built: Thu Dec 15 17:24:43 2016
- OS/Arch: linux/amd64
-
- Server:
- Version: 1.10.3
- API version: 1.22
- Package version: docker-common-1.10.3-59.el7.centos.x86_64
- Go version: go1.6.3
- Git commit: 3999ccb-unsupported
- Built: Thu Dec 15 17:24:43 2016
- OS/Arch: linux/amd64
3.編寫Dockerfile
Dockfile是一種被Docker程序解釋的腳本,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程序將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支持的命令,Docker程序解決這些命令間的依賴關系,類似於Makefile。Docker程序將讀取Dockerfile,根據指令生成定制的image。相比image這種黑盒子,Dockerfile這種顯而易見的腳本更容易被使用者接受,它明確的表明image是怎么產生的。有了Dockerfile,當我們需要定制自己額外的需求時,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻煩。
3.1 Docker加速器
之所以提到這個是因為,在build鏡像的過程中需要從服務器pull images,但是不幸的的Docker官網已經被牆,所以需要借助國內第三方,我使用的阿里雲的。
安裝或升級Docker
您可以通過阿里雲的鏡像倉庫下載: mirrors.aliyun.com/help/docker-engine
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
配置Docker加速器
您可以使用如下的腳本將mirror的配置添加到docker daemon的啟動參數中。
系統要求 CentOS 7 以上,Docker 1.9 以上。
sudo sed -i "s|ExecStart=/usr/bin/docker daemon|ExecStart=/usr/bin/docker daemon --registry-mirror=https://g9d5s6dr.mirror.aliyuncs.com|g" sudo systemctl daemon-reload sudo service docker restart
Dockerfile文件內容如下:
- FROM centos:centos6
- MAINTAINER liuqiang <402588603@qq.com>
- RUN yum -y update; yum clean all
- RUN yum -y install httpd && yum clean all
- RUN touch /var/www/html/index.html
- RUN echo "I have finished, pls give me five!!!! --liuqiang " >>
- /var/www/html/index.html
- EXPOSE 80
- #Simple startup script to avoid some issues observed with container restart
- ADD run-httpd.sh /run-httpd.sh //注意腳本目錄
- RUN chmod -v +x /run-httpd.sh //賦予腳本執行權限
- CMD ["/run-httpd.sh"]
run-httpd.sh腳本內容如下
- cat >> run-httpd.sh << EOF
- #!/bin/bash
- # Make sure we're not confused by old, incompletely-shutdown httpd
- # context after restarting the container. httpd won't start correctly
- # if it thinks it is already running.
- rm -rf /run/httpd/*
- exec /usr/sbin/apachectl -D FOREGROUND
- EOF
注意:Dockerfile需借助腳本來重啟httpd服務,並且最好放置於同一目錄
- docker build -t liuqiang/httpd:centos6 .
- flag provided but not defined: -it
- See '/usr/bin/docker-current --help'.
- docker build -t liuqiang/httpd .
- Sending build context to Docker daemon 5.12 kB
- Step 1 : FROM centos:centos6
- ---> 8315978ceaaa
- Step 2 : MAINTAINER liuqiang <402588603@qq.com>
- ---> Using cache
- ---> 658aeb6d114a
- Step 3 : RUN yum -y update; yum clean all
- ---> Using cache
- ---> 8f1c933b2c3c
- Step 4 : RUN yum -y install httpd && yum clean all
- ---> Using cache
- ---> 98ee768720c7
- Step 5 : RUN touch /var/www/html/index.html
- ---> Using cache
- ---> b69a69656752
- Step 6 : RUN echo "I have finished, pls give me five!!!! --liuqiang" >> /var/www/html/index.html
- ---> Using cache
- ---> b4c9fd4843fb
- Step 7 : EXPOSE 80
- ---> Using cache
- ---> e4b5491564c2
- Step 8 : ADD run-httpd.sh /run-httpd.sh
- ---> Using cache
- ---> ed7ec84907d1
- Step 9 : RUN chmod -v +x /run-httpd.sh
- ---> Using cache
- ---> 081c6a101c16
- Step 10 : CMD /run-httpd.sh
- ---> Using cache
- ---> 15eaa6d6d407
- Successfully built 15eaa6d6d407
此時通過Dockerfile創建的鏡像已經創建成功,並無報錯
接下來運行容器
docker run -it -p 80:80 liuqiang/httpd:centos6
docker: Error response from daemon: failed to create endpoint clever_keller on network bridge: Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use.
啟動
- docker run -d -p 80:80 liuqiang/httpd:centos6
- 0582508431eb5713c1401843e68cb36b51de3bdd23dfa468cbe7496d71091e25
- curl http://localhost
- I have finished, pls give me five!!!! --liuqiang //curl測試成功
瀏覽器測試確認下