Linux操作技術文檔——Docker容器

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