【linxu】部署docker容器虛擬化平臺

實驗所涉內容

  1. Docker 概述
  2. 部署 docker 容器虛擬化平臺
  3. docker 平臺基本使用方法
  4. 建立docker鏡像和發佈鏡像方法
  5. Container 容器端口映射

一 Docker 概述

  • Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口(相似 iPhone的app)。幾乎沒有性能開銷,能夠徆容易地在機器和數據中心中運行。最重要的是,他們不依賴於任何語言、框架或包裝系統。
  • Docker 是 dotCloud 公司開源的一個基於 LXC 的高級容器引擎,源代碼託管在 Github 上, 基於 go 語言並聽從 Apache2.0 協議開源。Docker 讓開發者能夠打包他們的應用以及依賴包到一個可移植的 container 中,而後發佈到任何流行的Linux 機器上。
  • 擴展:1. LXC 爲 Linux Container 的簡寫。 Linux Container 容器是一種內核虛擬化技術,能夠提供輕量級的虛 擬化,以便隔離進程和資源,並且不須要提供指令解釋機制以及全虛擬化的其餘複雜性。2. LXC 主要經過來自 kernel 的 namespace 實現每一個用戶實例之間的相互隔離,經過 cgroup 實現對資源的配額和度量。
  • 官方網站:https://www.docker.com/
  
  • 源代碼下載:https://github.com/docker/docker
  
  • docker 容器技術和虛擬機對比
  相同點: docker 容器技術和虛擬機技術,都是虛擬化技術。 
        
  總結:docker 相對於 VM 虛擬機,少了虛擬機操做系統這一層,因此 docker 效率比虛擬機高。你的物理系統啓勱使用幾秒?10 秒  而在 docker 上啓勱一個實例 1-2 秒 
  •  Docker 架構
    
(1)工做流程:服務器 A 上運行 docker Engine 服務,在 docker Engine 上啓動不少容器 container , 從外網 Docker Hub 上把 image 操做系統鏡像下載下來,放到 container 容器運行。這樣一個容器的實例就運行起來了。最後,經過 Docker client 對   docker 容器虛擬化平臺進行控制。
(2)dockerhub:dockerhub 是 docker 官方的鏡像存儲站點,其中提供了不少經常使用的鏡像供用戶下載,如ubuntu, centos 等系統鏡像。經過 dockerhub 用戶也能夠發佈本身的 docker 鏡像,爲此用戶須要註冊一個帳號,在網站上建立一個 docker 倉庫。
  • Docker 核心技術
  Namespace — 實現 Container 的進程、網絡、消息、文件系統和主機名的隔離。
  Cgroup — 實現對資源的配額和度量。注:Cgroup 的配額,能夠指定實例使用的 cpu 個數,內存大小等。
  • Docker 特性
  1.文件系統隔離:每一個進程容器運行在一個徹底獨立的根文件系統裏。
  2.資源隔離:系統資源,像 CPU 和內存等能夠分配到不一樣的容器中,使用 cgroup。
  3.網絡隔離:每一個進程容器運行在本身的網絡空間,虛擬接口和 IP 地址。
  4.日誌記彔:Docker 將會收集和記彔每一個進程容器的標準流(stdout/stderr/stdin),用於實時檢索或批量檢索。
  5.變動管理:容器文件系統的變動能夠提交到新的鏡像中,並可重複使用以建立更多的容器。無需使用模板或手動配置。
  6.交互式 shell:Docker 能夠分配一個虛擬終端並關聯到任何容器的標準輸入上,例如運行一個一次性交互shell。
  • Docker優
  1.一些優點和 VM 同樣,但不是全部都同樣。
  比 VM 小,比 VM 快,Docker 容器的尺寸減少相比整個虛擬機大大簡化了分佈到雲和從雲分發時間和開銷。 Docker 啓勱一個容器實例時間很短,一兩秒就能夠啓勱一個實例。
  2.對於在筆記本電腦,數據中心的虛擬機,以及任何的雲上,運行相同的沒有變化的應用程序,IT 的發佈速度更快。Docker 是一個開放的平臺,構建,發佈和運行分佈式應用程序。Docker 使應用程序可以快速從組件組裝和避免開發和生產環境之間的摩擦。
  3.您能夠在部署在公司局域網戒雲戒虛擬機上使用它。
  4.開發人員並不關心具體哪一個 Linux 操做系統使用 Docker,開發人員能夠根據全部依賴關係構建相應的軟件,針對他們所選擇的操做系統。而後,在部署時一切是徹底同樣的,由於一切都在 DockerImage 的容器在其上運行。開發人員負責而且可以確保全部的相關性獲得知足。
  5.Google,微軟,亞馬遜,IBM 等都支持 Docker。
  6.Docker 支持 Unix/Linux 操做系統,也支持 Windows 戒 Mac
  
  缺點侷限性:
  1.Docker 用於應用程序時是最有用的,但並不包含數據。日誌,跟蹤和數據庫等一般應放在 Docker 容器外。 一個容器的鏡像一般都很小,不適合存大量數據,存儲能夠經過外部掛載的方式使用。好比使用:NFS,  ipsan,MFS 等。一句話:docker 只用於計算,存儲交給別人。

