安装软件

yum install docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm

systemctl start docker
状态信息
[root@foundation15 mnt]# docker  info
Containers: 2
 Running: 2
 Paused: 0
 Stopped: 0
Images: 2
Server Version: 17.03.1-ce
Storage Driver: overlay
 Backing Filesystem: xfs
 Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-514.el7.x86_64
Operating System: Red Hat Enterprise Linux Server 7.3 (Maipo)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.745 GiB
Name: foundation15.ilt.example.com
ID: K4NQ:2YBG:O3ER:GGOI:E6VP:6GUR:ORRF:GEPT:Y47X:XPJM:QIML:VKEI
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false


测试
导入本地镜像
docker  load  -i game2048.tar

创建容器使用镜像
docker run -d --name  vm1  game2048

这里写图片描述

**

基本操作指令

**


删除容器

[root@foundation15 mnt]# docker stop vm1
vm1
[root@foundation15 mnt]# docker rm vm1
vm1
[root@foundation15 mnt]# docker  inspect vm1
[]

常用命令

run 
   docker run :创建一个新的容器并运行一个命令
start/stop/restart
  docker start :启动一个或多少已经被停止的容器
  docker stop :停止一个运行中的容器
  docker restart :重启容器

kill

docker kill :杀掉一个运行中的容器。

rm

  docker rm :删除一个或多少容器
pause/unpause

  docker pause :暂停容器中所有的进程。

  docker unpause :恢复容器中所有的进程。

create

docker create :创建一个新的容器但不启动它

exec

 docker exec :在运行的容器中执行命令
容器操作

ps

  docker ps : 列出容器

inspect

  docker inspect : 获取容器/镜像的元数据。

top

  docker top :查看容器中运行的进程信息,支持 ps 命令参数。

attach

  docker attach :连接到正在运行中的容器。

events

  docker events : 从服务器获取实时事件

logs

  docker logs : 获取容器的日志

wait

  docker wait : 阻塞运行直到容器停止,然后打印出它的退出代码。

export

  docker export :将文件系统作为一个tar归档文件导出到STDOUT。

port

  docker port :列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。
容器rootfs命令

commit

  docker commit :从容器创建一个新的镜像。

cp

  docker cp :用于容器与主机之间的数据拷贝。

diff

  docker diff : 检查容器里文件结构的更改。
镜像仓库

login

  docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

  docker logout : 登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

pull

  docker pull : 从镜像仓库中拉取或者更新指定镜像

push

  docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

search

  docker search : 从Docker Hub查找镜像
本地镜像管理

images

  docker images : 列出本地镜像。

rmi

  docker rmi : 删除本地一个或多少镜像。

tag

  docker tag : 标记本地镜像,将其归入某一仓库。

build

  docker build : 使用Dockerfile创建镜像。

history

  docker history : 查看指定镜像的创建历史。

save

  docker save : 将指定镜像保存成 tar 归档文件。

import

  docker import : 从归档文件中创建镜像。

info|version

info

  docker info : 显示 Docker 系统信息,包括镜像和容器数。。

version

  docker version :显示 Docker 版本信息。
# 基本信息查看
docker version # 查看docker的版本号,包括客户端、服务端、依赖的Go等
docker info # 查看系统(docker)层面信息,包括管理的images, containers数等
docker pull centos 下载
docker images [ centos ] 查看
docker run -i -t centos /bin/bash

2、镜像的获取与容器的使用

# 搜索镜像
docker search <image> # 在docker index中搜索image
# 下载镜像
docker pull <image>  # 从docker registry server 中下拉image
# 查看镜像 
    docker images: # 列出images
    docker images -a # 列出所有的images(包含历史)
    docker rmi  <image ID>: # 删除一个或多个image

# 使用镜像创建容器
docker run -i -t sauloal/ubuntu14.04
docker run -i -t sauloal/ubuntu14.04 /bin/bash # 创建一个容器,让其中运行 bash 应用,退出后容器关闭
docker run -itd --name centos_aways --restart=always centos #创建一个名称centos_aways的容器,自动重启
# --restart参数:always始终重启;on-failure退出状态非0时重启;默认为,no不重启

# 查看容器
    docker ps :列出当前所有正在运行的container
    docker ps -l :列出最近一次启动的container
    docker ps -a :列出所有的container(包含历史,即运行过的container)
    docker ps -q :列出最近一次运行的container ID
# 再次启动容器
    docker start/stop/restart <container> #:开启/停止/重启container
    docker start [container_id] #:再次运行某个container (包括历史container)
