安裝軟件
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
瀏覽器測試即可