<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Docker 入門萬字詳解!新手也能看懂!

          共 60475字,需瀏覽 121分鐘

           ·

          2024-06-22 22:32

          1.1 容器簡介

          1.1.1 什么是 Linux 容器

          Linux 容器是與系統(tǒng)其他部分隔離開的一系列進(jìn)程,從另一個鏡像運(yùn)行,并由該鏡像提供支持進(jìn)程所需的全部文件。容器提供的鏡像包含了應(yīng)用的所有依賴項(xiàng),因而在從開發(fā)到測試再到生產(chǎn)的整個過程中,它都具有可移植性和一致性。


          更加詳細(xì)地來說,請您假定您在開發(fā)一個應(yīng)用。您使用的是一臺筆記本電腦,而且您的開發(fā)環(huán)境具有特定的配置。其他開發(fā)人員身處的環(huán)境配置可能稍有不同。您正在開發(fā)的應(yīng)用依賴于您當(dāng)前的配置,還要依賴于某些特定文件。與此同時,您的企業(yè)還擁有標(biāo)準(zhǔn)化的測試和生產(chǎn)環(huán)境,且具有自身的配置和一系列支持文件。您希望盡可能多在本地模擬這些環(huán)境,而不產(chǎn)生重新創(chuàng)建服務(wù)器環(huán)境的開銷。

          因此,您要如何確保應(yīng)用能夠在這些環(huán)境中運(yùn)行和通過質(zhì)量檢測,并且在部署過程中不出現(xiàn)令人頭疼的問題,也無需重新編寫代碼和進(jìn)行故障修復(fù)?答案就是使用容器。容器可以確保您的應(yīng)用擁有必需的配置和文件,使得這些應(yīng)用能夠在從開發(fā)到測試、再到生產(chǎn)的整個流程中順利運(yùn)行,而不出現(xiàn)任何不良問題。這樣可以避免危機(jī),做到皆大歡喜。

          雖然這只是簡化的示例,但在需要很高的可移植性、可配置性和隔離的情況下,我們可以利用 Linux 容器通過很多方式解決難題。無論基礎(chǔ)架構(gòu)是在企業(yè)內(nèi)部還是在云端,或者混合使用兩者,容器都能滿足您的需求。

          1.1.2 容器不就是虛擬化嗎

          是,但也不竟然。我們用一種簡單方式來思考一下:

          虛擬化使得許多操作系統(tǒng)可同時在單個系統(tǒng)上運(yùn)行。

          容器則可共享同一個操作系統(tǒng)內(nèi)核,將應(yīng)用進(jìn)程與系統(tǒng)其他部分隔離開。


          圖 - 普通虛擬化技術(shù)和 Docker 的對比

          這意味著什么?首先,讓多個操作系統(tǒng)在單個虛擬機(jī)監(jiān)控程序上運(yùn)行以實(shí)現(xiàn)虛擬化,并不能達(dá)成和使用容器同等的輕量級效果。事實(shí)上,在僅擁有容量有限的有限資源時,您需要能夠可以進(jìn)行密集部署的輕量級應(yīng)用。Linux 容器可從單個操作系統(tǒng)運(yùn)行,在所有容器中共享該操作系統(tǒng),因此應(yīng)用和服務(wù)能夠保持輕量級,并行快速運(yùn)行。

          1.1.3 容器發(fā)展簡史


          我們現(xiàn)在稱為容器技術(shù)的概念最初出現(xiàn)在 2000 年,當(dāng)時稱為 FreeBSD jail,這種技術(shù)可將 FreeBSD 系統(tǒng)分區(qū)為多個子系統(tǒng)(也稱為 Jail)。Jail 是作為安全環(huán)境而開發(fā)的,系統(tǒng)管理員可與企業(yè)內(nèi)部或外部的多個用戶共享這些 Jail。

          Jail 的目的是讓進(jìn)程在經(jīng)過修改的 chroot 環(huán)境中創(chuàng)建,而不會脫離和影響整個系統(tǒng) — 在 chroot 環(huán)境中,對文件系統(tǒng)、網(wǎng)絡(luò)和用戶的訪問都實(shí)現(xiàn)了虛擬化。盡管 Jail 在實(shí)施方面存在局限性,但最終人們找到了脫離這種隔離環(huán)境的方法。

          但這個概念非常有吸引力。

          2001 年,通過 Jacques Gélinas 的 VServer 項(xiàng)目,隔離環(huán)境的實(shí)施進(jìn)入了 Linux 領(lǐng)域。正如 Gélinas 所說,這項(xiàng)工作的目的是“在高度獨(dú)立且安全的單一環(huán)境中運(yùn)行多個通用 Linux 服務(wù)器 [sic]。” 在完成了這項(xiàng)針對 Linux 中多個受控制用戶空間的基礎(chǔ)性工作后,Linux 容器開始逐漸成形并最終發(fā)展成了現(xiàn)在的模樣。

          1.2 什么是 Docker?

          “Docker” 一詞指代多種事物,包括開源社區(qū)項(xiàng)目、開源項(xiàng)目使用的工具、主導(dǎo)支持此類項(xiàng)目的公司 Docker Inc. 以及該公司官方支持的工具。技術(shù)產(chǎn)品和公司使用同一名稱,的確讓人有點(diǎn)困惑。

          我們來簡單說明一下:

          ??1. IT 軟件中所說的 “Docker” ,是指容器化技術(shù),用于支持創(chuàng)建和使用 Linux 容器。

          ?? 2.開源 Docker 社區(qū)致力于改進(jìn)這類技術(shù),并免費(fèi)提供給所有用戶,使之獲益。

          ?? 3.Docker Inc. 公司憑借 Docker 社區(qū)產(chǎn)品起家,它主要負(fù)責(zé)提升社區(qū)版本的安全性,并將改進(jìn)后的版本與更廣泛的技術(shù)社區(qū)分享。此外,它還專門對這些技術(shù)產(chǎn)品進(jìn)行完善和安全固化,以服務(wù)于企業(yè)客戶。

          借助 Docker ,您可將容器當(dāng)做重量輕、模塊化的虛擬機(jī)使用。同時,您還將獲得高度的靈活性,從而實(shí)現(xiàn)對容器的高效創(chuàng)建、部署及復(fù)制,并能將其從一個環(huán)境順利遷移至另一個環(huán)境。

          1.2.1 Docker 如何工作?

          Docker 技術(shù)使用 Linux 內(nèi)核和內(nèi)核功能(例如 Cgroups 和 namespaces)來分隔進(jìn)程,以便各進(jìn)程相互獨(dú)立運(yùn)行。這種獨(dú)立性正是采用容器的目的所在;它可以獨(dú)立運(yùn)行多種進(jìn)程、多個應(yīng)用程序,更加充分地發(fā)揮基礎(chǔ)設(shè)施的作用,同時保持各個獨(dú)立系統(tǒng)的安全性。

          容器工具(包括 Docker)可提供基于鏡像的部署模式。這使得它能夠輕松跨多種環(huán)境,與其依賴程序共享應(yīng)用或服務(wù)組。Docker 還可在這一容器環(huán)境中自動部署應(yīng)用程序(或者合并多種流程,以構(gòu)建單個應(yīng)用程序)。

          此外,由于這些工具基于 Linux 容器構(gòu)建,使得 Docker 既易于使用,又別具一格 —— 它可為用戶提供前所未有的高度應(yīng)用程訪問權(quán)限、快速部署以及版本控制和分發(fā)能力。

          1.2.2 Docker 技術(shù)是否與傳統(tǒng)的 Linux 容器相同?

          否。Docker 技術(shù)最初是基于 LXC 技術(shù)構(gòu)建(大多數(shù)人都會將這一技術(shù)與“傳統(tǒng)的” Linux 容器聯(lián)系在一起),但后來它逐漸擺脫了對這種技術(shù)的依賴。

          就輕量級 虛擬化 這一功能來看,LXC 非常有用,但它無法提供出色的開發(fā)人員或用戶體驗(yàn)。除了運(yùn)行容器之外,Docker 技術(shù)還具備其他多項(xiàng)功能,包括簡化用于構(gòu)建容器、傳輸鏡像以及控制鏡像版本的流程。


          傳統(tǒng)的 Linux 容器使用 init 系統(tǒng)來管理多種進(jìn)程。這意味著,所有應(yīng)用程序都作為一個整體運(yùn)行。與此相反,Docker 技術(shù)鼓勵應(yīng)用程序各自獨(dú)立運(yùn)行其進(jìn)程,并提供相應(yīng)工具以實(shí)現(xiàn)這一功能。這種精細(xì)化運(yùn)作模式自有其優(yōu)勢。

          1.2.3 docker 的目標(biāo)

          docker 的主要目標(biāo)是"Build,Ship and Run any App,Angwhere",構(gòu)建,運(yùn)輸,處處運(yùn)行

          構(gòu)建:做一個 docker 鏡像

          運(yùn)輸:docker pull

          運(yùn)行:啟動一個容器

          每一個容器,他都有自己的文件系統(tǒng) rootfs.

          1.3 安裝 Docker

          環(huán)境說明

          # 需要兩臺幾點(diǎn)進(jìn)行安裝
          [root@docker01 ~]# cat /etc/redhat-release
          CentOS Linux release 7.2.1511 (Core)
          [root@docker01 ~]# uname  -r
          3.10.0-327.el7.x86_64
          [root@docker01 ~]# hostname -I
          10.0.0.100 172.16.1.100
          [root@docker02 ~]# hostname -I
          10.0.0.101 172.16.1.101

          兩個節(jié)點(diǎn)上都進(jìn)行操作

          wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
          sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
          yum install docker-ce -y

          修改在 docker01 配置:

          # 修改啟動文件,監(jiān)聽遠(yuǎn)程端口
          vim /usr/lib/systemd/system/docker.service
          ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://10.0.0.100:2375
          systemctl daemon-reload
          systemctl enable docker.service
          systemctl restart docker.service
          # ps -ef檢查進(jìn)行,是否啟動

          在 docker02 測試

          [root@docker02 ~]# docker -H 10.0.0.100 info
          Containers: 0
           Running: 0
           Paused: 0
           Stopped: 0
          Images: 0
          Server Version: 17.12.0-ce
          Storage Driver: devicemapper
          ···

          1.3.1 Docker 基礎(chǔ)命令操作

          查看 docker 相關(guān)信息:docker version

          [root@docker01 ~]#  docker version
          Client:
           Version:    17.12.0-ce
           API version:    1.35
           Go version:    go1.9.2
           Git commit:    c97c6d6
           Built:    Wed Dec 27 20:10:14 2017
           OS/Arch:    linux/amd64
          Server:
           Engine:
            Version:    17.12.0-ce
            API version:    1.35 (minimum version 1.12)
            Go version:    go1.9.2
            Git commit:    c97c6d6
            Built:    Wed Dec 27 20:12:46 2017
            OS/Arch:    linux/amd64
            Experimental:    false

          配置 docker 鏡像加速

          vi /etc/docker/daemon.json
          {
            "registry-mirrors": ["https://registry.docker-cn.com"]
          }

          1.3.2 啟動第一個容器

          [root@docker01 ~]# docker run -d -p 80:80 nginx
          Unable to find image 'nginx:latest' locally
          latest: Pulling from library/nginx
          e7bb522d92ff: Pull complete
          6edc05228666: Pull complete
          cd866a17e81f: Pull complete
          Digest: sha256:285b49d42c703fdf257d1e2422765c4ba9d3e37768d6ea83d7fe2043dad6e63d
          Status: Downloaded newer image for nginx:latest
          8d8f81da12b5c10af6ba1a5d07f4abc041cb95b01f3d632c3d638922800b0b4d
          # 容器啟動后,在瀏覽器進(jìn)行訪問測試

          參數(shù)說明

          參數(shù) 說明
          run 創(chuàng)建并運(yùn)行一個容器
          -d 放入后臺
          -p 端口映射
          nginx 鏡像名稱

          1.3.3 Docker 鏡像生命周期


          1.4 docker 鏡像相關(guān)操作

          1.4.1 搜索官方倉庫鏡像

          [root@docker01 ~]#  docker search centos
          NAME                      DESCRIPTION                    STARS    OFFICIAL               AUTOMATED
          centos                    The official build of CentOS.  3992     [OK]
          ansible/centos7-ansible   Ansible on Centos7             105                              [OK]

          列表說明

          參數(shù) 說明
          NAME 鏡像名稱
          DESCRIPTION 鏡像說明
          STARS 點(diǎn)贊數(shù)量
          OFFICIAL 是否是官方的
          AUTOMATED 是否是自動構(gòu)建的

          1.4.2 獲取鏡像

          根據(jù)鏡像名稱拉取鏡像

          [root@docker01 ~]# docker pull centos
          Using default tag: latest
          latest: Pulling from library/centos
          af4b0a2388c6: Downloading  34.65MB/73.67MB

          查看當(dāng)前主機(jī)鏡像列表

          [root@docker01 ~]# docker image list
          REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
          centos              latest              ff426288ea90        3 weeks ago         207MB
          nginx               latest              3f8a4339aadd        5 weeks ago         108MB

          拉第三方鏡像方法

          docker pull index.tenxcloud.com/tenxcloud/httpd

          1.4.3 導(dǎo)出鏡像

          [root@docker01 ~]# docker image list
          REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
          centos              latest              ff426288ea90        3 weeks ago         207MB
          nginx               latest              3f8a4339aadd        5 weeks ago         108MB
          # 導(dǎo)出
          [root@docker01 ~]# docker image save centos > docker-centos.tar.gz

          1.4.4 刪除鏡像

          [root@docker01 ~]# docker image rm centos:latest
          [root@docker01 ~]# docker image list
          REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
          nginx               latest              3f8a4339aadd        5 weeks ago         108MB

          1.4.5 導(dǎo)入鏡像

          [root@docker01 ~]# docker image load -i docker-centos.tar.gz
          e15afa4858b6: Loading layer  215.8MB/215.8MB
          Loaded image: centos:latest
          [root@docker01 ~]# docker image list
          REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
          centos              latest              ff426288ea90        3 weeks ago         207MB
          nginx               latest              3f8a4339aadd        5 weeks ago         108MB

          1.4.6 查看鏡像的詳細(xì)信息

          [root@docker01 ~]# docker image inspect centos

          1.5 容器的日常管理

          1.5.1 容器的起/停

          最簡單的運(yùn)行一個容器

          [root@docker01 ~]# docker run nginx

          創(chuàng)建容器,兩步走(不常用)

          [root@docker01 ~]# docker create centos:latest  /bin/bash
          bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204
          [root@docker01 ~]# docker start stupefied_nobel
          stupefied_nobel

          快速啟動容器方法

          [root@docker01 ~]# docker run  centos:latest  /usr/bin/sleep 20;

          容器內(nèi)的第一個進(jìn)程必須一直處于運(yùn)行的狀態(tài),否則這個容器,就會處于退出狀態(tài)!

          查看正在運(yùn)行的容器

          [root@docker01 ~]# docker container ls
              或
          [root@docker01 ~]# docker ps
          CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
          8708e93fd767        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 4 seconds        80/tcp              keen_lewin

          查看你容器詳細(xì)信息/ip

          [root@docker01 ~]# docker container  inspect  容器名稱/id

          查看你所有容器(包括未運(yùn)行的)

          [root@docker01 ~]# docker ps -a
          CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
          8708e93fd767        nginx               "nginx -g 'daemon of…"   4 minutes ago       Exited (0) 59 seconds ago                       keen_lewin
          f9f3e6af7508        nginx               "nginx -g 'daemon of…"   5 minutes ago       Exited (0) 5 minutes ago                        optimistic_haibt
          8d8f81da12b5        nginx               "nginx -g 'daemon of…"   3 hours ago         Exited (0) 3 hours ago                          lucid_bohr

          停止容器

          [root@docker01 ~]# docker stop 容器名稱/id

          [root@docker01 ~]# docker container  kill  容器名稱/id

          1.5.2 進(jìn)入容器方法

          啟動時進(jìn)去方法

          [root@docker01 ~]# docker run -it #參數(shù):-it 可交互終端
          [root@docker01 ~]# docker run -it nginx:latest  /bin/bash
          root@79241093859e:/#

          退出/離開容器

          ctrl+p & ctrl+q

          啟動后進(jìn)入容器的方法

          啟動一個 docker

          [root@docker01 ~]# docker run -it centos:latest
          [root@1bf0f43c4d2f /]# ps -ef
          UID         PID   PPID  C STIME TTY          TIME CMD
          root          1      0  0 15:47 pts/0    00:00:00 /bin/bash
          root         13      1  0 15:47 pts/0    00:00:00 ps -ef

          attach 進(jìn)入容器,使用 pts/0 ,會讓所用通過此方法進(jìn)如放入用戶看到同樣的操作。

          [root@docker01 ~]# docker attach 1bf0f43c4d2f
          [root@1bf0f43c4d2f /]# ps -ef
          UID         PID   PPID  C STIME TTY          TIME CMD
          root          1      0  0 15:47 pts/0    00:00:00 /bin/bash
          root         14      1  0 15:49 pts/0    00:00:00 ps -ef

          自命名啟動一個容器 --name

          [root@docker01 ~]# docker attach 1bf0f43c4d2f
          [root@1bf0f43c4d2f /]# ps -ef
          UID         PID   PPID  C STIME TTY          TIME CMD
          root          1      0  0 15:47 pts/0    00:00:00 /bin/bash
          root         14      1  0 15:49 pts/0    00:00:00 ps -ef

          exec 進(jìn)入容器方法(推薦使用)

          [root@docker01 ~]# docker exec -it clsn1  /bin/bash
          [root@b20fa75b4b40 /]# 重新分配一個終端
          [root@b20fa75b4b40 /]# ps -ef
          UID         PID   PPID  C STIME TTY          TIME CMD
          root          1      0  0 16:11 pts/0    00:00:00 /bin/bash
          root         13      0  0 16:14 pts/1    00:00:00 /bin/bash
          root         26     13  0 16:14 pts/1    00:00:00 ps -ef

          1.5.3 刪除所有容器

          [root@docker01 ~]# docker rm -f  `docker ps -a -q`
          # -f 強(qiáng)制刪除

          1.5.4 啟動時進(jìn)行端口映射

          -p 參數(shù)端口映射

          [root@docker01 ~]# docker run -d -p 8888:80  nginx:latest
          287bec5c60263166c03e1fc5b0b8262fe76507be3dfae4ce5cd2ee2d1e8a89a9

          不同指定映射方法

          參數(shù) 說明
          -p hostPort:containerPort 端口映射 -p 8080:80
          -p ip:hostPort:containerPort 配置監(jiān)聽地址 -p 10.0.0.100:8080:80
          -p ip::containerPort 隨機(jī)分配端口 -p 10.0.0.100::80
          -p hostPort:containerPort:udp 指定協(xié)議 -p 8080:80:tcp
          -p 81:80 –p 443:443 指定多個

          隨機(jī)映射

          docker run -P (大P)# 需要鏡像支持

          1.6 Docker 數(shù)據(jù)卷的管理

          1.6.1 掛載時創(chuàng)建卷

          掛載卷

          [root@docker01 ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
          079786c1e297b5c5031e7a841160c74e91d4ad06516505043c60dbb78a259d09

          容器內(nèi)站點(diǎn)目錄: /usr/share/nginx/html

          在宿主機(jī)寫入數(shù)據(jù),查看

          [root@docker01 ~]# echo "http://www.nmtui.com" >/data/index.html
          [root@docker01 ~]# curl 10.0.0.100
          http://www.nmtui.com

          設(shè)置共享卷,使用同一個卷啟動一個新的容器

          [root@docker01 ~]# docker run -d -p 8080:80 -v /data:/usr/share/nginx/html nginx:latest
          351f0bd78d273604bd0971b186979aa0f3cbf45247274493d2490527babb4e42
          [root@docker01 ~]# curl 10.0.0.100:8080
          http://www.nmtui.com

          查看卷列表

          [root@docker01 ~]# docker volume ls
          DRIVER              VOLUME NAME

          1.6.2 創(chuàng)建卷后掛載

          創(chuàng)建一個卷

          [root@docker01 ~]# docker volume create
          f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521
          [root@docker01 ~]# docker volume ls
          DRIVER              VOLUME NAME
          local               f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521

          指定卷名

          [root@docker01 ~]# docker volume ls
          DRIVER              VOLUME NAME
          local               clsn
          local               f3b95f7bd17da220e63d4e70850b8d7fb3e20f8ad02043423a39fdd072b83521

          查看卷路徑

          [root@docker01 ~]# docker volume inspect clsn
          [
              {
                  "CreatedAt": "2018-02-01T00:39:25+08:00",
                  "Driver": "local",
                  "Labels": {},
                  "Mountpoint": "/var/lib/docker/volumes/clsn/_data",
                  "Name": "clsn",
                  "Options": {},
                  "Scope": "local"
              }
          ]

          使用卷創(chuàng)建

          [root@docker01 ~]# docker run -d -p 9000:80 -v clsn:/usr/share/nginx/html nginx:latest
          1434559cff996162da7ce71820ed8f5937fb7c02113bbc84e965845c219d3503
          # 宿主機(jī)測試
          [root@docker01 ~]# echo 'blog.nmtui.com' >/var/lib/docker/volumes/clsn/_data/index.html
          [root@docker01 ~]# curl 10.0.0.100:9000
          blog.nmtui.com

          設(shè)置卷

          [root@docker01 ~]# docker run  -d  -P  --volumes-from 079786c1e297 nginx:latest
          b54b9c9930b417ab3257c6e4a8280b54fae57043c0b76b9dc60b4788e92369fb

          查看使用的端口

          [root@docker01 ~]# netstat -lntup
          Active Internet connections (only servers)
          Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
          tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1400/sshd
          tcp        0      0 10.0.0.100:2375         0.0.0.0:*               LISTEN      26218/dockerd
          tcp6       0      0 :::9000                 :::*                    LISTEN      32015/docker-proxy
          tcp6       0      0 :::8080                 :::*                    LISTEN      31853/docker-proxy
          tcp6       0      0 :::80                   :::*                    LISTEN      31752/docker-proxy
          tcp6       0      0 :::22                   :::*                    LISTEN      1400/sshd
          tcp6       0      0 :::32769                :::*                    LISTEN      32300/docker-proxy
          [root@docker01 ~]# curl 10.0.0.100:32769
          http://www.nmtui.com

          1.6.3 手動將容器保存為鏡像

          本次是基于 docker 官方 centos 6.8 鏡像創(chuàng)建

          官方鏡像列表:https://hub.docker.com/explore/

          啟動一個 centos6.8 的鏡像

          [root@docker01 ~]# docker pull  centos:6.8
          [root@docker01 ~]# docker run -it -p 1022:22 centos:6.8  /bin/bash
          # 在容器種安裝sshd服務(wù),并修改系統(tǒng)密碼
          [root@582051b2b92b ~]# yum install  openssh-server -y
          [root@582051b2b92b ~]# echo "root:123456" |chpasswd
          [root@582051b2b92b ~]#  /etc/init.d/sshd start

          啟動完成后鏡像 ssh 連接測試

          將容器提交為鏡像

          [root@docker01 ~]# docker commit brave_mcclintock  centos6-ssh

          使用新的鏡像啟動容器

          [root@docker01 ~]# docker run -d  -p 1122:22  centos6-ssh:latest  /usr/sbin/sshd -D
          5b8161fda2a9f2c39c196c67e2eb9274977e7723fe51c4f08a0190217ae93094

          在容器安裝 httpd 服務(wù)

          [root@5b8161fda2a9 /]#  yum install httpd -y

          編寫啟動腳本腳本

          [root@5b8161fda2a9 /]# cat  init.sh
          #!/bin/bash
          /etc/init.d/httpd start
          /usr/sbin/sshd -D
          [root@5b8161fda2a9 /]# chmod +x init.sh
          # 注意執(zhí)行權(quán)限

          再次提交為新的鏡像

          [root@docker01 ~]# docker commit  5b8161fda2a9 centos6-httpd
          sha256:705d67a786cac040800b8485cf046fd57b1828b805c515377fc3e9cea3a481c1

          啟動鏡像,做好端口映射。并在瀏覽器中測試訪問

          [root@docker01 ~]# docker run -d -p 1222:22 -p 80:80  centos6-httpd /init.sh
          46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c

          1.7 Dockerfile 自動構(gòu)建 docker 鏡像

          官方構(gòu)建 dockerffile 文件參考

          https://github.com/CentOS/CentOS-Dockerfiles

          1.7.1 Dockerfile 指令集

          dockerfile 主要組成部分:

          基礎(chǔ)鏡像信息 FROM centos:6.8

          制作鏡像操作指令 RUN yum insatll openssh-server -y

          容器啟動時執(zhí)行指令 CMD ["/bin/bash"]

          dockerfile 常用指令:

          FROM 這個鏡像的媽媽是誰?(指定基礎(chǔ)鏡像)

          MAINTAINER 告訴別人,誰負(fù)責(zé)養(yǎng)它?(指定維護(hù)者信息,可以沒有)

          RUN 你想讓它干啥(在命令前面加上 RUN 即可)

          ADD 給它點(diǎn)創(chuàng)業(yè)資金(COPY 文件,會自動解壓)

          WORKDIR 我是 cd,今天剛化了妝(設(shè)置當(dāng)前工作目錄)

          VOLUME 給它一個存放行李的地方(設(shè)置卷,掛載主機(jī)目錄)

          EXPOSE 它要打開的門是啥(指定對外的端口)

          CMD 奔跑吧,兄弟!(指定容器啟動后的要干的事情)

          dockerfile 其他指令:

          COPY 復(fù)制文件

          ENV 環(huán)境變量

          ENTRYPOINT 容器啟動后執(zhí)行的命令


          1.7.2 創(chuàng)建一個 Dockerfile

          創(chuàng)建第一個 Dockerfile 文件

          # 創(chuàng)建目錄
          [root@docker01 base]# cd /opt/base
          # 創(chuàng)建Dcokerfile文件,注意大小寫
          [root@docker01 base]# vim Dockerfile
          FROM centos:6.8
          RUN yum install openssh-server -y
          RUN echo "root:123456" |chpasswd
          RUN /etc/init.d/sshd start
          CMD ["/usr/sbin/sshd","-D"]

          構(gòu)建 docker 鏡像

          [root@docker01 base]# docker image build  -t centos6.8-ssh .
          -t 為鏡像標(biāo)簽打標(biāo)簽  . 表示當(dāng)前路徑

          使用自構(gòu)建的鏡像啟動

          [root@docker01 base]# docker run  -d -p 2022:22 centos6.8-ssh-b
          dc3027d3c15dac881e8e2aeff80724216f3ac725f142daa66484f7cb5d074e7a

          1.7.3 使用 Dcokerfile 安裝 kodexplorer

          Dockerfile 文件內(nèi)容

          FROM centos:6.8
          RUN yum install wget unzip php php-gd php-mbstring -y && yum clean all
          # 設(shè)置工作目錄,之后的操作都在這個目錄中
          WORKDIR /var/www/html/
          RUN wget -c http://static.kodcloud.com/update/download/kodexplorer4.25.zip
          RUN unzip kodexplorer4.25.zip && rm -f kodexplorer4.25.zip
          RUN chown -R apache.apache .
          CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]

          更多的 Dockerfile 可以參考官方方法。

          1.8 Docker 中的鏡像分層

          參考文檔:http://www.maiziedu.com/wiki/cloud/dockerimage/

          Docker 支持通過擴(kuò)展現(xiàn)有鏡像,創(chuàng)建新的鏡像。實(shí)際上,Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構(gòu)建出來的。

          img

          從上圖可以看到,新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現(xiàn)有鏡像的基礎(chǔ)上增加一層。

          1.8.1 Docker 鏡像為什么分層

          鏡像分層最大的一個好處就是共享資源。

          比如說有多個鏡像都從相同的 base 鏡像構(gòu)建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了。而且鏡像的每一層都可以被共享。

          如果多個容器共享一份基礎(chǔ)鏡像,當(dāng)某個容器修改了基礎(chǔ)鏡像的內(nèi)容,比如 /etc 下的文件,這時其他容器的 /etc 是不會被修改的,修改只會被限制在單個容器內(nèi)。這就是容器 Copy-on-Write 特性。

          1.8.2 可寫的容器層

          當(dāng)容器啟動時,一個新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。

          img

          所有對容器的改動 - 無論添加、刪除、還是修改文件都只會發(fā)生在容器層中。只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的

          1.8.3 容器層的細(xì)節(jié)說明

          鏡像層數(shù)量可能會很多,所有鏡像層會聯(lián)合在一起組成一個統(tǒng)一的文件系統(tǒng)。如果不同層中有一個相同路徑的文件,比如 /a,上層的 /a 會覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個疊加之后的文件系統(tǒng)。

          文件操作的

          文件操作 說明
          添加文件 在容器中創(chuàng)建文件時,新文件被添加到容器層中。
          讀取文件 在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其復(fù)制到容器層,然后打開并讀入內(nèi)存。
          修改文件 在容器中修改已存在的文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,立即將其復(fù)制到容器層,然后修改之。
          刪除文件 在容器中刪除文件時,Docker 也是從上往下依次在鏡像層中查找此文件。找到后,會在容器層中記錄下此刪除操作。(只是記錄刪除操作)

          只有當(dāng)需要修改時才復(fù)制一份數(shù)據(jù),這種特性被稱作 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像本身進(jìn)行任何修改。

          這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改,所有鏡像層都是只讀的,不會被容器修改,所以鏡像可以被多個容器共享。

          1.9 使用 docker 運(yùn)行 zabbix-server

          1.9.1 容器間的互聯(lián)

          在運(yùn)行 zabbix 之前務(wù)必要了解容器間互聯(lián)的方法

          # 創(chuàng)建一個nginx容器
          docker run -d -p 80:80 nginx
          # 創(chuàng)建容器,做link,并進(jìn)入容器中
          docker run -it --link quirky_brown:web01 centos-ssh /bin/bash
          # 在容器中訪問nginx容器可以ping通
          ping web01

          命令執(zhí)行過程

          # 啟動apache容器
          [root@docker01 ~]# docker run -d httpd:2.4
          3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955
          ^[[A[root@docker01 docker ps -a
          CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
          3f1f7fc55472        httpd:2.4           "httpd-foreground"   6 seconds ago       Up 5 seconds        80/tcp              determined_clarke
          # 拉取一個busybox 鏡像
          [root@docker01 ~]# docker pull busybox
          # 啟動容器
          [root@docker01 ~]# docker run -it  --link determined_clarke:web busybox:latest   /bin/sh
          / #
          # 使用新的容器訪問最初的web容器
          / # ping web
          PING web (172.17.0.2): 56 data bytes
          64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.058 ms
          ^C
          --- web ping statistics ---
          1 packets transmitted, 1 packets received, 0% packet loss
          round-trip min/avg/max = 0.058/0.058/0.058 ms

          1.9.2 啟動 zabbix 容器

          1、啟動一個 mysql 的容器

          docker run --name mysql-server -t \
                -e MYSQL_DATABASE="zabbix" \
                -e MYSQL_USER="zabbix" \
                -e MYSQL_PASSWORD="zabbix_pwd" \
                -e MYSQL_ROOT_PASSWORD="root_pwd" \
                -d mysql:5.7 \
                --character-set-server=utf8 --collation-server=utf8_bin

          2、啟動 java-gateway 容器監(jiān)控 java 服務(wù)

          docker run --name zabbix-java-gateway -t \
                -d zabbix/zabbix-java-gateway:latest

          3、啟動 zabbix-mysql 容器使用 link 連接 mysql 與 java-gateway。

          docker run --name zabbix-server-mysql -t \
                -e DB_SERVER_HOST="mysql-server" \
                -e MYSQL_DATABASE="zabbix" \
                -e MYSQL_USER="zabbix" \
                -e MYSQL_PASSWORD="zabbix_pwd" \
                -e MYSQL_ROOT_PASSWORD="root_pwd" \
                -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
                --link mysql-server:mysql \
                --link zabbix-java-gateway:zabbix-java-gateway \
                -p 10051:10051 \
                -d zabbix/zabbix-server-mysql:latest

          4、啟動 zabbix web 顯示,使用 link 連接 zabbix-mysql 與 mysql。

          docker run --name zabbix-web-nginx-mysql -t \
                -e DB_SERVER_HOST="mysql-server" \
                -e MYSQL_DATABASE="zabbix" \
                -e MYSQL_USER="zabbix" \
                -e MYSQL_PASSWORD="zabbix_pwd" \
                -e MYSQL_ROOT_PASSWORD="root_pwd" \
                --link mysql-server:mysql \
                --link zabbix-server-mysql:zabbix-server \
                -p 80:80 \
                -d zabbix/zabbix-web-nginx-mysql:latest

          1.9.3 關(guān)于 zabbix API

          關(guān)于 zabbix API 可以參考官方文檔:https://www.zabbix.com/documentation/3.4/zh/manual/api

          1、獲取 token 方法

          # 獲取token
          [root@docker02 ~]# curl -s -X POST -H 'Content-Type:application/json' -d '
          {
          "jsonrpc": "2.0",
          "method": "user.login",
          "params": {
          "user": "Admin",
          "password": "zabbix"
          },
          "id": 1
          }' http://10.0.0.100/api_jsonrpc.php
          {"jsonrpc":"2.0","result":"d3be707f9e866ec5d0d1c242292cbebd","id":1}

          1.10 docker 倉庫(registry)

          1.10.1 創(chuàng)建一個普通倉庫

          1、創(chuàng)建倉庫

          docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry

          2、修改配置文件,使之支持 http

          [root@docker01 ~]# cat  /etc/docker/daemon.json
          {
            "registry-mirrors": ["https://registry.docker-cn.com"],
            "insecure-registries": ["10.0.0.100:5000"]
          }

          重啟 docker 讓修改生效

          [root@docker01 ~]# systemctl restart  docker.service

          3、修改鏡像標(biāo)簽

          [root@docker01 ~]# docker tag  busybox:latest  10.0.0.100:5000/clsn/busybox:1.0
          [root@docker01 ~]# docker images
          REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
          centos6-ssh                     latest              3c2b1e57a0f5        18 hours ago        393MB
          httpd                           2.4                 2e202f453940        6 days ago          179MB
          10.0.0.100:5000/clsn/busybox    1.0                 5b0d59026729        8 days ago          1.15MB

          4、將新打標(biāo)簽的鏡像上傳鏡像到倉庫

          [root@docker01 ~]# docker push   10.0.0.100:5000/clsn/busybox

          1.10.2 帶 basic 認(rèn)證的倉庫

          1、安裝加密工具

          [root@docker01 clsn]# yum install httpd-tools  -y

          2、設(shè)置認(rèn)證密碼

          mkdir /opt/registry-var/auth/ -p
          htpasswd  -Bbn clsn 123456  > /opt/registry-var/auth/htpasswd

          3、啟動容器,在啟動時傳入認(rèn)證參數(shù)

          docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

          4、使用驗(yàn)證用戶測試

          # 登陸用戶
          [root@docker01 ~]# docker login 10.0.0.100:5000
          Username: clsn
          Password: 123456
          Login Succeeded
          # 推送鏡像到倉庫
          [root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox
          The push refers to repository [10.0.0.100:5000/clsn/busybox]
          4febd3792a1f: Pushed
          1.0: digest: sha256:4cee1979ba0bf7db9fc5d28fb7b798ca69ae95a47c5fecf46327720df4ff352d size: 527
          #認(rèn)證文件的保存位置
          [root@docker01 ~]# cat .docker/config.json
          {
              "auths": {
                  "10.0.0.100:5000": {
                      "auth": "Y2xzbjoxMjM0NTY="
                  },
                  "https://index.docker.io/v1/": {
                      "auth": "Y2xzbjpIenNAMTk5Ng=="
                  }
              },
              "HttpHeaders": {
                  "User-Agent": "Docker-Client/17.12.0-ce (linux)"
              }
          }

          至此,一個簡單的 docker 鏡像倉庫搭建完成

          1.11 docker-compose 編排工具

          1.11.1 安裝 docker-compose

          安裝 docker-compose

          # 下載pip軟件
          yum install -y python2-pip
          # 下載 docker-compose
          pip install docker-compose

          國內(nèi)開啟 pip 下載加速:http://mirrors.aliyun.com/help/pypi

          mkdir ~/.pip/
          cat > ~/.pip/pip.conf <<'EOF'
          [global]
          index-url = https://mirrors.aliyun.com/pypi/simple/
          [install]
          trusted-host=mirrors.aliyun.com
          EOF

          1.11.2 編排啟動鏡像

          1、創(chuàng)建文件目錄

          [root@docker01 ~]# mkdir /opt/my_wordpress/
          [root@docker01 ~]# cd /opt/my_wordpress/

          2、編寫編排文件

          [root@docker01 my_wordpress]# vim docker-compose.yml
          version: '3'
          services:
             db:
               image: mysql:5.7
               volumes:
                 - /data/db_data:/var/lib/mysql
               restart: always
               environment:
                 MYSQL_ROOT_PASSWORD: somewordpress
                 MYSQL_DATABASE: wordpress
                 MYSQL_USER: wordpress
                 MYSQL_PASSWORD: wordpress
             wordpress:
               depends_on:
                 - db
               image: wordpress:latest
               volumes:
                 - /data/web_data:/var/www/html
               ports:
                 - "8000:80"
               restart: always
               environment:
                 WORDPRESS_DB_HOST: db:3306
                 WORDPRESS_DB_USER: wordpress
                 WORDPRESS_DB_PASSWORD: wordpress

          3、啟動

          [root@docker01 my_wordpress]# docker-compose up
            #啟動方法:docker-compose up
            #后臺啟動方法:docker-compose up -d

          4、瀏覽器上訪問http://10.0.0.100:8000

          進(jìn)行 wordpress 的安裝即可

          1.11.3 haproxy 代理后端 docker 容器

          1、修改編排腳本

          [root@docker01 my_wordpress]# cat docker-compose.yml
          version: '3'
          services:
             db:
               image: mysql:5.7
               volumes:
                 - /data/db_data:/var/lib/mysql
               restart: always
               environment:
                 MYSQL_ROOT_PASSWORD: somewordpress
                 MYSQL_DATABASE: wordpress
                 MYSQL_USER: wordpress
                 MYSQL_PASSWORD: wordpress
             wordpress:
               depends_on:
                 - db
               image: wordpress:latest
               volumes:
                 - /data/web_data:/var/www/html
               ports:
                 - "80"
               restart: always
               environment:
                 WORDPRESS_DB_HOST: db:3306
                 WORDPRESS_DB_USER: wordpress
                 WORDPRESS_DB_PASSWORD: wordpress

          2、同時啟動兩臺wordpress

          [root@docker01 my_wordpress]# docker-compose scale wordpress=2
          WARNING: The scale command is deprecated. Use the up command with the --scale flag instead.
          Starting mywordpress_wordpress_1 ... done
          Creating mywordpress_wordpress_2 ... done

          3、安裝 haproxy

          [root@docker01 ~]# yum install haproxy -y

          4、修改 haproxy 配置文件

          關(guān)于配置文件的詳細(xì)說明,參考:https://www.cnblogs.com/MacoLee/p/5853413.html

          [root@docker01 ~]#cp /etc/haproxy/haproxy.cfg{,.bak}
          [root@docker01 ~]# vim /etc/haproxy/haproxy.cfg
          global
              log         127.0.0.1 local2
              chroot      /var/lib/haproxy
              pidfile     /var/run/haproxy.pid
              maxconn     4000
              user        haproxy
              group       haproxy
              daemon
              stats socket /var/lib/haproxy/stats level admin  #支持命令行控制
          defaults
              mode                    http
              log                     global
              option                  httplog
              option                  dontlognull
              option http-server-close
              option forwardfor       except 127.0.0.0/8
              option                  redispatch
              retries                 3
              timeout http-request    10s
              timeout queue           1m
              timeout connect         10s
              timeout client          1m
              timeout server          1m
              timeout http-keep-alive 10s
              timeout check           10s
              maxconn                 3000
          listen stats
              mode http
              bind 0.0.0.0:8888
              stats enable
              stats uri     /haproxy-status
              stats auth    admin:123456
          frontend frontend_www_example_com
              bind 10.0.0.100:8000
              mode http
              option httplog
              log global
              default_backend backend_www_example_com
          backend backend_www_example_com
              option forwardfor header X-REAL-IP
              option httpchk HEAD / HTTP/1.0
              balance roundrobin
              server web-node1  10.0.0.100:32768 check inter 2000 rise 30 fall 15
              server web-node2  10.0.0.100:32769 check inter 2000 rise 30 fall 15

          5、啟動 haproxy

          systemctl start haproxy
          systemctl enable haproxy

          6、使用瀏覽器訪問 hapeoxy 監(jiān)聽的 8000 端口可以看到負(fù)載的情況

          7、使用瀏覽器訪問 http://10.0.0.100:8888/haproxy-status

          可以看到后端節(jié)點(diǎn)的監(jiān)控狀況,

          1.11.4 安裝 socat 直接操作 socket 控制 haproxy

          1、安裝軟件

          yum install socat.x86_64 -y

          2、查看幫助

          [root@docker01 web_data]# echo "help"|socat stdio /var/lib/haproxy/stats

          3、下線后端節(jié)點(diǎn)

          echo "disable server backend_www_example_com/web-node2"|socat stdio /var/lib/haproxy/stats

          4、上線后端節(jié)點(diǎn)

          echo "enable server backend_www_example_com/web-node3"|socat stdio /var/lib/haproxy/stats

          5、編寫 php 測試頁,放到/data/web_data 下,在瀏覽器中訪問可以查看當(dāng)前的節(jié)點(diǎn)

          [root@docker01 web_data]# vim check.php
          <html>
              <head>
                  <title>PHP測試</title>
              </head>
              <body>
                  <?php  echo '<p>Hello World </p>'; ?>
                  <?php  echo "訪問的服務(wù)器地址是:"."<fontcolor=red>".$_SERVER['SERVER_ADDR']."</font>"."<br>";
                  echo"訪問的服務(wù)器域名是:"."<fontcolor=red>".$_SERVER['SERVER_NAME']."</font>"."<br>";
                  ?>
              </body>
          </html>

          1.12 重啟 docker 服務(wù),容器全部退出的解決辦法

          1.12.1 在啟動是指定自動重啟

          docker run  --restart=always

          1.12.2 修改 docker 默認(rèn)配置文件

          # 添加上下面這行
          "live-restore": true

          docker server 配置文件/etc/docker/daemon.json 參考

          [root@docker02 ~]# cat  /etc/docker/daemon.json
          {
            "registry-mirrors": ["https://registry.docker-cn.com"],
            "graph": "/opt/mydocker", # 修改數(shù)據(jù)的存放目錄到/opt/mydocker/,原/var/lib/docker/
            "insecure-registries": ["10.0.0.100:5000"],
            "live-restore": true
          }

          重啟生效,只對在此之后啟動的容器生效

          [root@docker01 ~]# systemctl restart  docker.service

          1.13 Docker 網(wǎng)絡(luò)類型

          img

          1.13.1 docker 的網(wǎng)絡(luò)類型

          類型 說明
          None 不為容器配置任何網(wǎng)絡(luò)功能,沒有網(wǎng)絡(luò) --net=none
          Container 與另一個運(yùn)行中的容器共享 Network Namespace,--net=container:containerID
          Host 與主機(jī)共享 Network Namespace,--net=host
          Bridge Docker 設(shè)計(jì)的 NAT 網(wǎng)絡(luò)模型**(默認(rèn)類型)**

          Bridge默認(rèn) docker 網(wǎng)絡(luò)隔離基于網(wǎng)絡(luò)命名空間,在物理機(jī)上創(chuàng)建 docker 容器時會為每一個 docker 容器分配網(wǎng)絡(luò)命名空間,并且把容器 IP 橋接到物理機(jī)的虛擬網(wǎng)橋上。

          1.13.2 不為容器配置網(wǎng)絡(luò)功能

          此模式下創(chuàng)建容器是不會為容器配置任何網(wǎng)絡(luò)參數(shù)的,如:容器網(wǎng)卡、IP、通信路由等,全部需要自己去配置。

          [root@docker01 ~]# docker run  -it --network none busybox:latest  /bin/sh
          / # ip a
          1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
              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

          1.13.3 與其他容器共享網(wǎng)絡(luò)配置(Container)

          此模式和 host 模式很類似,只是此模式創(chuàng)建容器共享的是其他容器的 IP 和端口而不是物理機(jī),此模式容器自身是不會配置網(wǎng)絡(luò)和端口,創(chuàng)建此模式容器進(jìn)去后,你會發(fā)現(xiàn)里邊的 IP 是你所指定的那個容器 IP 并且端口也是共享的,而且其它還是互相隔離的,如進(jìn)程等。

          [root@docker01 ~]# docker run  -it --network container:mywordpress_db_1  busybox:latest  /bin/sh
          / # ip a
          1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
              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
          105: eth0@if106: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
              link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
              inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
                 valid_lft forever preferred_lft forever

          1.13.4 使用宿主機(jī)網(wǎng)絡(luò)

          此模式創(chuàng)建的容器沒有自己獨(dú)立的網(wǎng)絡(luò)命名空間,是和物理機(jī)共享一個 Network Namespace,并且共享物理機(jī)的所有端口與 IP,并且這個模式認(rèn)為是不安全的。

          [root@docker01 ~]# docker run  -it --network host  busybox:latest  /bin/sh

          1.13.5 查看網(wǎng)絡(luò)列表

          [root@docker01 ~]# docker network list
          NETWORK ID          NAME                  DRIVER              SCOPE
          b15e8a720d3b        bridge                bridge              local
          345d65b4c2a0        host                  host                local
          bc5e2a32bb55        mywordpress_default   bridge              local
          ebf76eea91bb        none                  null                local


          1.13.6 用 PIPEWORK 為 docker 容器配置獨(dú)立 IP

          參考文檔:http://blog.csdn.net/design321/article/details/48264825

          官方網(wǎng)站:https://github.com/jpetazzo/pipework

          宿主環(huán)境:centos7.2

          1、安裝 pipework

          wget https://github.com/jpetazzo/pipework/archive/master.zip
          unzip master.zip
          cp pipework-master/pipework  /usr/local/bin/
          chmod +x /usr/local/bin/pipework

          2、配置橋接網(wǎng)卡

          安裝橋接工具

          yum install bridge-utils.x86_64 -y

          修改網(wǎng)卡配置,實(shí)現(xiàn)橋接

          # 修改eth0配置,讓br0實(shí)現(xiàn)橋接
          [root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
          TYPE=Ethernet
          BOOTPROTO=static
          NAME=eth0
          DEVICE=eth0
          ONBOOT=yes
          BRIDGE=br0
          [root@docker01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
          TYPE=Bridge
          BOOTPROTO=static
          NAME=br0
          DEVICE=br0
          ONBOOT=yes
          IPADDR=10.0.0.100
          NETMASK=255.255.255.0
          GATEWAY=10.0.0.254
          DNS1=223.5.5.5
          # 重啟網(wǎng)絡(luò)
          [root@docker01 ~]# /etc/init.d/network restart

          3、運(yùn)行一個容器鏡像測試:

          pipework br0 $(docker run -d -it -p 6880:80 --name  httpd_pw httpd) 10.0.0.220/[email protected]

          在其他主機(jī)上測試端口及連通性

          [root@docker01 ~]# curl 10.0.0.220
          <html><body><h1>It works!</h1></body></html>
          [root@docker01 ~]# ping 10.0.0.220 -c 1
          PING 10.0.0.220 (10.0.0.220) 56(84) bytes of data.
          64 bytes from 10.0.0.220: icmp_seq=1 ttl=64 time=0.043 ms

          4、再運(yùn)行一個容器,設(shè)置網(wǎng)路類型為 none:

          pipework br0 $(docker run -d -it --net=none --name test httpd:2.4) 10.0.0.221/[email protected]

          進(jìn)行訪問測試

          [root@docker01 ~]# curl 10.0.0.221
          <html><body><h1>It works!</h1></body></html>

          5、重啟容器后需要再次指定:

          pipework br0 testduliip  172.16.146.113/[email protected]
          pipework br0 testduliip01  172.16.146.112/[email protected]

          Dcoker 跨主機(jī)通信之 overlay 可以參考:

          http://www.cnblogs.com/CloudMan6/p/7270551.html

          1.13.7 Docker 跨主機(jī)通信之 macvlan

          創(chuàng)建網(wǎng)絡(luò)

          [root@docker01 ~]# docker network  create --driver macvlan  --subnet 10.1.0.0/24 --gateway 10.1.0.254 -o parent=eth0  macvlan_1
          33a1f41dcc074f91b5bd45e7dfedabfb2b8ec82db16542f05213839a119b62ca

          設(shè)置網(wǎng)卡為混雜模式

          ip link set eth0 promisc on

          創(chuàng)建使用 macvlan 網(wǎng)絡(luò)容器

          [root@docker02 ~]# docker run  -it --network macvlan_1  --ip=10.1.0.222 busybox /bin/sh

          1.14 docker 企業(yè)級鏡像倉庫 harbor

          容器管理

          [root@docker01 harbor]# pwd
          /opt/harbor
          [root@docker01 harbor]# docker-compose stop

          1、安裝 docker、docker-compose

          下載 harbor

          cd /opt && https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
          tar xf harbor-offline-installer-v1.3.0.tgz

          2、修改主機(jī)及 web 界面密碼

          [root@docker01 harbor]# vim harbor.cfg
              ···
              hostname = 10.0.0.100
              harbor_admin_password = Harbor12345
              ···

          3、執(zhí)行安裝腳本

          [root@docker01 harbor]# ./install.sh

          瀏覽器訪問 http://10.0.0.11

          添加一個項(xiàng)目

          4、鏡像推送到倉庫的指定項(xiàng)目

          [root@docker02 ~]# docker  tag centos:6.8  10.0.0.100/clsn/centos6.8:1.0
          [root@docker02 ~]#
          [root@docker02 ~]# docker images
          REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
          busybox                     latest              5b0d59026729        8 days ago          1.15MB
          10.0.0.100/clsn/centos6.8   1.0                 6704d778b3ba        2 months ago        195MB
          centos                      6.8                 6704d778b3ba        2 months ago        195MB
          [root@docker02 ~]# docker login 10.0.0.100
          Username: admin
          Password:
          Login Succeeded

          5、推送鏡像

          [root@docker02 ~]# docker push 10.0.0.100/clsn/centos6.8
          The push refers to repository [10.0.0.100/clsn/centos6.8]
          e00c9229b481: Pushing  13.53MB/194.5MB

          6、在 web 界面里查看

          1.14.1 使用容器的建議

          1. 不要以拆分方式進(jìn)行應(yīng)用程序發(fā)布
          2. 不要創(chuàng)建大型鏡像
          3. 不要在單個容器中運(yùn)行多個進(jìn)程
          4. 不要再鏡像內(nèi)保存憑證,不要依賴 IP 地址
          5. 以非 root 用戶運(yùn)行進(jìn)程
          6. 不要使用“最新”標(biāo)簽
          7. 不要利用運(yùn)行中的容器創(chuàng)建鏡像
          8. 不要使用單層鏡像
          9. 不要將數(shù)據(jù)存放在容器內(nèi)

          1.14.2 關(guān)于 Docker 容器的監(jiān)控

          容器的基本信息

          包括容器的數(shù)量、ID、名稱、鏡像、啟動命令、端口等信息

          容器的運(yùn)行狀態(tài)

          統(tǒng)計(jì)各狀態(tài)的容器的數(shù)量,包括運(yùn)行中、暫停、停止及異常退出

          容器的用量信息

          統(tǒng)計(jì)容器的 CPU 使用率、內(nèi)存使用量、塊設(shè)備 I/O 使用量、網(wǎng)絡(luò)使用情況等資源的使用情況

          來源:慘綠少年| 鏈接:cnblogs.com/clsn/p/8410309.html

          瀏覽 56
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  97色婷| 国产色婷婷一区二区 | 又大又粗一级 | 国产高潮视频在线观看 | 色婷婷中文在线观看视频 |