Docker容器
一、Docker的核心概念及安裝
1、核心概念
1、鏡像:類似虛擬機的快照,一個鏡像是一個完整的操作系統,屬於只讀的
2、容器:從鏡像創建的運行實例,可以被啓動、停止、刪除
3、倉庫:存儲鏡像的地方
2、安裝Docker
1、當連接到互聯網時安裝Docker,安裝完成後啓動Docker並設置爲開機自動啓動
yum -y install docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
2、通過檢查Docker版本可以查看Docker服務
[root@localhost ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-109.gitcccb291.el7.centos.x86_64
Go version: go1.10.3
Git commit: cccb291/1.13.1
Built: Tue Mar 3 17:21:24 2020
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-109.gitcccb291.el7.centos.x86_64
Go version: go1.10.3
Git commit: cccb291/1.13.1
Built: Tue Mar 3 17:21:24 2020
OS/Arch: linux/amd64
Experimental: false
二、Docker鏡像操作
1、搜索鏡像
[root@localhost ~]# docker search dhcp //dhcp爲關鍵字,可替換
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/networkboot/dhcpd Suitable for running a DHCP server for you... 46 [OK]
docker.io docker.io/joebiellik/dhcpd DHCP server running on Alpine Linux 17 [OK]
2、獲取鏡像
[root@localhost ~]# docker pull docker.io/networkboot/dhcpd
Using default tag: latest
Trying to pull repository docker.io/networkboot/dhcpd ...
latest: Pulling from docker.io/networkboot/dhcpd
898c46f3b1a1: Pull complete
63366dfa0a50: Pull complete
041d4cd74a92: Pull complete
6e1bee0f8701: Pull complete
114483241095: Pull complete
ef446bdcb1f0: Pull complete
Digest: sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b670477
Status: Downloaded newer image for docker.io/networkboot/dhcpd:latest
當出現以下情況時表示無法連接到docker鏡像庫
[root@localhost ~]# docker pull docker.io/networkboot/dhcpd
Using default tag: latest
Trying to pull repository docker.io/networkboot/dhcpd ...
Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
[root@localhost ~]# docker pull docker.io/networkboot/dhcpd
Using default tag: latest
Trying to pull repository docker.io/networkboot/dhcpd ...
Get https://registry-1.docker.io/v2/networkboot/dhcpd/manifests/latest: Get https://auth.docker.io/token?scope=repository%3Anetworkboot%2Fdhcpd%3Apull&service=registry.docker.io: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
解決辦法如下
[root@localhost ~]vim /etc/docker/daemon.json
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
Docker 官方中國區:https://registry.docker-cn.com
網易:http://hub-mirror.c.163.com
中國科技大學:https://docker.mirrors.ustc.edu.cn
阿里雲:https://12azv802.mirror.aliyuncs.com(本人加速器地址)
3、查看鏡像信息
[root@localhost ~]# docker images //查看本地所有鏡像,添加倉庫名稱:[標籤]時爲指定鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
dhcp dhcp 52cbff801df2 13 months ago 105 MB
docker.io/networkboot/dhcpd latest 52cbff801df2 13 months ago 105 MB
REPOSITORY:鏡像屬於的倉庫。
TAG:鏡像的標籤信息,標記同—個倉庫中的不同鏡像。
IMAGE ID:鏡像的唯一ID號,唯一標識了該鏡像。
CREATED:鏡像創建時間 。
VIRTUAL SIZE:鏡像大小。
獲取鏡像的詳細信息
[root@localhost ~]# docker inspect 52cbff801df2
爲本地鏡像添加新的名稱爲dhcp,新的標籤爲dhcp
[root@localhost ~]# docker tag docker.io/networkboot/dhcpd dhcp:dhcp
[root@localhost ~]# docker images | grep dhcp
dhcp dhcp 52cbff801df2 13 months ago 105 MB
docker.io/networkboot/dhcpd latest 52cbff801df2 13 months ago 105 MB
4、刪除鏡像
刪除掉 dhcp:dhcp 鏡像
[root@localhost ~]# docker rmi dhcp:dhcp
Untagged: dhcp:dhcp
Untagged: docker.io/networkboot/dhcpd@sha256:fdc7ff6f265249a104f32f1d7aed0aedaf2f2fc62ea10eebf596e2af3b670477
當使用docker rmi命令後面跟上鏡像的ID號時,必須確保該鏡像沒有被容器使用才能進行,刪除時系統會先刪除掉所有指向該鏡像的標籤,然後刪除該鏡像文件本身。如果該鏡像已經被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像。
5、存出鏡像和載入鏡像
1、存出本地的docker.io/networkboot/dhcpd鏡像爲文件dhcp
[root@localhost ~]# docker save -o dhcp docker.io/networkboot/dhcpd
[root@localhost ~]# ls -l dhcp
-rw-------. 1 root root 107891712 4月 20 13:37 dhcp
文件dhcp中載入鏡像到本地鏡像庫中
[root@localhost ~]# docker load --input dhcp
Loaded image: docker.io/networkboot/dhcpd:latest
或者
[root@localhost ~]# docker load < dhcp
也可從本地光盤中導入
[root@localhost ~]# docker load --input /media/dhcp
6、上傳鏡像
[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: gyf
Password:
Login Succeeded
[root@localhost ~]# docker push docker.io/networkboot/dhcpd
三、Docker容器操作
1、容器的創建與啓動
1、 新建一個容器
[root@localhost ~]# docker create -it docker.io/networkboot/dhcpd /bin/bash
da070a247dd43d4a60884a41917ab37a30f73ba4d912bc5401361575eec3aa76
2、列出系統最近—次啓動的容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
da070a247dd4 docker.io/networkboot/dhcpd "/entrypoint.sh /b..." About a minute ago Created elegant_allen
創建容器命令報錯時解決辦法如下
[root@localhost ~]# docker run dhcp:dhcp /bin/bash
WARNING: IPv4 forwarding is disabled. Networking will not work.
[root@localhost ~]# vim /usr/lib/sysctl.d/00-system.conf //添加以下內容
net.ipv4.ip_forward=1
[root@localhost ~]# systemctl restart network
3、啓動停止狀態的容器
[root@localhost ~]# docker start da070a247dd4
da070a247dd4
[root@localhost ~]# docker ps -a | grep da070a247dd4
da070a247dd4 docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 3 minutes ago Up 12 seconds elegant_allen
4、創建容器並啓動執行—條shell命令
[root@localhost ~]# docker run docker.io/networkboot/dhcpd /bin/bash -c ls
bin
boot
dev
entrypoint.sh
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
5、使容器持續在後臺進行運行
[root@localhost ~]# docker run -d docker.io/networkboot/dhcpd /bin/bash -c "while true;do echo ok;done;"
6c01602b498fca7c52b68af11f3815567cb13855284f756b499f2ef99710dd65
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c01602b498f docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 7 seconds ago Up 6 seconds pensive_hugle
e44cac0111e8 docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 2 minutes ago Exited (0) About a minute ago hopeful_hodgkin
da070a247dd4 docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 7 minutes ago Up 4 minutes elegant_allen
2、容器的運行與終止
1、終止運行容器
[root@localhost ~]# docker stop 6c01602b498f
6c01602b498f
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c01602b498f docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 2 minutes ago Exited (143) 6 seconds ago pensive_hugle
e44cac0111e8 docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 4 minutes ago Exited (0) 4 minutes ago hopeful_hodgkin
da070a247dd4 docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 9 minutes ago Up 6 minutes elegant_allen
3、容器的進入
1、正在運行着的容器da070a247dd4
[root@localhost ~]# docker exec -it da070a247dd4 /bin/bash
root@da070a247dd4:/# ls
bin dev etc lib media opt root sbin sys usr
boot entrypoint.sh home lib64 mnt proc run srv tmp var
root@da070a247dd4:/# exit
exit
4、容器的導出與導入
1、導出6c01602b498f容器到文件centos7dhcp
[root@localhost ~]# docker export 6c01602b498f>centos7dhcp
[root@localhost ~]# ls -l centos7dhcp
-rw-r--r--. 1 root root 87825920 4月 20 15:45 centos7dhcp
2、導入文件centos7dhcp成爲本地鏡像
[root@localhost ~]# cat centos7dhcp | docker import - centos7:dhcp
sha256:78ff8fd42b571a62ab970710326ec18fd287203a184f0b01135d01c67bffbc1d
[root@localhost ~]# docker images | grep centos7
centos7 dhcp 78ff8fd42b57 16 seconds ago 84.7 MB
3、容器的刪除
[root@localhost ~]# docker stop da070a247dd4
da070a247dd4
[root@localhost ~]# docker rm da070a247dd4 //如果刪除一個正在運行的容器,可以添加-f選項強制刪除,但是建議先將容器停止再做刪除操作
da070a247dd4
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c01602b498f docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 10 minutes ago Exited (143) 7 minutes ago pensive_hugle
e44cac0111e8 docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 12 minutes ago Exited (0) 12 minutes ago hopeful_hodgkin
四、Docker資源控制
1、對CPU的控制
1、限制CPU使用速率(運行中)
將容器6c01602b498f的CPU使用設置爲20000, 設置CPU的使用率限定爲20%
[root@localhost ~]# echo 20000 > /sys/fs/cgroup/cpu/system.slice/docker-6c01602b498fca7c52b68af11f3815567cb13855284f756b499f2ef99710dd65.scope/cpu.cfs_quota_us
2、多任務按比例分享CPU
運行3個新建容器A,B,C,佔用CPU資源的比例爲1:1:2(25%:25%:50%)
[root@localhost ~]# docker images //查看標籤
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 dhcp 78ff8fd42b57 44 hours ago 84.7 MB
dhcp dhcp 52cbff801df2 13 months ago 105 MB
docker.io/networkboot/dhcpd latest 52cbff801df2 13 months ago 105 MB
[root@localhost ~]# docker run -tid --cpu-shares 2024 dhcp:dhcp /bin/bash //不限於一個鏡像
9fb21227e5878f02b157c1eef1ac85553cf58f2f005e9627194ed787c5875d66
[root@localhost ~]# docker run -tid --cpu-shares 1024 dhcp:dhcp /bin/bash
083da644f2268218561492cc04a3c46129bba91307cebe70106d26f31cdcd77b
[root@localhost ~]# docker run -tid --cpu-shares 2048 dhcp:dhcp /bin/bash
d63c6513ee2e4633e7c171691c910b128fda92da4acf66719b311a4694732612
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d63c6513ee2e dhcp:dhcp "/entrypoint.sh /b..." 4 seconds ago Up 3 seconds sad_shirley
083da644f226 dhcp:dhcp "/entrypoint.sh /b..." 17 seconds ago Up 15 seconds boring_poincare
9fb21227e587 dhcp:dhcp "/entrypoint.sh /b..." About a minute ago Up About a minute determined_darwin
3、限制CPU內核使用
使新建容器綁定第1-2的內核使用,CPU編號爲0-15
[root@localhost ~]# docker run -tid --cpuset-cpus 0,1 docker.io/networkboot/dhcpd /bin/bash
a94cd15806774333fccbbd2b6b6d03325965287938e2e30a3ef51b2beac2fc13
2、對內存使用的限制
—旦容器Cgroup使用的內存超過了限制的容量,Linux內核將會嘗試收回這些內存,如果仍舊沒法控制使用內存在限制範圍之內,進程就會被殺死。
限制新建容器的內存上限爲 512MB
[root@localhost ~]# docker run -tid -m 512MB dhcp:dhcp
f708e0d599606750bde50af156d2604c62d18334faa02a5853d484f7dc8d1f11
3、對blkio的限制
限制新建容器的/dev/sda的寫入速度爲1MB(只能限制設備而不能限制分區)
[root@localhost ~]# docker run -tid --device-write-bps /dev/sda:1MB docker.io/networkboot/dhcpd /bin/bash
705efbd862724c4d8ca943e1a86f5a47ce1021a5e8edf90d7abbedad1ec36e01
–device-read-bps選項可以限制讀取的速度
–device-write-tops 選項可以限制指定設備的寫入速度
五、Docker鏡像的創建方法
1、基於已有鏡像創建
啓動一個鏡像,使用docker commit命令創建—個新的鏡像
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08122cdeb56c dhcp:dhcp "/entrypoint.sh /b..." 29 seconds ago Up 28 seconds wizardly_kare
6c01602b498f docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 2 days ago Up 4 hours pensive_hugle
[root@localhost ~]# docker commit -m "newdhcp" -a "zhangsan" 08122cdeb56c docker:mydhcp //創建一個由張三的人,信息爲newdhcp,名稱標籤爲docker:mydhcp的鏡像
sha256:4c38cf009f5d3a97888f2c273a3199dbe771ebe27afa7f98f53d038d2beb9329
[root@localhost ~]# docker images | grep docker //新創建鏡像的ID信息
docker mydhcp 4c38cf009f5d 5 minutes ago 105 MB
2、基於本地模板創建
通過導入操作系統模板文件可以生成鏡像模板,可以從OPENVZ開源項目下載,下載地址爲https://wiki.openvz.org/Download/template/precreated
[root@localhost ~]# wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
--2020-04-22 16:46:01-- http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz
正在解析主機 download.openvz.org (download.openvz.org)... 185.231.241.69
正在連接 download.openvz.org (download.openvz.org)|185.231.241.69|:80... 已連接。
已發出 HTTP 請求,正在等待迴應... 200 OK
長度:78421150 (75M) [application/x-gzip]
正在保存至: “ubuntu-14.04-x86_64-minimal.tar.gz”
100%[====================================================================>] 78,421,150 172KB/s 用時 4m 46s
2020-04-22 16:50:51 (267 KB/s) - 已保存 “ubuntu-14.04-x86_64-minimal.tar.gz” [78421150/78421150])
[root@localhost ~]# cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - daoke:new //導入爲本地鏡像,名爲daoke:new
sha256:641362b013d6ebf773c1e71173d37da3f80fca9226a7080b7317a9e97f06aa23
查看新創建的鏡像信息
[root@localhost ~]# docker images | grep new
daoke new 641362b013d6 2 minutes ago 215 MB
3、基於Dockerfile創建
1、建立工作目錄
[root@localhost ~]# mkdir apache
[root@localhost ~]# cd apache/
2、創建並編寫Dockerfile文件
[root@localhost apache]# vim Dockerfile
FROM centos //基於的基礎鏡像centos
MAINTAINER The CentOS Project <[email protected]> //維護該鏡像的用戶信息
RUN yum -y update //鏡像操作指令安裝apache軟件包
RUN yum -y install httpd
EXPOSE 80 //開啓80端口
ADD index.html /var/www/html/index.html //複製網站首頁文件
ADD run.sh /run.sh //將執行腳本複製到鏡像中
RUN chmod 775 /run.sh //
RUN systemctl disable httpd //設置apache服務不自行啓動
CMD ["/run.sh"] //啓動容器時執行腳本
此Dockerfile文件使用的基礎鏡像是centos,所以要保證首先獲取此基礎鏡像,之後的容器運行時纔會有效
[root@localhost apache]# docker pull docker.io/centos
3、編寫執行腳本內容
[root@localhost apache]# vim run.sh
#!/in/bash
rm -rf /run/httpd/* //清理httpd的緩存
exec /usr/sbin/apachectl -D FOREGROUND //啓動apache服務
4、創建測試頁面
[root@localhost apache]# echo "douying" > index.html
[root@localhost apache]# ls
Dockerfile index.html run.sh
5、使用Dockerfile生成鏡像
[root@localhost apache]# docker build -t httpd:centos .
注意:在自動生成鏡像的命令指定鏡像後,一定不要忘記寫新生成鏡像的存放路徑,也就是空格後的 一 個“.”代表當前路徑,否則會報錯。
6、使用新的鏡像運行容器
[root@localhost apache]# docker run -d -p 12345:80 httpd:centos //—p選項實現從本地端口12345到容器中80端口的映射
8de72ce1adb9cf3264711b5f926f1e50f57cf4ba7ea5e21aee9a91a6d1250441
[root@localhost apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8de72ce1adb9 httpd:centos "/run.sh" 9 seconds ago Up 9 seconds 0.0.0.0:12345->80/tcp lucid_allen
7、將鏡像上傳到倉庫中(搭建本地私有倉庫)
(1)在構建私有倉庫的服務器上下載registry鏡像
[root@localhost ~]# docker pull registry
Using default tag: latest
Trying to pull repository docker.io/library/registry ...
latest: Pulling from docker.io/library/registry
486039affc0a: Pull complete
ba51a3b098e6: Pull complete
8bb4c43d6c8e: Pull complete
6f5f453e5f2d: Pull complete
42bc10b72f42: Pull complete
Digest: sha256:7d081088e4bfd632a88e3f3bcd9e007ef44a796fddfe3261407a3f9f04abe1e7
Status: Downloaded newer image for docker.io/registry:latest
(2)修改Docker配置文件指定私有倉庫URL
[root@localhost ~]# vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false' //修改此行爲以下內容
OPTIONS='--selinux-enabled --insecure-registry=192.168.1.10:5000' //其中192.168.1.10的IP地址是作爲私有倉庫服務器的IP地址
[root@localhost ~]# systemctl restart docker
(3)在本地啓動一個私有倉庫服務,監聽端口號爲5000,倉庫存放於容器內的/tmp/registry目錄,-v選項是將本地目錄掛載到容器內的/tmp/registry目錄下使用
[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
59e040bbe11fe568b9dbaeb90ec75a7b13c54ace072e7317f44c6157ab03bc4f
(4)使用dockertag命令將要上傳的鏡像docke.io/registry標記爲192.1681.10:5000/registry
[root@localhost ~]# docker tag docker.io/registry 192.168.1.10:5000/registry
用 docker push上傳標記的鏡像
[root@localhost ~]# docker push 192.168.1.10:5000/registry
The push refers to a repository [192.168.1.10:5000/registry]
a330d9dc14ce: Pushed
588f0b714a86: Pushed
c62467775792: Pushed
9d08b7a37338: Pushed
7444ea29e45e: Pushed
latest: digest: sha256:3a8eef8d0a818b9bbb4bd17667253473e2d99935ccbbd37649af6bcaa064cf0d size: 1363
[root@localhost ~]# curl -XGET http://192.168.1.10:5000/v2/_catalog //查看上傳的鏡像
{"repositories":["registry"]}
[root@localhost ~]# curl -XGET http://192.168.1.10:5000/v2/registry/tags/list //查看上傳鏡像的標籤名(registry)
{"name":"registry","tags":["latest"]}
六、Docker的數據管理
1、數據卷
數據卷是—個供容器使用的特殊目錄,位於容器中,可將宿主機的目錄掛載到數據捲上,對數據卷的修改操作立刻可見,並且更新數據不會影響鏡像,從而實現數據在宿主機與容器之間的遷移。
1、創建數據卷
使用httpd:centos鏡像創建一個名爲web的容器,並且創建兩個數據卷分別掛載到/data1與/data2目錄上
[root@localhost ~]# docker run -d -v /data1 -v /data2 --name web httpd:centos
e22993d06f0d2569dfd480e97286392266cae1939faf190c96e21d72be8e1402
[root@localhost ~]# docker exec -it web /bin/bash
[root@e22993d06f0d /]# ls -l
total 4
lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x. 2 root root 6 Apr 22 10:42 data1
drwxr-xr-x. 2 root root 6 Apr 22 10:42 data2
(略)
2、掛載主機目錄作爲數據卷
使用httpd:centos鏡像創建—個名爲web-1的容器,並且將宿主機的/var/www目錄掛載到容器的/data1目錄上
[root@localhost ~]# docker run -d -v /var/www:/data1 --name web-1 httpd:centos
ceb1279525868772f4181a3f1dcf0004ae7683b3748d53101650b44fda709b4a
[root@localhost ~]# cd /var/www/
[root@localhost www]# touch file
[root@localhost www]# ls
file
[root@localhost www]# docker exec -it web-1 /bin/bash
[root@ceb127952586 /]# ls
bin dev home lib64 media opt root run.sh srv tmp var
data1 etc lib lost+found mnt proc run sbin sys usr
[root@ceb127952586 /]# cd data1/
[root@ceb127952586 data1]# ls
file
2、數據卷容器
數據卷容器就是—個普通的容器,專門提供數據卷給其他容器掛載使用。(容器之間數據共享)
掛載web容器中的數據捲到新的容器,新的容器名爲db1
[root@localhost ~]# docker run -it --volumes-from web --name db1 httpd:centos /bin/bash
[root@a4997e4cb855 /]# ls
bin data2 etc lib lost+found mnt proc run sbin sys usr
data1 dev home lib64 media opt root run.sh srv tmp var
[root@a4997e4cb855 /]# cd data1 //在db1容器數據卷/data1目錄中創建一個文件file
[root@a4997e4cb855 data1]# touch file
[root@a4997e4cb855 data1]# ls
file
[root@a4997e4cb855 data1]# exit
exit
[root@localhost ~]# docker exec -it web /bin/bash //進入web容器
[root@e22993d06f0d /]# cd data1 //查看data1文件夾
[root@e22993d06f0d data1]# ls
file
七、Docker網絡通信
1、端口映射
[root@localhost ~]# docker run -d -P httpd:centos //-P(大寫)選項實現隨機映射,端口範圍在49000-49900(不是絕對)的端口到容器內部開放的網絡端口
[root@localhost ~]# docker ps -a
47415562cd00 httpd:centos "/run.sh" 6 minutes ago Up 6 minutes 0.0.0.0:32768->80/tcp unruffled_edison
6c01602b498f docker.io/networkboot/dhcpd "/entrypoint.sh /b..." 2 days ago Exited (143) 3 hours ago
[root@localhost ~]# docker run -d -p 49888:80 httpd:centos //-p(小寫)選項實現指定要映射的端口
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f7caeaddb45d httpd:centos "/run.sh" 3 minutes ago Up 3 minutes 0.0.0.0:49888->80/tcp relaxed_goodall
2、容器互聯
容器互聯是通過容器的名稱在容器間建立—條專門的網絡通信隧道從而實現的互聯。
1、創建源容器
建立容器A,使用–name指定容器名稱爲web1。
[root@localhost ~]# docker run -d -P --name web1 httpd:centos
bc86037f1567cc5382592dee077c55219215b1549686982a4f5ae025ba23120d
2、創建接收容器
建立容器B,–name指定名稱爲web2,–link指定連接容器以實現容器互聯。
[root@localhost ~]# docker run -d -P --name web2 --link web1:web1 httpd:centos
fab341e4655f8353929b384e0cf3dd7fcf8db3b76e61c649b282dbc47f47ad36
3、測試容器互聯
[root@localhost ~]# docker exec -it web2 /bin/bash //進入容器
[root@fab341e4655f /]# ping web1
PING web1 (172.17.0.3) 56(84) bytes of data.
64 bytes from web1 (172.17.0.3): icmp_seq=1 ttl=64 time=0.092 ms
64 bytes from web1 (172.17.0.3): icmp_seq=2 ttl=64 time=0.121 ms
64 bytes from web1 (172.17.0.3): icmp_seq=3 ttl=64 time=0.118 ms
64 bytes from web1 (172.17.0.3): icmp_seq=4 ttl=64 time=0.139 ms
--- web1 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 9ms
rtt min/avg/max/mdev = 0.045/0.091/0.139/0.036 ms
八、構建Nginx容器
1、下載基礎鏡像
[root@localhost ~]# docker pull centos:7
Trying to pull repository docker.io/library/centos ...
7: Pulling from docker.io/library/centos
ab5ef0e58194: Pull complete
Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c
Status: Downloaded newer image for docker.io/centos:7
2、建立工作目錄
[root@localhost ~]# mkdir nginx
[root@localhost ~]# cd nginx/
3、創建並編寫Dockerfile文件
[root@localhost nginx]# vim Dockerfile
FROM centos:7 //設置基礎鏡像
MAINTAINER The CentOS Project <[email protected]> //維護該鏡像的用戶信息
RUN yum install -y wget proc-devel net-tools gcc zlib zlib-devel make openssl-devel //安裝相關依賴包
RUN wget http://nginx.org/download/nginx-1.9.7.tar.gz //下載並解壓Nginx源碼包
RUN tar zxf nginx-1.9.7.tar.gz
WORKDIR nginx-1.9.7
RUN ./configure --prefix=/usr/local/nginx && make && make install //編譯安裝nginx
EXPOSE 80 //開啓80和443端口
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf //修改Nginx配置文件,以非daemon方式啓動
WORKDIR /root/nginx
ADD run.sh /run.sh //複製服務啓動腳本並設置權限
RUN chmod 775 /run.sh
CMD ["/run.sh"] //啓動容器時執行腳本
4、編寫執行腳本內容
[root@localhost nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
5、生成鏡像
[root@localhost nginx]# docker build -t nginx:zhangsan .
6、啓動容器進行測試
[root@localhost nginx]# docker run -d -P nginx:zhangsan
1b959acb711d3f12bd42261b3b9c467e018137eed3c5550229b227b8e4901a7a
[root@localhost nginx]# docker ps -a //查看內部的80端口和443端口被分別映射到本地端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b959acb711d nginx:zhangsan "/run.sh" 5 seconds ago Up 4 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp elegant_williams
[root@localhost nginx]# firefox http://192.168.1.10:32769
九、構建Tomcat容器
1、創建工作目錄
[root@localhost ~]# mkdir tomcat
[root@localhost ~]# cd tomcat/
[root@localhost tomcat]# tar zxf jdk-8u91-linux-x64.tar.gz //把需要的jdk軟件包下載解壓到工作目錄
2、創建Dockerfile文件
[root@localhost tomcat]# vim Dockerfile
FROM centos:7 //維護該鏡像的用戶信息
MAINTAINER The CentOS Project <[email protected]>
ADD jdk1.8.0_91 /usr/local/jdk-8u91 //設置JDK環境變量
ENV JAVA_HOME /usr/local/jdk-8u91
ENV JAVA_BIN /usr/local/jdk-8u91/bin
ENV JRE_HOME /usr/local/jdk-8u91/jre
ENV PATH $PATH:/usr/local/jdk-8u91/bin:/usr/local/jdk-Bu91/jre/bin
ENV CLASSPATH /usr/local/jdk-8u91/jre/bin:/usr/local/jdk-8u91/lib:/usr/local/jdk-8u91/jre/lib/charsets.jar
RUN yum install -y wget //安裝wget工具
RUN wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.53/bin/apache-tomcat-8.5.53.tar.gz //下載tomcat軟件包
RUN tar zxf apache-tomcat-8.5.53.tar.gz //解壓tomcat並移動到相應位置
RUN mv apache-tomcat-8.5.53 /usr/local/tomcat
EXPOSE 8080 //開啓8080端口
ADD run.sh/ run.sh //啓動容器時添加並執行腳本
RUN chmod 775 /run.sh
CMD ["/run.sh"]
3、編寫執行腳本內容
[root@localhost tomcat]# vim run.sh
#!/bin/bash
/usr/local/tomcat/bin/startup.sh
tailf /run
4、用Dockerfile 生成鏡像
[root@localhost tomcat]# docker build -t tomcat:zhangsan .
5、運行容器並驗證
[root@localhost tomcat]# docker run -d --name zsTOMCAT -p 80:8080 tomcat:zhangsan //映射本地的80端口到容器的8080端口
9e1fdc4d3eb8420224f5481535c5ff1387a14a8a1abd700153c6ae48a3ad1303
[root@localhost tomcat]# firefox http://192.168.1.10:80
十、構建MySQL容器
1、下載基礎鏡像並創建工作目錄
[root@localhost ~]# docker pull docker.io/guyton/centos6
Using default tag: latest
Trying to pull repository docker.io/guyton/centos6 ...
latest: Pulling from docker.io/guyton/centos6
9bfcefca2b8d: Pull complete
2f8ef7dd23e9: Pull complete
07f137504b02: Pull complete
Digest: sha256:4d85869d301e1e04f9c71084726c1a6c4a5cb149d56c0ca130a27515094c7390
Status: Downloaded newer image for docker.io/guyton/centos6:latest
[root@localhost ~]# mkdir mysql
[root@localhost ~]# cd mysql/
2、創建Dockerfile文件
[root@localhost mysql]# vim Dockerfile
FROM guyton/centos6 //設置基礎鏡像
MAINTAINER The CentOS Project-MySQL [email protected] //維護該鏡像的用戶信息
RUN yum install -y mysql mysql-server //安裝mysql數據庫軟件包
RUN /etc/init.d/mysqld start &&\ //開啓mysql服務,並進行授權
mysql -e "grant all privileges on *. * to 'root'@'%' identified by '123456';"&&\
mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456';"
EXPOSE 3306 //開啓3306端口
CMD [ "mysqld_safe" ] //運行初始化腳本mysqld_safe
3、用Dockerfile生成鏡像
[root@localhost mysql]# docker build -t mysql:zhangsan .
4、運行容器並驗證
[root@localhost mysql]# docker run -d --name zhangsanSQL -P mysql:zhangsan //隨機映射木地的端口到容器的3306端口
3e909e376ff6460e63295cd8ee87b754c1db3d204ef3e202080c1935bb004717
[root@localhost mysql]# docker ps -a //查看本地映射的端口號
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e909e376ff6 mysql:zhangsan "mysqld_safe" 6 seconds ago Up 5 seconds 0.0.0.0:32770->3306/tcp zhangsanSQL
[root@localhost mysql]# yum -y install mysql //安裝mariaDB客戶端
已加載插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
正在解決依賴關係
--> 正在檢查事務
---> 軟件包 mariadb.x86_64.1.5.5.64-1.el7 將被 安裝
--> 解決依賴關係完成
依賴關係解決
================================================================================
Package 架構 版本 源 大小
================================================================================
正在安裝:
mariadb x86_64 1:5.5.64-1.el7 base 8.7 M
事務概要
================================================================================
安裝 1 軟件包
總下載量:8.7 M
安裝大小:49 M
Downloading packages:
mariadb-5.5.64-1.el7.x86_64.rpm | 8.7 MB 00:08
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安裝 : 1:mariadb-5.5.64-1.el7.x86_64 1/1
驗證中 : 1:mariadb-5.5.64-1.el7.x86_64 1/1
已安裝:
mariadb.x86_64 1:5.5.64-1.el7
完畢!
[root@localhost mysql]# mysql -h 192.168.1.10 -u root -P 32770 -p123456 //從本地主機登錄MySOL數據庫進行驗證
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.73 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.01 sec)
MySQL [(none)]> exit
Bye