实验所涉内容
- Docker 概述
- 部署 docker 容器虚拟化平台
- docker 平台基本使用方法
- 创建docker镜像和发布镜像方法
- 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 下载下来的软件包,可以保存到本地,方便后期使用 :
/etc/yum.conf
改: 3 keepcache=0
为: 3 keepcache=1
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、 创建工作目彔
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
例: 使用导入本地镜像:
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 注册一个帐号
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
**************************************************************************************************