二 部署 docker 容器虛擬化平臺

       注: 想使用此 docker yum 源,須要使用 RHEL7.3 版本之後系統。 
  • 初始環境:RHEL7.4 64 位,虛擬機可上外網(NAT模式),ip爲192.168.10.1/24,默認yum源不用配置:
 1 [base]  2 name=CentOS-$releasever - Base  3 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
 4 #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
 5 gpgcheck=1
 6 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 7 
 8 #released updates  9 [updates] 10 name=CentOS-$releasever - Updates 11 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
12 #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
13 gpgcheck=1
14 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
15 
16 #additional packages that may be useful 17 [extras] 18 name=CentOS-$releasever - Extras 19 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
20 #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
21 gpgcheck=1
22 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
23 
24 #additional packages that extend functionality of existing packages 25 [centosplus] 26 name=CentOS-$releasever - Plus 27 mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
28 #baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
29 gpgcheck=1
30 enabled=0
31 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 
  •  安裝docker服務
  注意:將 yum 下載下來的軟件包,能夠保存到本地,方便後期使用 :
  [root@foryou ~]# vim /etc/yum.conf
  改: 3 keepcache=0
  爲: 3 keepcache=1
  [root@foryou ~]# yum -y install docker(通常不會出現問題)
  
  • 查看rpm軟件下載後的存放位置:
1 [root@foryou ~]# ls /var/cache/yum/x86_64/7/extras/packages/
2 container-selinux-2.66-1.el7.noarch.rpm                     oci-register-machine-0-6.git2b44233.el7.x86_64.rpm 3 container-storage-setup-0.10.0-1.gitdf0dcd5.el7.noarch.rpm  oci-systemd-hook-0.1.16-1.git05bd9a0.el7.x86_64.rpm 4 docker-1.13.1-68.gitdded712.el7.centos.x86_64.rpm           oci-umount-2.3.3-3.gite3c9055.el7.x86_64.rpm 5 docker-client-1.13.1-68.gitdded712.el7.centos.x86_64.rpm    skopeo-containers-0.1.31-1.dev.gitae64ff7.el7.centos.x86_64.rpm 6 docker-common-1.13.1-68.gitdded712.el7.centos.x86_64.rpm 7 [root@foryou ~]# ls /var/cache/yum/x86_64/7/extras/packages/ | wc -l 8 9
  • 開啓路由轉發功能,不然容器中的實例上不了網:
1 [root@foryou ~]# vim /etc/sysctl.conf #在文件最後添加,以一下紅色標記內容 2 net.ipv4.ip_forward = 1
3 [root@foryou ~]# sysctl -p #使用配置生效 4 net.ipv4.ip_forward = 1
5 [root@foryou ~]# /etc/init.d/network restart # 重啓網絡使其生效 6 Restarting network (via systemctl): [ OK ] 7 [root@foryou ~]# cat /proc/sys/net/ipv4/ip_forward #查看 8 1
  • 啓動docker平臺
1 [root@foryou ~]# systemctl start docker # 啓動docker服務 2 [root@foryou ~]# systemctl enable docker # 設置開機啓動docker服務 3 Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. 4 [root@foryou ~]# docker version  # 顯示docker版本信息
  • 查看 docker 信息(確認服務運行)顯示 Docker 系統信息,包括鏡像和容器數。
 1 [root@foryou ~]# docker info  2 Containers: 0
 3  Running: 0
 4  Paused: 0
 5  Stopped: 0
 6 Images: 0
 7 Server Version: 1.13.1
 8 Storage Driver: overlay2  9  Backing Filesystem: xfs # 文件系統爲xfs 10  Supports d_type: true
