实验所涉内容


  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/

  

ping docker容器地址 docker容器平台_ping docker容器地址



  • 源代码下载:https://github.com/docker/docker

  

ping docker容器地址 docker容器平台_shell_02



  • docker 容器技术和虚拟机对比

  相同点: docker 容器技术和虚拟机技术,都是虚拟化技术。 

  

ping docker容器地址 docker容器平台_ping docker容器地址_03

      

  总结:docker 相对于 VM 虚拟机,少了虚拟机操作系统这一层,所以 docker 效率比虚拟机高。你的物理系统启劢使用几秒?10 秒  而在 docker 上启劢一个实例 1-2 秒 

  •  Docker 架构

  

ping docker容器地址 docker容器平台_操作系统_04

  

(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

  

ping docker容器地址 docker容器平台_ping docker容器地址_05


  缺点局限性:
  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 下载下来的软件包,可以保存到本地,方便后期使用 :


 /etc/yum.conf
  改: 3 keepcache=0
  为: 3 keepcache=1


 yum -y install docker(一般不会出现问题)


  

ping docker容器地址 docker容器平台_开发工具_06


  • 查看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版本信息


ping docker容器地址 docker容器平台_shell_07


  • 查看 docker 信息(确认服务运行)显示 Docker 系统信息,包括镜像和容器数。

ping docker容器地址 docker容器平台_shell_08

ping docker容器地址 docker容器平台_ping docker容器地址_09


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

ping docker容器地址 docker容器平台_shell_08

ping docker容器地址 docker容器平台_ping docker容器地址_09


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 容器实例

ping docker容器地址 docker容器平台_shell_08

ping docker容器地址 docker容器平台_ping docker容器地址_09


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、 创建工作目彔

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


2、 编辑 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


3、 创建 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]#


4、 使用命令 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

例: 使用导入本地镜像:


ping docker容器地址 docker容器平台_shell_08

ping docker容器地址 docker容器平台_ping docker容器地址_09


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仓库


1、 Signup on docker hub & create repo 注册一个帐号


https://hub.docker.com/


2、 Login to docker hub


# docker login -u userabc -p abc123 -e userab@gmail.com


3、 Push image to docker hub #上传镜像


# docker push centos:httpd


4、 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


**************************************************************************************************