linux docker的使用

安裝軟件

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
瀏覽器測試即可

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章