#进入正在运行的docker容器
    docker exec -it [container_id] /bin/bash
    docker run -i -t -p <host_port:contain_port> #:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。

# 删除容器
    docker rm <container...> #:删除一个或多个container
    docker rm `docker ps -a -q` #:删除所有的container
    docker ps -a -q | xargs docker rm #:同上, 删除所有的container

docker run 和 docker create 参数基本一样,run是创建容器并后台启动,create是只创建容器。
docker run 相当于docker create 和 docker start

run创建容器:docker run -itd
create创建: docker create -it
    -t, --tty                       Allocate a pseudo-TTY
    -i, --interactive               Keep STDIN open even if not attached
    -d, --detach                    Run container in background and print container ID #run的参数

容器资源限制参数

-m 1024m --memory-swap=1024m  # 限制内存最大使用(bug:超过后进程被杀死)
--cpuset-cpus="0,1"           # 限制容器使用CPU

docker容器随系统自启参数

docker run –restart=always redis

no – 默认值,如果容器挂掉不自动重启
on-failure – 当容器以非 0 码退出时重启容器 
    同时可接受一个可选的最大重启次数参数 (e.g. on-failure:5).
always – 不管退出码是多少都要重启

docker run -itd --name test01 -p IP:sport:dport  -m 1024m --memory-swap=1024m --cpuset-cpus="0,1" --restart=always <image ID> 
docker exec -it test01 bash  # 进入容器也可以用exec命令

1
2

查看容器状态信息

[root@localhost ~]# docker stats 
[root@localhost ~]# docker stats --no-stream

一些使用技巧
docker文件存放目录

Docker实际上把所有东西都放到/var/lib/docker路径下了。

[root@localhost docker]# ls -F
containers/  devicemapper/  execdriver/  graph/  init/  linkgraph.db  repositories-devicemapper  volumes/

containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system layer)存放在graph/imageid/layer路径下,这样我们就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如何一层一层叠加起来的。


**

搭建阿里云容器仓库来下载镜像

**

这里写图片描述


vim  /etc/docker/daemon.json
{
  "registry-mirrors": ["https://go021fkd.mirror.aliyuncs.com"]
}


sudo systemctl daemon-reload
sudo systemctl restart docker