11  Native Overlay Diff: true
12 Logging Driver: journald 13 Cgroup Driver: systemd 14 Plugins: 15  Volume: local 16  Network: bridge host macvlan null overlay 17 Swarm: inactive 18 Runtimes: docker-runc runc 19 Default Runtime: docker-runc 20 Init Binary: /usr/libexec/docker/docker-init-current 21 containerd version: (expected: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1) 22 runc version: 5eda6f6fd0c2884c2c8e78a6e7119e8d0ecedb77 (expected: 9df8b306d01f59d3a8029be411de015b7304dd8f) 23 init version: fec3683b971d9c3ef73f284f176672c44b448662 (expected: 949e6facb77383876aeff8a6944dde66b3089574) 24 Security Options: 25  seccomp 26   WARNING: You're not using the default seccomp profile
27   Profile: /etc/docker/seccomp.json 28  selinux 29 Kernel Version: 3.10.0-693.el7.x86_64 30 Operating System: CentOS Linux 7 (Core) 31 OSType: linux 32 Architecture: x86_64 33 Number of Docker Hooks: 3
34 CPUs: 1
35 Total Memory: 976.3 MiB 36 Name: foryou 37 ID: PDBR:ERBZ:UNRZ:Y7K7:6KIJ:42WU:SXPE:3CBU:CKYV:UFRA:636A:3FBJ 38 Docker Root Dir: /var/lib/docker 39 Debug Mode (client): false
40 Debug Mode (server): false
41 Registry: https://index.docker.io/v1/
42 Experimental: false
43 Insecure Registries: 44  127.0.0.0/8
45 Live Restore Enabled: false
46 Registries: docker.io (secure)
View Code
  • 搜索 images
 1 [root@foryou ~]# docker search centos #從 Docker Hub 中搜索符合條件的鏡像。  2 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED  3 docker.io   docker.io/centos                             The official build of CentOS.                   4529 [OK]  4 docker.io   docker.io/ansible/centos7-ansible            Ansible on Centos7                              114 [OK]  5 docker.io   docker.io/jdeathe/centos-ssh                 CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x8...   98 [OK]  6 docker.io   docker.io/consol/centos-xfce-vnc             Centos container with "headless" VNC sessi...   58 [OK]  7 docker.io   docker.io/imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              44 [OK]  8 docker.io   docker.io/tutum/centos                       Simple CentOS docker image with SSH access      43                   
 9 docker.io   docker.io/centos/mysql-57-centos7            MySQL 5.7 SQL database server                   35                   
