目錄:php
一、Docker 鏡像介紹html
二、鏡像下載java
三、查看鏡像信息node
四、搜索鏡像python
五、刪除鏡像linux
六、建立鏡像nginx
6.2 基於 Dockerfile 建立redis
一、Docker 鏡像介紹docker
Docker 鏡像跟虛擬機鏡像的概念差很少,都是能夠經過鏡像來建立虛擬機或容器,Docker 運行容器的時候首先會在本地尋找,若是本地不存在該鏡像,則會從默認的鏡像倉庫中下載(默認使用 Docker Hub 公共註冊服務器中的倉庫)
二、鏡像下載
能夠經過 docker pull 命令從 docker 倉庫中下載對應的鏡像,若是不顯示地指定 TAG,則默認會選擇 latest 標籤,即下載倉庫中最新版本的鏡像。下面介紹如何下載 centos 6.6 操做系統的鏡像。
因爲官方的鏡像源在國外,因此基本上屬於獲取不到的狀態,因此我這裏修改 docker 的配置文件,添加配置項,優先使用 163 的鏡像源
[root@crazy-acong ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@crazy-acong ~]# cat /etc/sysconfig/docker # /etc/sysconfig/docker # # Other arguments to pass to the docker daemon process # These will be parsed by the sysv initscript and appended # to the arguments list passed to docker -d # other_args= # 註釋掉這一行,添加下一行 other_args=--registry-mirror=http://hub.c.163.com DOCKER_CERT_PATH=/etc/docker # Resolves: rhbz#1176302 (docker issue #407) DOCKER_NOWARN_KERNEL_VERSION=1 # Location used for temporary files, such as those created by # # docker load and build operations. Default is /var/lib/docker/tmp # # Can be overriden by setting the following environment variable. # # DOCKER_TMPDIR=/var/tmp
其它系統的配置方法能夠參考:https://yq.aliyun.com/articles/29941
而後能夠就能夠下載 centos6.6 的鏡像了
[root@crazy-acong ~]# docker pull centos:6.6 # 查看docker 本地鏡像 [root@crazy-acong ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.6 d0d663863c34 7 months ago 202.6 MB
此時就可使用該鏡像建立容器了
[root@crazy-acong ~]# docker run -it centos:6.6 /bin/bash [root@7f3f9540ca71 /]# cat /etc/redhat-release CentOS release 6.6 (Final)
三、查看鏡像信息
使用 docker images 命令能夠列出本地主機上已有的鏡像
[root@crazy-acong ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.6 d0d663863c34 7 months ago 202.6 MB REPOSITORY 表示來自哪一個倉庫 TAG 鏡像的標籤 IMAGE ID 鏡像的 ID 號(惟一) CREATED 建立時間 VIRTUAL SIZE 鏡像大小
鏡像的 ID 信息比較重要,它惟一標識了鏡像
TAG 信息用於標記來自同一個倉庫的不一樣鏡像,例如 centos 倉庫中有多個鏡像,經過 TAG 信息來區分發行版本,包括 6.六、6.七、6.八、7.0、7.1等標籤。
可使用 docker tag 給本地的鏡像添加新的標籤,例如:
[root@crazy-acong ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.6 d0d663863c34 7 months ago 202.6 MB centos 6.6_node01 d0d663863c34 7 months ago 202.6 MB # 能夠看到他們的 IMAGE ID 是相同的,說明他們指向了同一個鏡像文件,只是別名不一樣而已,標籤在這裏起到了引用或快捷方式的做用
使用 docker inspect 查看鏡像詳細信息
[root@crazy-acong ~]# docker inspect d0d663863c34 [ { "Id": "d0d663863c34e7895231820867d4ffb7e54f026f0059c3dee7fd859ee75f6b39", "Parent": "3690474eb5b4b26fdfbd89c6e159e8cc376ca76ef48032a30fa6aafd56337880", "Comment": "", "Created": "2016-08-30T18:21:00.214353268Z", "Container": "b99744612d0b8640d4df84640a3b7e2191a6cb2cadaadf19e9a937473e61a138", "ContainerConfig": { "Hostname": "b99744612d0b", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "PortSpecs": null, "ExposedPorts": null, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ADD file:a5c79d873c20d685b71d899211c5d58b90c08473604aba82a9d655a58fcd1488 in / " ], "Image": "sha256:20ae10d641a0af6f25ceaa75fdcf591d171e3c521a54a3f3a2868b602d735e11", "Volumes": null, "VolumeDriver": "", "WorkingDir": "", "Entrypoint": null, "NetworkDisabled": false, "MacAddress": "", "OnBuild": null, "Labels": {} }, "DockerVersion": "1.12.1", "Author": "The CentOS Project \u003ccloud-ops@centos.org\u003e - ami_creator", "Config": { "Hostname": "b99744612d0b", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "PortSpecs": null, "ExposedPorts": null, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": null, "Image": "sha256:20ae10d641a0af6f25ceaa75fdcf591d171e3c521a54a3f3a2868b602d735e11", "Volumes": null, "VolumeDriver": "", "WorkingDir": "", "Entrypoint": null, "NetworkDisabled": false, "MacAddress": "", "OnBuild": null, "Labels": {} }, "Architecture": "amd64", "Os": "linux", "Size": 202602386, "VirtualSize": 202602386 } ] # docker inspect 命令返回的是一個 JSON 格式的消息,若是咱們只須要其中的一項內容,可使用 -f 參數指定,例如,獲取鏡像的 Architecture 信息 [root@crazy-acong ~]# docker inspect -f '{{.Architecture}}' d0d663863c34 amd64
四、搜索鏡像
使用 docker search centos 搜索 centos 鏡像,默認搜索 Docker Hub 官方倉庫中的鏡像,默認按照星級評價進行排序。
[root@crazy-acong ~]# docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 3239 [OK] jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.3.1611 x8... 63 [OK] jdeathe/centos-ssh-apache-php CentOS-6 6.8 x86_64 - Apache / PHP-FPM / P... 25 [OK] nimmis/java-centos This is docker images of CentOS 7 with dif... 24 [OK] consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 24 [OK] gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glu... 18 [OK] million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 15 [OK] torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK] egyptianbman/docker-centos-nginx-php A simple and highly configurable docker co... 6 [OK] nathonfowlie/centos-jre Latest CentOS image with the JRE pre-insta... 5 [OK] centos/mariadb55-centos7 4 [OK] harisekhon/centos-scala Scala + CentOS (OpenJDK tags 2.10-jre7 - 2... 2 [OK] harisekhon/centos-java Java on CentOS (OpenJDK, tags jre/jdk7-8) 2 [OK] centos/redis Redis built for CentOS 2 [OK] timhughes/centos Centos with systemd installed and running 1 [OK] freenas/centos Simple CentOS Linux interactive container 1 [OK] darksheer/centos Base Centos Image -- Updated hourly 1 [OK] blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK] repositoryjp/centos Docker Image for CentOS. 0 [OK] vcatechnology/centos A CentOS Image which is updated daily 0 [OK] kz8s/centos Official CentOS plus epel-release 0 [OK] grayzone/centos auto build for centos. 0 [OK] otagoweb/centos Apache (with PHP7), built on CentOS 7 0 [OK] grossws/centos CentOS 6 and 7 base images with gosu and l... 0 [OK] januswel/centos yum update-ed CentOS image 0 [OK] NAME 鏡像名稱 DESCRIPTION 描述 STARS 星級(表示受歡迎程度) OFFICIAL 是否官方建立 AUTOMATED 是否自動建立
或者去 163 的鏡像源去搜索 https://c.163.com/hub#/m/home/
五、刪除鏡像
使用 docker rmi 命令能夠刪除鏡像,命令格式爲 docker rmi 鏡像名稱:TAG/鏡像ID
[root@crazy-acong ~]# docker rmi -f centos:6.6 [root@crazy-acong ~]# docker rmi -f d0d663863c34
當一個鏡像 ID 存在多個 TAG 時,刪除其中的一個TAG 不會影響其餘的 TAG,若是該鏡像ID 只剩下一個 TAG ,此時刪除則會完全刪除鏡像文件
當該鏡像下還有容器存在的時候,刪除鏡像會報錯,可使用 docker rmi -f 強制刪除,可是不推薦這樣作,能夠先刪除容器,最後在刪除鏡像
六、建立鏡像
建立鏡像的方法:
6.1 基於已有鏡像的容器建立
這裏基於 centos 官方的 docker 鏡像,在其安裝 nginx 服務,而後將其打包成一個鏡像
[root@crazy-acong ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.6 d0d663863c34 7 months ago 202.6 MB [root@crazy-acong ~]# docker run -it centos:6.6 /bin/bash [root@225084efe2fb /]# # nginx 安裝參考 http://www.cnblogs.com/CongZhang/p/6548570.html # 此時 nginx 已經安裝完畢 [root@225084efe2fb nginx-1.10.3]# /etc/nginx/sbin/nginx -V nginx version: nginx/1.10.3 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --user=nginx --group=nginx --prefix=/data/application/nginx-1.10.3 --with-http_stub_status_module --with-http_ssl_module [root@225084efe2fb nginx-1.10.3]# /etc/nginx/sbin/nginx -t nginx: the configuration file /data/application/nginx-1.10.3/conf/nginx.conf syntax is ok nginx: configuration file /data/application/nginx-1.10.3/conf/nginx.conf test is successful # 啓動 nginx [root@225084efe2fb nginx-1.10.3]# /etc/nginx/sbin/nginx [root@225084efe2fb nginx-1.10.3]# netstat -lnpt | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2562/nginx # 修改nginx 配置文件 nginx.conf 讓 nginx 不在後臺啓動 [root@225084efe2fb nginx-1.10.3]# echo "daemon off;" >> /etc/nginx/conf/nginx.conf # 若是不加這行則會致使容器啓動以後自動就關閉了 # 退出容器 [root@225084efe2fb nginx-1.10.3]# exit
[root@crazy-acong ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 225084efe2fb centos:6.6 "/bin/bash" 28 minutes ago Up 9 minutes angry_davinci [root@crazy-acong ~]# docker commit -m "centos6.6_nginx" -a "zhangcong" 225084efe2fb centos6.6_nginx:v1 -m 提交消息 -a 做者信息 -p 提交時暫停容器運行
[root@crazy-acong ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos6.6_nginx v1 aa4b2a57b43e About a minute ago 446.2 MB # 該鏡像就是手動生成的 centos 6.6 d0d663863c34 7 months ago 202.6 MB
# 啓動該鏡像,並將服務器的 80 端口映射到容器的 80 端口 [root@crazy-acong ~]# docker run -it -d -p 80:80 aa4b2a57b43e /etc/nginx/sbin/nginx [root@crazy-acong ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 46a2ec546a50 aa4b2a57b43e "/etc/nginx/sbin/ngi 2 seconds ago Up 1 seconds 0.0.0.0:80->80/tcp berserk_mayer 225084efe2fb centos:6.6 "/bin/bash" 32 minutes ago Up 13 minutes angry_davinci # 此時經過訪問服務器的 80 端口就能夠訪問到容器的 nginx 提供的服務 [root@crazy-acong ~]# curl http://127.0.0.1 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
6.2 基於 Dockerfile 建立
Dockerfile 是一個文本格式的配置文件,可使用 Dockerfile 快速建立自定義的鏡像。
Dockerfile 由多行命令語句組成,支持以 # 開頭的註釋行,其主要分爲四部分:基礎鏡像信息、維護者信息、鏡像操做指令、容器啓動時執行命令。
1、FROM 指定基礎鏡像,可使用鏡像ID或者 鏡像名稱:TAG 2、MAINTAINER 指定維護者信息 3、RUN RUN<command>或RUN["executable","param1","param2"] 前者在shell 終端中運行命令 /bin/sh -c 指定 後者能夠指定其餘終端,例如 RUN ["/bin/bash","-c","echo hello"] 每條RUN 指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像,當命令較長時可使用 \ 換行 4、CMD 啓動容器時執行的命令,每一個Dockerfile 只能有一條 CMD 命令,若是存在多條,則最後一條生效,若是啓動容器時指定了運行命令,則會覆蓋掉 CMD指定的命令 CMD["executable","param1","param2"]使用exec執行,推薦方式。 CMDcommand param1 param2在/bin/sh中執行,提供給須要交互的應用。 CMD["param1","param2"]提供給ENTRYPOINT的默認參數。 5、EXPOSE 啓動容器時暴露的端口號 EXPOSE 80 在啓動容器的時候使用 -P 選項,Docker 服務端會隨機一個端口映射到容器暴露的端口上,或者使用 -p 指定端口進行映射 6、ENV 設置容器中的環境變量 ENV PATH /data/application/nginx-1.10.3/sbin/:$PATH 7、ADD 將外部文件複製到容器內部 ADD<src><dest> 其中<src>能夠是Dockerfile所在目錄的一個相對路徑(文件或目錄);也能夠是一個URL;還能夠是一個tar文件(自動解壓爲目錄)。 例如:ADD nginx-1.10.3.tar.gz /usr/local/src/ 8、COPY 格式爲COPY<src><dest>。 複製本地主機的<src>(爲Dockerfile所在目錄的相對路徑,文件或目錄)爲容器中的<dest>。目標路徑不存在時,會自動建立。 當使用本地目錄爲源目錄時,推薦使用COPY。 9、ENTRYPOINT 有兩種格式: ENTRYPOINT["executable","param1", "param2"] ENTRYPOINTcommand param1 param2(shell中執行)。 配置容器啓動後執行的命令,而且不可被docker run提供的參數覆蓋。 每一個Dockerfile中只能有一個ENTRYPOINT,當指定多個ENTRYPOINT時,只有最後一個生效。 10、VOLUME 格式爲VOLUME["/data"]。 建立一個能夠從本地主機或其餘容器掛載的掛載點,通常用來存放數據庫和須要保存的數據等。 11、USER 格式爲USER daemon。 指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶。 當服務不須要管理員權限時,能夠經過該命令指定運行用戶。而且能夠在以前建立所須要的用戶,例如:RUN groupadd-r postgres&&useradd-r-g postgres postgres。要臨時獲取管理員權限可使用gosu,而不推薦sudo。 12、.WORKDIR 格式爲WORKDIR/path/to/workdir。 爲後續的RUN、CMD、ENTRYPOINT指令配置工做目錄。 可使用多個WORKDIR指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑。例如: WORKDIR /a WORKDIR b WORKDIR c RUN pwd 則最終路徑爲/a/b/c。 13、ONBUILD 格式爲ONBUILD[INSTRUCTION]。 配置當所建立的鏡像做爲其餘新建立鏡像的基礎鏡像時,所執行的操做指令。例如,Dockerfile使用以下的內容建立了鏡像image-A。 [...] ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src [...] 若是基於image-A建立新的鏡像時,新的Dockerfile中使用FROM image-A指定基礎鏡像時,會自動執行ONBUILD指令內容,等價於在後面添加了兩條指令。 FROM image-A #Automatically run the following ADD . /app/src RUN /usr/local/bin/python-build --dir /app/src 使用ONBUILD指令的鏡像,推薦在標籤中註明,例如ruby:1.9-onbuild。
[root@crazy-acong ~]# mkdir -p /opt/docker-file/nginx/ [root@crazy-acong ~]# cd /opt/docker-file/nginx/ # 注意 Dockerfile 的文件名只能叫 Dockerfile [root@crazy-acong nginx]# vi Dockerfile # This is My first Dockerfile # Version 1.0 # Author: zhangcong # Email: zc_92@sina.com # 基礎鏡像 FROM centos:6.6 # 維護者信息 MAINTAINER zhangcong zc_92@sina.com # 將 Dockerfile 文件當前目錄下的 nginx-1.10.3.tar.gz 拷貝至 容器中的 /usr/local/src/ ADD nginx-1.10.3.tar.gz /usr/local/src/ # 在容器中執行命令 RUN yum install -y wget gcc pcre pcre-devel openssl-devel RUN useradd nginx -s /sbin/nologin -M # 在容器中切換路徑 WORKDIR /usr/local/src/nginx-1.10.3 # RUN RUN ./configure --user=nginx --group=nginx --prefix=/data/application/nginx-1.10.3 --with-http_stub_status_module --with-http_ssl_module && make && make install RUN ln -s /data/application/nginx-1.10.3/ /etc/nginx RUN ln -s /data/application/nginx-1.10.3/sbin/nginx /usr/local/sbin/ RUN echo "daemon off;" >> /etc/nginx/conf/nginx.conf # 在容器中修改環境變量 ENV PATH /data/application/nginx-1.10.3/sbin/:$PATH # 容器暴露的端口號 EXPOSE 80 # 容器啓動時執行的命令 CMD ["nginx"]
# 建議存放 Dockerfile 文件的目錄不要有子目錄,由於 docker build 會去查找指定目錄下面的子目錄中是否存在 Dockerfile 文件 [root@crazy-acong nginx]# docker build -t dockerfile_centos6.6_nginx:v1 /opt/docker-file/nginx/ [root@crazy-acong nginx]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE dockerfile_centos6.6_nginx v1 df047bf77a2c 52 seconds ago 443.8 MB # 這個就是剛纔經過 Dockerfile 建立的容器 centos6.6_nginx v1 aa4b2a57b43e About an hour ago 446.2 MB centos 6.6 d0d663863c34 7 months ago 202.6 MB hub.c.163.com/library/centos centos6.6 d0d663863c34 7 months ago 202.6 MB
[root@crazy-acong nginx]# docker run -it -d -P dockerfile_centos6.6_nginx:v1 [root@crazy-acong nginx]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9e7249dba1a dockerfile_centos6.6_nginx:v1 "nginx" 3 seconds ago Up 2 seconds 0.0.0.0:4000->80/tcp compassionate_mayer 46a2ec546a50 aa4b2a57b43e "/etc/nginx/sbin/ngi 57 minutes ago Up 57 minutes 0.0.0.0:80->80/tcp berserk_mayer 225084efe2fb centos:6.6 "/bin/bash" About an hour ago Up About an hour angry_davinci [root@crazy-acong nginx]# curl 127.0.0.1:4000 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>