测试下载nginx
#######################################################
[root@foundation15 mnt]# docker  search  nginx
NAME                                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                                  Official build of Nginx.                        9307      [OK]       
jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1385                 [OK]
richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable ...   609                  [OK]
jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as...   396                  [OK]
kong                                                   Open-source Microservice & API Management ...   215       [OK]       
webdevops/php-nginx                                    Nginx with PHP-FPM                              111                  [OK]
kitematic/hello-world-nginx                            A light-weight nginx container that demons...   108                  
zabbix/zabbix-web-nginx-mysql                          Zabbix frontend based on Nginx web-server ...   62                   [OK]
bitnami/nginx                                          Bitnami nginx Docker Image                      57                   [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          43                   [OK]
linuxserver/nginx                                      An Nginx container, brought to you by Linu...   38                   
tobi312/rpi-nginx                                      NGINX on Raspberry Pi / armhf                   20                   [OK]
blacklabelops/nginx                                    Dockerized Nginx Reverse Proxy Server.          12                   [OK]
nginxdemos/nginx-ingress                               NGINX Ingress Controller for Kubernetes . ...   11                   
wodby/drupal-nginx                                     Nginx for Drupal container image                10                   [OK]
webdevops/nginx                                        Nginx container                                 8                    [OK]
nginxdemos/hello                                       NGINX webserver that serves a simple page ...   8                    [OK]
centos/nginx-18-centos7                                Platform for running nginx 1.8 or building...   7                    
centos/nginx-112-centos7                               Platform for running nginx 1.12 or buildin...   4                    
1science/nginx                                         Nginx Docker images that include Consul Te...   4                    [OK]
pebbletech/nginx-proxy                                 nginx-proxy sets up a container running ng...   2                    [OK]
travix/nginx                                           NGinx reverse proxy                             1                    [OK]
toccoag/openshift-nginx                                Nginx reverse proxy for Nice running on sa...   1                    [OK]
ansibleplaybookbundle/nginx-apb                        An APB to deploy NGINX                          0                    [OK]
mailu/nginx                                            Mailu nginx frontend                            0                    [OK]
[root@foundation15 mnt]# docker pull  nginx
Using default tag: latest
latest: Pulling from library/nginx
be8881be8156: Pull complete 
32d9726baeef: Pull complete 
87e5e6f71297: Pull complete 
Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
Status: Downloaded newer image for nginx:latest

**

挂载本地目录到容器

**

docker run -it --name vm1 -v /tmp/data1:/data1 -v  /tmp/data2:/data2:ro  -v /etc/yum.repos.d/yum.repo:/etc/yum.reporo  rhel7  bash

bash-4.2# cd /data
data1/ data2/ 
bash-4.2# cd /data1
bash-4.2# ls
bash-4.2# cd ..
bash-4.2# cd  data2
bash-4.2# touch  file
touch: cannot touch 'file': Read-only file system
bash-4.2# cd  /etc/yum.repo
yum.repo/    yum.repos.d/ 
bash-4.2# cd  /etc/yum.repo/         
bash-4.2# ls
yum.repo




这种方式比较麻烦 可以制作一个公共的挂载容器来让其他容器使用
###################################################################
[root@foundation15 mnt]# docker create  --name datavol -v /tmp/data1:/data1 -v  /tmp/data2:/data2:ro  -v /etc/yum.repos.d/yum.repo:/etc/yum.repo/yum.repo:ro  rhel7  bash


[root@foundation15 mnt]# docker  ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
ae88e068bfb4        rhel7               "bash"                   9 seconds ago       Created                                     datavol

其他容器使用功用容器来实现挂载

[root@foundation15 mnt]# docker  run -it --name vm1 --volumes-from  datavol rhel7 bash

bash-4.2# cd  /data2
bash-4.2# touch  filke
touch: cannot touch 'filke': Read-only file system
bash-4.2# cat  /etc/yum.repo/yum.repo 
[source]
name=source7
baseurl=file:///home/kiosk/Desktop/ipython
gpgcheck=0

[source7.3]
name=source7.3
baseurl=file:///mnt/rhel7
gpgcheck=0
bash-4.2# 


**

数据备份

**

[root@foundation15 mnt]# docker  run  --rm  -v  /tmp/backup:/backup  ubuntu tar  cf /backup/etc.tar   /etc
tar: Removing leading `/' from member names

[root@foundation15 mnt]# cd  /tmp/backup/
[root@foundation15 backup]# ls
etc.tar

**

docker的四种网络模式

**

Docker在创建容器时有四种网络模式,bridge为默认不需要用–net去指定,其他三种模式需要在创建容器时使用–net去指定。

bridge模式,使用–net=bridge指定,默认设置。
none模式,使用–net=none指定。
host模式,使用–net=host指定。
container模式,使用–net=container:容器名称或ID指定

bridge模式:docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。
none模式:此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。

host模式:此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。

container模式:此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。

docker网络初始化的过程如下:

初始化设备 —> 初始化bridge —> 初始化iptables —> 初始化ip foward(内核路由转发) — > register network job function —> end


桥接模式

在bridge模式下,连在同一网桥上的容器可以相互通信(如果为了安全考虑,也可以设置禁止它们通信),容器也可以与外部通信,数据包从容器出来,由于容器是桥接到docker0上,所以数据包会发到docker0上,查看iptables的策略,会发现有一个策略,将源地址从172.17.0.1的包进行源地址转换,转化成宿主机的网卡地址,(注意ip foward功能要开启)因此只要宿主机可以与外部通信,那么容器就可以与外部通信。

Bridge 桥接模式的实现步骤如下:

1 Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0和veth1。而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。

2 Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0

3 Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,该模式,Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

root@foundation6 ~]# docker run -d --name web1 nginx
90bf8ed3e5b93011d17ad3a8fe055858e75b16773de0f72dcf5c1519133a4d7c
 ##使用docker镜像nginx:latest 以  后台模式启动一个容器,并将容器命名为web1,-d打入后台,并返回容器ID,--name 指定容器名称
[root@foundation6 ~]# docker run -d --name web2 -p 8000:80 nginx
6b9a27a9a78b1f4276337776b3401f11f9b52eaa096fea673e67b4c7439bbc08
## 使用镜像nginx:latest以后台模式启动一个容器,将容器的80端口映射到宿主机的8080端口,即当访问宿主机的8000端口时会转到容器的80端口,也就是nginx的界面
-p进行了端口映射,将容器web2的80端口映射到宿主机的8000端口,进行完该操作查看iptables会发现多了一条策略
[root@foundation6 ~]# iptables -t nat -nL
....

DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:172.17.0.3:80

[root@foundation6 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
6b9a27a9a78b        nginx               "nginx -g 'daemon off"   7 seconds ago       Up 4 seconds        443/tcp, 0.0.0.0:8000->80/tcp   web2
90bf8ed3e5b9        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 5 minutes        80/tcp, 443/tcp                 web1

host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。当然,有这样的方便,肯定会损失部分其他的特性,最明显的是 Docker Container 网络环境隔离性的弱化,即容器不再拥有隔离、独立的网络栈。另外,使用 host 模式的 Docker Container 虽然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有所有的端口资源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网络模式容器的端口映射。

root@foundation6 ~]# docker run -it --name web4 --net host ubuntu
##使用镜像ubuntu以交互式运行一个容器,-i 指运行交互式,-t 为容器重新分配一个伪终端,--name 为容器指定名称为web4,--net指定容器的网络连接类型,这里指定的是host模式
root@foundation6:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
.......

[root@foundation6 ~]# docker exec web3 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever


##web3 和web4使用的是桥接模式,会直接使用宿主机的网络

none模式

网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。可以说 none 模式为 Docker Container 做了极少的网络设定,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。

在 none 网络模式下分配固定 ip:
netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。使用 netns 创建的网络空间独立于当前系统的网络空间,其中的网络设备以及 iptables 规则等都是独立的,就好像进入了另外一个网络一样。

搭建none模式

    docker run -it --name vm2 --net none ubuntu bash
    docker ps
    ip link add name veth2 type veth peer name veth3  创建 链接
    brctl addif docker0 veth2  (绑定网络一端)
    brctl show
    mkdir /var/run/netns
    docker inspect -f '{{.State.Pid}}' vm2##### 查看年vm2所对应的id
    ln -s /proc/13316/ns/net /var/run/netns/13316
    ip link set veth3 netns 13316  将vm2与网络绑定(容器绑定另一端)


#################################################################
容器内查看ip
root@67ea149b3c5e:/# ip addr
56: veth3@if57: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether fa:22:e8:08:c4:a7 brd ff:ff:ff:ff:ff:ff
#######################################################



######################################################################
ip netns exec 13316 ip link set veth1 name eth0(容器内改名)
root@67ea149b3c5e:/# ip addr
56: eth0@if57: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether fa:22:e8:08:c4:a7 brd ff:ff:ff:ff:ff:ff
##################################################################


    ip netns exec 13316 ip link set eth0 up(开启)


######################################################################
    ip netns exec 13316 ip addr add 172.17.0.100/24 dev eth0  (添加ip)

    root@67ea149b3c5e:/# ip addr
  56: eth0@if57: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue    state UP group default qlen 1000
    link/ether fa:22:e8:08:c4:a7 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.100/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f822:e8ff:fe08:c4a7/64 scope link 
       valid_lft forever preferred_lft forever




#################################################################3
    ip netns exec 13316 ip route add default via 172.17.0.1(设定网关)

root@67ea149b3c5e:/# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0


root@67ea149b3c5e:/# ping  172.25.15.250
\PING 172.25.15.250 (172.25.15.250) 56(84) bytes of data.
64 bytes from 172.25.15.250: icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from 172.25.15.250: icmp_seq=2 ttl=64 time=0.122 ms
64 bytes from 172.25.15.250: icmp_seq=3 ttl=64 time=0.124 ms
64 bytes from 172.25.15.250: icmp_seq=4 ttl=64 time=0.052 ms

root@67ea149b3c5e:/# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.099 ms
64 bytes from 172.17.0.1: icmp_seq=3 ttl=64 time=0.122 ms

ping   baidu测试  成功
root@67ea149b3c5e:/# ping  www.baidu.com
PING www.a.shifen.com (183.232.231.173) 56(84) bytes of data.
64 bytes from 183.232.231.173: icmp_seq=1 ttl=51 time=78.6 ms
64 bytes from 183.232.231.173: icmp_seq=2 ttl=51 time=73.3 ms
64 bytes from 183.232.231.173: icmp_seq=3 ttl=51 time=106 ms
64 bytes from 183.232.231.173: icmp_seq=4 ttl=51 time=71.9 ms
64 bytes from 183.232.231.173: icmp_seq=5 ttl=51 time=113 ms
64 bytes from 183.232.231.173: icmp_seq=6 ttl=51 time=126 ms


**

容器间互相连通

**

[root@foundation15 backup]# docker  run   -d --name vm1  -p 8080:80 nginx
2b1b00a4e6a7710a804a72ec459e064b6c01022acf20ec4524e51bb4bdc92f1d
[root@foundation15 backup]# docker  ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
2b1b00a4e6a7        nginx               "nginx -g 'daemon ..."   4 seconds ago       Up 3 seconds        0.0.0.0:8080->80/tcp   vm1

建立nginx容器   容器80与主机8080端口连通

##############################################################
查看iptable策略
[root@foundation15 backup]#  iptables -t nat  -nL

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.2:80
################################################################


#############################################################
建立第二个容器与nginx容器连通

[root@foundation15 backup]# docker run -it  --name  vm2  --link vm1:nginx  ubuntu


root@4dacb5da56e4:/# ping  nginx  测试是否连通
PING nginx (172.17.0.2) 56(84) bytes of data.
64 bytes from nginx (172.17.0.2): icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from nginx (172.17.0.2): icmp_seq=2 ttl=64 time=0.103 ms
^C
--- nginx ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.088/0.095/0.103/0.012 ms
##################################################################


**

自行搭建镜像

**

#################################################
[root@foundation15 backup]# docker run -it  --name  vm4 rhel7 bash

修改原有的rhel7  重新封装即可
添加yum文件
[source7.3]
name=source7.3
baseurl=http://172.25.15.250/rhel7
gpgcheck=0
下载httpd即可
######################################################


####################################################
在主机端  mkdir  /tmp/docker
编辑Dockerfile
FROM rhel7
ENV  HOSTNAME server1
EXPOSE  80
COPY  yum.repo  /etc/yum.repos.d/yum.repo
RUN rpmdb  --rebuilddb&& yum install  httpd  -y  &&yum clean all
VOLUME  ["/var/www/html"]
CMD  ["/usr/sbin/httpd", "-D", "FOREGROUND"]

###########################################################

在docker目录下同样创建yum文件即可
[root@foundation15 docker]# ls
Dockerfile  web  yum.repo
#################################################################

#############################################################3
开始build
[root@foundation15 docker]# docker  build  -t rhel7:v1 .
Sending build context to Docker daemon 4.608 kB
Step 1/7 : FROM rhel7
 ---> 0a3eb3fde7fd
Step 2/7 : ENV HOSTNAME server1
 ---> Using cache
 ---> 0e674bd2b30c
Step 3/7 : EXPOSE 80
 ---> Using cache
 ---> 23bbc5bd99d3
Step 4/7 : COPY yum.repo /etc/yum.repos.d/yum.repo
 ---> Using cache
 ---> 173d8ff79728
Step 5/7 : RUN rpmdb  --rebuilddb&& yum install  httpd  -y  &&yum clean all
 ---> Running in d0787ea709bc
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'

Complete!
Skipping unreadable repository '///etc/yum.repos.d/rhel7.repo'
Cleaning repos: source7.3
Cleaning up everything
 ---> 201102f566d3
Removing intermediate container d0787ea709bc
Step 6/7 : VOLUME /var/www/html
 ---> Running in d952d9958459
 ---> f8d6246b9dd6
Removing intermediate container d952d9958459
Step 7/7 : CMD /usr/sbin/httpd D FOREGROUND
 ---> Running in 52b72702ace2
 ---> 94788e1d8543
Removing intermediate container 52b72702ace2
Successfully built 94788e1d8543
[root@foundation15 docker]# docker  build  -t rhel7:v1 .
Sending build context to Docker daemon 4.608 kB
Step 1/7 : FROM rhel7
 ---> 0a3eb3fde7fd
Step 2/7 : ENV HOSTNAME server1
 ---> Using cache
 ---> 0e674bd2b30c
Step 3/7 : EXPOSE 80
 ---> Using cache
 ---> 23bbc5bd99d3
Step 4/7 : COPY yum.repo /etc/yum.repos.d/yum.repo
 ---> Using cache
 ---> 173d8ff79728
Step 5/7 : RUN rpmdb  --rebuilddb&& yum install  httpd  -y  &&yum clean all
 ---> Using cache
 ---> 201102f566d3
Step 6/7 : VOLUME /var/www/html
 ---> Using cache
 ---> f8d6246b9dd6
Step 7/7 : CMD /usr/sbin/httpd D FOREGROUND
 ---> Using cache
 ---> 94788e1d8543
Successfully built 94788e1d8543
##################################################################3
[root@foundation15 docker]# docker  images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rhel7               v1                  94788e1d8543        6 minutes ago  
成功


#####################################################################

#########################################################333
用镜像创建虚拟机
[root@foundation15 docker]# docker run  -d --name  vm6   rhel7:v1
def93d3cf90de7449bda256d9849016e61f3838c8acf19345d578d71fc07af2c
[root@foundation15 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
def93d3cf90d        rhel7:v1            "/usr/sbin/httpd -..."   3 seconds ago       Up 2 seconds        80/tcp              vm6
################################################################3
浏览器测试即可

这里写图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