10 docker.io   docker.io/gluster/gluster-centos             Official GlusterFS Image [ CentOS-7 +  Glu...   31 [OK] 11 docker.io   docker.io/openshift/base-centos7             A Centos7 derived base image for Source-To...   30                   
12 docker.io   docker.io/centos/python-35-centos7           Platform for building and running Python 3...   27                   
13 docker.io   docker.io/centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relationa...   24                   
14 docker.io   docker.io/kinogmt/centos-ssh                 CentOS with SSH                                 21 [OK] 15 docker.io   docker.io/openshift/jenkins-2-centos7        A Centos7 based Jenkins v2.x image for use...   14                   
16 docker.io   docker.io/centos/httpd-24-centos7            Platform for running Apache httpd 2.4 or b...   13                   
17 docker.io   docker.io/openshift/mysql-55-centos7         DEPRECATED: A Centos7 based MySQL v5.5 ima...   6                    
18 docker.io   docker.io/pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag nam...   6                    
19 docker.io   docker.io/openshift/jenkins-1-centos7        DEPRECATED: A Centos7 based Jenkins v1.x i...   4                    
20 docker.io   docker.io/darksheer/centos                   Base Centos Image -- Updated hourly             3 [OK] 21 docker.io   docker.io/openshift/wildfly-101-centos7      A Centos7 based WildFly v10.1 image for us...   3                    
22 docker.io   docker.io/pivotaldata/centos                 Base centos, freshened up a little with a ...   2                    
23 docker.io   docker.io/blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1 [OK] 24 docker.io   docker.io/pivotaldata/centos-mingw           Using the mingw toolchain to cross-compile...   1                    
25 docker.io   docker.io/jameseckersall/sonarr-centos       Sonarr on CentOS 7                              0 [OK] 26 docker.io   docker.io/pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated ...   0                    
27 docker.io   docker.io/smartentry/centos                  centos with smartentry                          0 [OK] 28 [root@foryou ~]# 
View Code
方法 1:從公網 docker hub 拉取(下載)image pull:拉
1 [root@foryou ~]# docker pull centos 2 Using default tag: latest 3 Trying to pull repository docker.io/library/centos ... 4 latest: Pulling from docker.io/library/centos 5 7dc0dca2b151: Pull complete 6 Digest: sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322 7 Status: Downloaded newer image for docker.io/centos:latest
注意:若果報錯的話,多是因爲網絡問題,沒法鏈接到dockerhub下載鏡像。
解決辦法:換一個docker下載地址;
1 [root@foryou ~]# vim /etc/docker/daemon.json # 修改如下內容: 2  改{}: 3  爲: 4 { 5     'registry-mirrors':['https://docker.mirrors.ustc.deu.cn'] 6 }
方法 2:把以前下載好的 image 鏡像導入 image:
把 centos-latest-docker-image.tar 鏡像上傳到 linux 上
參數: -i " centos-latest-docker-image.tar "指定載入的鏡像歸檔。
1 [root@foryou ~]# docker load -i /root/centos-latest-docker-image.tar
  • 查看 images 列表
1 [root@foryou ~]# docker images 2 REPOSITORY TAG IMAGE ID CREATED SIZE 3 docker.io/centos    latest              49f7960eb7e4        2 months ago        200 MB
注:Docker 的鏡像以及一些數據都是在/var/lib/docker 目彔下
 1 [root@foryou ~]# du -sh /var/lib/docker/*
 2 0 /var/lib/docker/containers  3 652K /var/lib/docker/image  4 32K /var/lib/docker/network  5 208M /var/lib/docker/overlay2  6 0 /var/lib/docker/plugins  7 0 /var/lib/docker/swarm  8 0 /var/lib/docker/tmp  9 0 /var/lib/docker/trust 10 24K /var/lib/docker/volumes

三 docker 平臺基本使用方法

例 1:運行一個 container 並加載鏡像 centos,運行起來這個實例後,在實例中執行 /bin/bash 命令
docker 經常使用參數:
run 運行
-i 以交互模式運行容器,一般與 -t 同時使用;
-t 爲容器從新分配一個僞輸入終端,一般與 -i 同時使用;
 1 [root@foryou overlay2]# docker images # 查看鏡像  2 REPOSITORY TAG IMAGE ID CREATED SIZE  3 docker.io/centos    latest              49f7960eb7e4        2 months ago        200 MB  4 [root@foryou overlay2]# docker run -it docker.io/centos:latest  /bin/bash  5 [root@5c28682aa834 /]# ls # 查看實例環境  6 bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
 7 [root@5c28682aa834 /]# cat /etc/centos-release  8 CentOS Linux release 7.5.1804 (Core)  9 [root@5c28682aa834 /]# exit # 注意:退出容器 10 exit 11 [root@foryou overlay2]# 
 例 2:在 container 中啓勱一個長久運行的進程,不斷向 stdin 輸出 foryouzxl
docker 經常使用參數:
-d 後臺運行容器,並返回容器 ID;
-c 後面跟待完成的命令
1 [root@foryou overlay2]# JOB=$(docker run -d docker.io/centos:latest /bin/bash -c "while true;do echo foryouzxl;sleep 1;done") 2 [root@foryou overlay2]# echo $JOB # 變量IOB中存放着Name/ID 3 4b5068f11f3e2626506deb2c414bf37a3d2261961081ac536f31ef0ffc58f608
  • 從一個容器中取日誌,查看輸出的內容
  語法: docker logs 容器實例的 Name/ID
1 [root@foryou overlay2]# docker logs 4b5068f11f 2 foryouzxl 3 foryouzxl 4 foryouzxl 5 ……
  • 查看正在運行的容器:
1 [root@foryou overlay2]# docker ps #列出全部運行中容器。 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3 4b5068f11f3e        docker.io/centos:latest   "/bin/bash -c 'whi..."   4 minutes ago       Up 4 minutes dreamy_tesla 4 [root@foryou overlay2]# docker ps -a # -a 列出全部容器(包含沉睡/退出狀態的容器); 5 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6 4b5068f11f3e        docker.io/centos:latest   "/bin/bash -c 'whi..."   5 minutes ago       Up 5 minutes dreamy_tesla 7 5c28682aa834        docker.io/centos:latest   "/bin/bash"              11 minutes ago      Exited (0) 11 minutes ago laughing_fermi 8 [root@foryou overlay2]# 
也可使用短 ID 或 docker 實例的名字查看日誌輸出:
1 root@foryou overlay2]# docker logs dreamy_tesla 2 或者 3 [root@foryou overlay2]# docker logs 4b5068f11f
例 3:殺死一個容器。 好比:殺死一個正在後臺運行的容器
查看要殺死容器的 ID
1 [root@foryou overlay2]# docker ps -a 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3 4b5068f11f3e        docker.io/centos:latest   "/bin/bash -c 'whi..."   9 minutes ago       Up 9 minutes dreamy_tesla 4 5c28682aa834        docker.io/centos:latest   "/bin/bash"              16 minutes ago      Exited (0) 16 minutes ago                       laughing_fermi
殺死 ID 爲4b5068f11f3e 的容器:
1 [root@foryou overlay2]# docker kill 4b5068f11f3e 2 4b5068f11f3e 3 或者 4 [root@foryou overlay2]# docker kill $JOB
查看結果:
1 [root@foryou overlay2]# docker ps -a 2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3 4b5068f11f3e        docker.io/centos:latest   "/bin/bash -c 'whi..."   12 minutes ago      Exited (137) About a minute ago dreamy_tesla 4 5c28682aa834        docker.io/centos:latest   "/bin/bash"              19 minutes ago      Exited (0) 19 minutes ago                             laughing_fermi
例 4:啓勱、中止、重啓 container 容器實例
 1 # 啓動一個實例 啓動:run #建立並運行docker實例  2 [root@foryou overlay2]# JOB=$(docker run -d docker.io/centos:latest /bin/bash -c "while true;do echo lovezxl;sleep 1;done")  3 [root@foryou overlay2]# echo $JOB  4 c40ed75378a89b79d9bf5418ef799b22c76c2ec46a1fff4bda84a7d56ce2d97e  5 [root@foryou overlay2]# docker ps  6 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES  7 c40ed75378a8        docker.io/centos:latest   "/bin/bash -c 'whi..."   18 seconds ago      Up 18 seconds xenodochial_varahamihira  8 [root@foryou overlay2]# docker stop c40ed75378a8 # 中止一個實例  9 c40ed75378a8 10 [root@foryou overlay2]# docker ps -a 11 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 12 c40ed75378a8        docker.io/centos:latest   "/bin/bash -c 'whi..."   About a minute ago   Exited (137) 7 seconds ago xenodochial_varahamihira 13 4b5068f11f3e        docker.io/centos:latest   "/bin/bash -c 'whi..."   16 minutes ago       Exited (137) 5 minutes ago dreamy_tesla 14 5c28682aa834        docker.io/centos:latest   "/bin/bash"              23 minutes ago       Exited (0) 22 minutes ago laughing_fermi 15 [root@foryou overlay2]# docker start c40ed75378a8 # 啓動一個實例 16 c40ed75378a8 17 [root@foryou overlay2]# docker ps -a 18 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 19 c40ed75378a8        docker.io/centos:latest   "/bin/bash -c 'whi..."   About a minute ago   Up 3 seconds xenodochial_varahamihira 20 4b5068f11f3e        docker.io/centos:latest   "/bin/bash -c 'whi..."   17 minutes ago       Exited (137) 5 minutes ago dreamy_tesla 21 5c28682aa834        docker.io/centos:latest   "/bin/bash"              23 minutes ago       Exited (0) 23 minutes ago laughing_fermi 22 [root@foryou overlay2]# docker restart c40ed75378a8 # 重啓一個實例 23 c40ed75378a8 24 [root@foryou overlay2]# docker ps -a 25 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 26 c40ed75378a8        docker.io/centos:latest   "/bin/bash -c 'whi..."   2 minutes ago       Up 4 seconds xenodochial_varahamihira 27 4b5068f11f3e        docker.io/centos:latest   "/bin/bash -c 'whi..."   17 minutes ago      Exited (137) 6 minutes ago dreamy_tesla 28 5c28682aa834        docker.io/centos:latest   "/bin/bash"              24 minutes ago      Exited (0) 23 minutes ago                        laughing_fermi
View Code
刪除容器實例:rm
1 [root@foryou overlay2]# docker rm -f c40ed75378a8 2 c40ed75378a8 3 [root@foryou overlay2]# docker ps -a 4 CONTAINER ID IMAGE COMMAND CREATED STATUS 5 4b5068f11f3e        docker.io/centos:latest   "/bin/bash -c 'whi..."   22 minutes ago      Exited (137) 10 mi 6 5c28682aa834        docker.io/centos:latest   "/bin/bash"              28 minutes ago      Exited (0) 28 minu
注意:你能夠先把容器實例 關閉,而後再刪除或加-f 強制刪除

四 建立docker鏡像和發佈鏡像方法

方法 1:docker commit #保存 container 的當前狀態到 image 後,而後生成對應的 image
方法 2:docker build #使用 Dockerfile 文件自動化製做 image
 
方法 1:docker commit
建立一個安裝好 apache工具的容器鏡像:
1 [root@foryou overlay2]# docker run -it centos /bin/bash 2 [root@cd65e6d76036 /]# yum -y install httpd #在 container 中安裝 apache 軟件包 3 …… 4 Complete!
查看鏡像列表:(注:當前只有一個 image centos)
1 [root@foryou overlay2]# docker images 2 REPOSITORY TAG IMAGE ID CREATED SIZE 3 docker.io/centos    latest              49f7960eb7e4        2 months ago        200 MB
根據容器當前狀態作一個 image 鏡像:建立一個安裝了 apache工具的 centos 鏡像
語法: docker commit <container 的 ID> <image_name>
例:
查看容器 ID:
 1 [root@foryou overlay2]# docker ps -a  2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES  3 cd65e6d76036        centos                    "/bin/bash"              4 minutes ago       Exited (0) About a minute ago wizardly_davinci  4 4b5068f11f3e        docker.io/centos:latest   "/bin/bash -c 'whi..."   35 minutes ago      Exited (137) 24 minutes ago dreamy_tesla  5 5c28682aa834        docker.io/centos:latest   "/bin/bash"              42 minutes ago      Exited (0) 41 minutes ago laughing_fermi  6 [root@foryou overlay2]# docker commit cd65e6d76036 centos:apache  7 sha256:7ca4fb9d37b045798f635056adb08c38cffed250a8ed2554e7eca5f9b52c0dc0  8 [root@foryou overlay2]# docker images  9 REPOSITORY TAG IMAGE ID CREATED SIZE 10 centos              apache              7ca4fb9d37b0        19 seconds ago      319 MB 11 docker.io/centos    latest              49f7960eb7e4        2 months ago        200 MB
使用新建立的 centos:apache 鏡像,生成一臺容器實例:
1 [root@foryou overlay2]# docker run -it centos:apache /bin/bash 2 [root@2d7f99899a9f /]# rpm -qa httpd #已經安裝好 apache命令 3 httpd-2.4.6-80.el7.centos.1.x86_64 4 [root@2d7f99899a9f /]# 5 注:說明基於 apache鏡像的容器建立成功。
方法二:經過:docker build 建立一個基於 centos 的 httpd web 服務器鏡像。
嘗試第二種建立 docker image 方法:建立 docker build #使用 Dockerfile 自動化製做 image
注:Dockerfile 有點像源碼編譯時./configure 後產生的 Makefile
如下操做要在 docker 物理機上操做:
一、 建立工做目彔
1 [root@2d7f99899a9f /]# mkdir /docker-build 2 [root@2d7f99899a9f /]# cd !$ 3 cd /docker-build 4 [root@2d7f99899a9f docker-build]# touch Dockerfile 5 [root@2d7f99899a9f docker-build]# 6 注: make 自動化編譯時須要 Makefile 文件,自動化建立 docker 鏡像時,須要 Dockerfile
二、 編輯 Dockerfile
Dockerfile 用來建立一個自定義的 image,包含了用戶指定的軟件依賴等。
1 [root@2d7f99899a9f docker-build]# vi Dockerfile 2 FROM centos 3 MAINTAINER <hg@foryou.com>
4 RUN yum -y install httpd 5 ADD start.sh /usr/local/bin/start.sh 6 ADD index.html /var/www/html/index.html
註釋:
FROM centos # FROM 基於哪一個鏡像
MAINTAINER <hg@foryou.com> # MAINTAINER 鏡像建立者
RUN yum -y install httpd #RUN 安裝軟件用
ADD start.sh /usr/local/bin/start.sh
ADD index.html /var/www/html/index.html
# ADD 將文件<src>拷貝到新產生的鏡像的文件系統對應的路徑<dest>。 全部拷貝到新鏡像中的文件
和文件夾權限爲 0755,uid 和 gid 爲 0
三、 建立 start.sh 腳本啓動 httpd 服務和 apache 默認首頁 index.html 文件
 1 [root@2d7f99899a9f docker-build]# echo "/usr/sbin/httpd -DFORCEGROUND" > start.sh  2 [root@2d7f99899a9f docker-build]# ls  3 Dockerfile start.sh  4 [root@2d7f99899a9f docker-build]# chmod a+x start.sh  5 注:/usr/sbin/httpd -DFOREGROUND 至關於執行了 systemctl start httpd  6 建立 index.html  7 [root@2d7f99899a9f docker-build]# echo "docker image build test" > index.html  8 [root@2d7f99899a9f docker-build]# ls  9 Dockerfile index.html start.sh 10 [root@2d7f99899a9f docker-build]# chmod a+x index.html 11 [root@2d7f99899a9f docker-build]# 
四、 使用命令 build 來建立新的 image
語法:docker build -t 父鏡像名:本身定義的鏡像名 Dockerfile 文件所在路徑
-t :表示 tage,鏡像名
 1 [root@foryou docker-build]# docker build -t centos:httpd ./
 2 Sending build context to Docker daemon 4.096 kB  3 Step 1/5 : FROM centos  4  ---> 49f7960eb7e4  5 Step 2/5 : MAINTAINER <hg@foryou.com>
 6  ---> Running in fde5a706d822  7  ---> e1a79980083b  8 Removing intermediate container fde5a706d822  9 Step 3/5 : RUN yum -y install httpd 10  ---> Running in e50882f46945 11  ---> e6ad6ba7471a 12 Removing intermediate container e50882f46945 13 Step 4/5 : ADD start.sh /usr/local/bin/start.sh 14  ---> ae384e75f303 15 Removing intermediate container c340a156939f 16 Step 5/5 : ADD index.html /var/www/html/index.html 17  ---> 98af80c193da 18 Removing intermediate container fde9a4c41a2c 19 Successfully built 98af80c193da 20 [root@foryou docker-build]# 
查看images列表:
1 [root@foryou ~]# docker images 2 REPOSITORY TAG IMAGE ID CREATED SIZE 3 centos              httpd               98af80c193da        About a minute ago   319 MB 4 centos              apache              7ca4fb9d37b0        43 minutes ago       319 MB 5 docker.io/centos    latest              49f7960eb7e4        2 months ago         200 MB 6 注:docker 鏡像=應用/程序+庫
  • Docker Image 的發佈:    
方法 1:Save Image To TarBall
方法 2:Push Image To Docker Hub
 
方法 1:Save Image To TarBall
保存 Image 到 tar 包
語法:docker save -o 導出的鏡像名.tar 本地鏡像名:鏡像標籤
例:
1 [root@foryou docker-build]# docker save -o centos7.4-httpd-docker-image.tar centos:httpd 2 [root@foryou docker-build]# ls # 查看導出成功 3 centos7.4-httpd-docker-image.tar  Dockerfile  index.html  start.sh
例: 使用導入本地鏡像:
 1 [root@foryou docker-build]# docker images #查看目前存在的鏡像爲3個  2 REPOSITORY TAG IMAGE ID CREATED SIZE  3 centos              httpd               98af80c193da        14 minutes ago      319 MB  4 centos              apache              7ca4fb9d37b0        56 minutes ago      319 MB  5 docker.io/centos    latest              49f7960eb7e4        2 months ago        200 MB  6 [root@foryou docker-build]# docker rmi centos:httpd # 先刪除本地docker鏡像,再導入:  7 Untagged: centos:httpd  8 Deleted: sha256:98af80c193da2361e45e1009aa258c7b88d0f4e508257825d0cec058c58f3357  9 Deleted: sha256:6f60d1fb621514bfb0996de921b6f4be58b5c6b1bf2d4f5bc1fd9c87da57b7b6 10 Deleted: sha256:ae384e75f303e82332d6fad55ea3e92377c0ecf4b3fbedaac55866683200660e 11 Deleted: sha256:b2bf86c2aba2e34cb4d9024af24e292695a2a3b54f641ce0113f3a5b199ecf94 12 Deleted: sha256:e6ad6ba7471a1e2621d1d7a42726dc024f2570fb9a7ff1e3c79dc3bf7750dfeb 13 Deleted: sha256:cb8e35f16eb44743ae67862df17775579ef12dd73e1e1945f9096b180aa11377 14 Deleted: sha256:e1a79980083b62c6b82cfd1723ad159dbbee9a5ed82efb59b8b5c4a60734a839 15 [root@foryou docker-build]# docker images 16 REPOSITORY TAG IMAGE ID CREATED SIZE 17 centos              apache              7ca4fb9d37b0        56 minutes ago      319 MB 18 docker.io/centos    latest              49f7960eb7e4        2 months ago        200 MB 19 [root@foryou docker-build]# docker load -i centos7.4-httpd-docker-image.tar 20 20d32b6c5508: Loading layer 120.3 MB/120.3 MB 21 d0cc030e6789: Loading layer 3.584 kB/3.584 kB 22 6799305b3e81: Loading layer 3.584 kB/3.584 kB 23 Loaded image: centos:httpd 24 [root@foryou docker-build]# docker images 25 REPOSITORY TAG IMAGE ID CREATED SIZE 26 centos              httpd               98af80c193da        15 minutes ago      319 MB 27 centos              apache              7ca4fb9d37b0        57 minutes ago      319 MB 28 docker.io/centos    latest              49f7960eb7e4        2 months ago        200 MB
View Code
方法 2:Push Image To Docker Hub 發佈到外網(國外的網站)--也能夠利用阿里雲的docker倉庫
一、 Signup on docker hub & create repo 註冊一個賬號
https://hub.docker.com/
二、 Login to docker hub
# docker login -u userabc -p abc123 -e userab@gmail.com
三、 Push image to docker hub #上傳鏡像
# docker push centos:httpd
四、 Pull image from docker hub #下載鏡像
# docker pull userabc/centos:httpd
用戶名/鏡像名

五 Container 容器端口映射

啓動container:
1 [root@foryou docker-build]# docker run -d -p 9000:80 centos:httpd /bin/bash -c /usr/local/bin/start.sh 2 8ad27fc50c16b84f51739b7f467c94555343f793409605188819c6ddf81edd48 3 注: -p 9000:80 把容器中的 80 端口映射到物理機上的 9000 端口
查看物理機和容器的網絡:
查看容器的IP:
1 [root@foryou docker-build]# docker run -it centos /bin/bash 2 [root@7a04ac0dcac7 /]# yum install net-tools -y 3 [root@7a04ac0dcac7 /]# ifconfig 4 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
5         inet 172.17.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
物理機的IP:
 1 [root@foryou ~]# ifconfig  2 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500 # 注:至關於虛擬機的 NAT 網絡模式  3         inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
 4         inet6 fe80::42:75ff:fed2:5eb6  prefixlen 64  scopeid 0x20<link>
 5         ether 02:42:75:d2:5e:b6  txqueuelen 0 (Ethernet)  6         RX packets 25519  bytes 1036458 (1012.1 KiB)  7         RX errors 0  dropped 0  overruns 0  frame 0
 8         TX packets 37131  bytes 86561010 (82.5 MiB)  9         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
10 
11 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
12         inet 192.168.10.1  netmask 255.255.255.0  broadcast 192.168.10.255
測試網絡:
1 [root@7a04ac0dcac7 /]# route -n 2 Kernel IP routing table 3 Destination Gateway Genmask Flags Metric Ref Use Iface 4 0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0 5 172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0 6 [root@7a04ac0dcac7 /]# ping 192.168.10.1
7 PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data. 8 64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.068 ms 9 64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.101 ms
 The end!
**************************************************************************************************
                                                        Good lucky to you
**************************************************************************************************
相關文章
相關標籤/搜索