<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,我就把這篇甩給他

          共 9542字,需瀏覽 20分鐘

           ·

          2023-02-04 18:10

          最近行情不好,偶爾也看看外面的機會。參加了一個公司的面試,意外發(fā)現(xiàn)是一位女面試官,不過技術(shù)確實很厲害。
          她問了很多問題,包括計算機語言,數(shù)據(jù)結(jié)構(gòu)和算法,操作系統(tǒng),尤其重點問了Docker相關(guān)的問題,可能是想考察八股文之外的實戰(zhàn)能力吧。
          接下來,分享下Docker相關(guān)的面試題和一些容易考到的知識點。

          目錄

          1. 什么是Docker?
          2. Docker的應用場景有哪些?
          3. Docker的優(yōu)點有哪些?
          4. Docker與虛擬機的區(qū)別是什么?
          5. Docker的三大核心是什么?
          6. 如何快速安裝Docker?
          7. 如何修改Docker的存儲位置?
          8. Docker鏡像常用管理有哪些?
          9. 如何創(chuàng)建Docker容器?
          10. Docker在后臺的標準運行過程是什么?
          11. Docker網(wǎng)絡模式有哪些?
          12. 什么是Docker的數(shù)據(jù)卷
          13. 如何搭建Docker私有倉庫
          14. Docker如何遷移備份?
          15. Docker如何部署MySQL?

          前言

          本文總結(jié)了Docker常見的問題和坑,采用問答的形式,分享給大家

          1.什么是Docker?

          • Docker 是一個開源的應用容器引擎,基于go 語言開發(fā)并遵循了apache2.0 協(xié)議開源
          • Docker 是在Linux 容器里運行應用的開源工具,是一種輕量級的“虛擬機”
          • Docker 的容器技術(shù)可以在一臺主機上輕松為任何應用創(chuàng)建一個輕量級的,可移植的,自給自足的容器

          也可以這樣形象的比喻:

          Docker 的Logo設計為藍色鯨魚,拖著許多集裝箱,鯨魚可以看作為宿主機,集裝箱可以理解為相互隔離的容器,每個集裝箱中都包含自己的應用程序。

          2.Docker的應用場景有哪些?

          • Web 應用的自動化打包和發(fā)布。
          • 自動化測試和持續(xù)集成、發(fā)布。
          • 在服務型環(huán)境中部署和調(diào)整數(shù)據(jù)庫或其他的后臺應用。
          • 從頭編譯或者擴展現(xiàn)有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環(huán)境。

          在這里我重點介紹下Docker作為內(nèi)部開發(fā)環(huán)境的場景

          在容器技術(shù)出現(xiàn)之前,公司往往是通過為每個開發(fā)人員提供一臺或者多臺虛擬機來充當開發(fā)測試環(huán)境。開發(fā)測試環(huán)境一般負載較低,大量的系統(tǒng)資源都被浪費在虛擬機本身的進程上了。

          Docker容器沒有任何CPU和內(nèi)存上的額外開銷,很適合用來提供公司內(nèi)部的開發(fā)測試環(huán)境。而且由于docker鏡像可以很方便的在公司內(nèi)部分享,這對開發(fā)環(huán)境的規(guī)范性也有極大的幫助。

          如果要把容器作為開發(fā)機使用,需要解決的是遠程登錄容器和容器內(nèi)進程管理問題。雖然docker的初衷是為“微服務”架構(gòu)設計的,但根據(jù)我們的實際使用經(jīng)驗,在docker內(nèi)運行多個程序,甚至sshd或者upstart也是可行的。

          3.Docker的優(yōu)點有哪些?

          容器化越來越受歡迎,Docker的容器有點總結(jié)如下:

          • 靈活:即使是最復雜的應用也可以集裝箱化。
          • 輕量級:容器利用并共享主機內(nèi)核。
          • 可互換:可以即時部署更新和升級。
          • 便攜式:可以在本地構(gòu)建,部署到云,并在任何地方運行。
          • 可擴展:可以增加并白動分發(fā)容器副本。
          • 可堆疊:可以垂直和即時堆疊服務。

          Docker 是一個用于開發(fā),交付和運行應用程序的開放平臺。Docker 使您能夠?qū)贸绦蚺c基礎架構(gòu)分開,從而可以快速交付軟件。借助 Docker,您可以與管理應用程序相同的方式來管理基礎架構(gòu)。通過利用 Docker 的方法來快速交付,測試和部署代碼,您可以大大減少編寫代碼和在生產(chǎn)環(huán)境中運行代碼之間的延遲。

          4.Docker與虛擬機的區(qū)別是什么?

          虛擬機通過添加Hypervisor層(虛擬化中間層),虛擬出網(wǎng)卡、內(nèi)存、CPU等虛擬硬件,再在其上建立虛擬機,每個虛擬機都有自己的系統(tǒng)內(nèi)核。而Docker容器則是通過隔離(namesapce)的方式,將文件系統(tǒng)、進程、設備、網(wǎng)絡等資源進行隔離,再對權(quán)限、CPU資源等進行控制(cgroup),最終讓容器之間互不影響,容器無法影響宿主機。

          與虛擬機相比,容器資源損耗要少。同樣的宿主機下,能夠建立容器的數(shù)量要比虛擬機多

          但是,虛擬機的安全性要比容器稍好,而docker容器與宿主機共享內(nèi)核、文件系統(tǒng)等資源,更有可能對其他容器、宿主機產(chǎn)生影響。

          5.Docker的三大核心是什么?

          鏡像

          Docker的鏡像是創(chuàng)建容器的基礎,類似虛擬機的快照,可以理解為一個面向Docker容器引擎的只讀模板。

          通過鏡像啟動一個容器,一個鏡像是一個可執(zhí)行的包,其中包括運行應用程序所需要的所有內(nèi)容包含代碼,運行時間,庫、環(huán)境變量、和配置文件。

          Docker鏡像也是一個壓縮包,只是這個壓縮包不只是可執(zhí)行文件,環(huán)境部署腳本,它還包含了完整的操作系統(tǒng)。因為大部分的鏡像都是基于某個操作系統(tǒng)來構(gòu)建,所以很輕松的就可以構(gòu)建本地和遠端一樣的環(huán)境,這也是Docker鏡像的精髓。

          容器

          Docker的容器是從鏡像創(chuàng)建的運行實例,它可以被啟動、停止和刪除。所創(chuàng)建的每一個容器都是相互隔離、互不可見,以保證平臺的安全性??梢园讶萜骺醋鍪且粋€簡易版的linux環(huán)境(包括root用戶權(quán)限、鏡像空間、用戶空間和網(wǎng)絡空間等)和運行在其中的應用程序。

          倉庫

          倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中包含了多個鏡像,每個鏡像有不同標簽(tag)。

          倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

          最大的公開倉庫是 Docker Hub:https://hub.docker.com,存放了數(shù)量龐大的鏡像供用戶下載。

          國內(nèi)的公開倉庫包括阿里云 、網(wǎng)易云等。

          6.如何快速安裝Docker?

          執(zhí)行以下安裝命令去安裝依賴包

          yum install -y yum-utils device-mapper-persistent-data lvm2
          sudo yum-config-manager
          –add-repo
          https://download.docker.com/linux/centos/docker-ce.repo
          [root@centos7 ~] yum -y install docker-ce docker-ce-cli containerd.io
          [root@centos7 ~]# docker ps --查看docker
          [root@centos7 ~]# systemctl enable docker
          [root@centos7 ~]# systemctl start docker
          [root@centos7 ~]# systemctl status docker
          [root@centos7 ~]# docker ps --查看容器
          [root@centos7 ~]# docker version --查看版本
          [root@centos7 ~]# docker info --查看版本

          7.如何修改Docker的存儲位置?

          默認情況下 Docker的存放位置為:/var/lib/docker

          可以通過命令查看具體位置:docker info | grep “Docker Root Dir”

          修改到其它目錄

          首先停掉 Docker 服務:

          systemctl stop docker

          然后移動整個/var/lib/docker 目錄到目的路徑

          mkdir -p /root/data/docker
          mv /var/lib/docker /root/data/docker
          ln -s /root/data/docker /var/lib/docker --快捷方式

          8.Docker鏡像常用管理有哪些?

          快速檢索鏡像

          格式:docker search 關(guān)鍵字

          獲取鏡像

          格式:docker ? pull ? 倉庫名稱[:標簽] 如果下載鏡像時不指定標簽,則默認會下載倉庫中最新版本的鏡像,即選擇標簽為 latest 標簽

          查看鏡像信息

          鏡像下載后默認存放在 /var/lib/docker

          • REPOSITORY: 鏡像所屬倉庫
          • TAG: 鏡像的標簽信息,標記同一個倉庫中的不同鏡像
          • IMAGE ID :鏡像的唯一ID號,唯一標識一個鏡像
          • CREATED: 鏡像創(chuàng)建時間
          • SIZE: 鏡像大小
          獲取鏡像的詳細信息

          格式:docker ? inspect ? 鏡像ID號

          鏡像ID 號可以不用打全。

          為本地鏡像添加新的標簽

          格式:docker ? tag ?名稱:[ 標簽]

          刪除鏡像

          格式1:docker ? rmi ? 倉庫名稱:標簽

          當一個鏡像有多個標簽時,只是刪除其中指定的標簽

          格式2: docker ? rmi ?鏡像ID ?[-f]

          如果該鏡像已經(jīng)被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像

          將鏡像保存為本地文件

          格式:docker ? save ? -o ?存儲文件名 ? 存儲的鏡像

          [root@localhost ~]# docker save -o /opt/nginx.tar nginx:latest
          #將本地鏡像傳給另一臺主機
          [root@localhost ~]# scp /opt/nginx.tar 192.168.1.54:/opt

          9.如何創(chuàng)建Docker容器?

          #docker images   --鏡像
          docker run -d --name centos7.8 -h centos7.8 \
          -p 220:22 -p 3387:3389 \
          --privileged=true \
          centos:7.8.2003 /usr/sbin/init

          #我想擁有一個 linux 8.2 的環(huán)境
          docker run -d --name centos8.2 -h centos8.2 \
          -p 230:22 -p 3386:3389 \
          --privileged=true \
          daocloud.io/library/centos:8.2.2004 init

          # 進入容器
          docker exec -it centos7.8bash
          docker exec -it centos8.2 bash
          cat /etc/redhat-release    --查看系統(tǒng)版本

          10.Docker在后臺的標準運行過程是什么?

          當利用 docker run 來創(chuàng)建容器時, Docker 在后臺的標準運行過程是:

          • 檢查本地是否存在指定的鏡像。當鏡像不存在時,會從公有倉庫下載;
          • 利用鏡像創(chuàng)建并啟動一個容器;
          • 分配一個文件系統(tǒng)給容器,在只讀的鏡像層外面掛載一層可讀寫層;
          • 從宿主主機配置的網(wǎng)橋接口中橋接一個虛擬機接口到容器中;
          • 分配一個地址池中的 IP 地址給容器;
          • 執(zhí)行用戶指定的應用程序,執(zhí)行完畢后容器被終止運行。

          11.Docker網(wǎng)絡模式有哪些?

          host模式

          host 模式 :使用 --net=host 指定

          相當于VMware 中的橋接模式,與宿主機在同一個網(wǎng)絡中,但是沒有獨立IP地址

          Docker 使用了Linux 的Namespace 技術(shù)來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統(tǒng),Network Namespace 隔離網(wǎng)絡等。

          一個Network Namespace 提供了一份獨立的網(wǎng)絡環(huán)境,包括網(wǎng)卡,路由,iptable 規(guī)則等都與其他Network Namespace 隔離。

          一個Docker 容器一般會分配一個獨立的Network Namespace

          但是如果啟動容器的時候使用host 模式,那么這個容器將不會獲得一個獨立的Network Namespace ,而是和宿主機共用一個Network Namespace 。容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機的IP和端口.此時容器不再擁有隔離的、獨立的網(wǎng)絡棧。不擁有所有端口資源

          container模式

          container模式:使用–net=contatiner:NAME_or_ID 指定

          這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP,端口范圍等。 可以在一定程度上節(jié)省網(wǎng)絡資源,容器內(nèi)部依然不會擁有所有端口。

          同樣,兩個容器除了網(wǎng)絡方面,其他的如文件系統(tǒng),進程列表等還是隔離的。

          兩個容器的進程可以通過lo網(wǎng)卡設備通信

          none 模式

          none模式:使用 --net=none指定

          使用none 模式,docker 容器有自己的network Namespace ,但是并不為Docker 容器進行任何網(wǎng)絡配置。也就是說,這個Docker 容器沒有網(wǎng)卡,ip, 路由等信息。

          這種網(wǎng)絡模式下,容器只有l(wèi)o 回環(huán)網(wǎng)絡,沒有其他網(wǎng)卡。

          這種類型沒有辦法聯(lián)網(wǎng),但是封閉的網(wǎng)絡能很好的保證容器的安全性

          該容器將完全獨立于網(wǎng)絡,用戶可以根據(jù)需要為容器添加網(wǎng)卡。此模式擁有所有端口。(none網(wǎng)絡模式配置網(wǎng)絡)特殊情況下才會用到,一般不用

          bridge 模式

          相當于Vmware中的 nat 模式,容器使用獨立network Namespace,并連接到docker0虛擬網(wǎng)卡。通過docker0網(wǎng)橋以及iptables nat表配置與宿主機通信,此模式會為每一個容器分配Network Namespace、設置IP等,并將一個主機上的 Docker 容器連接到一個虛擬網(wǎng)橋上。

          當Docker進程啟動時,會在主機上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,此主機上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網(wǎng)絡中。

          從docker0子網(wǎng)中分配一個IP給容器使用,并設置docker0的IP地址為容器的默認網(wǎng)關(guān)。在主機上創(chuàng)建一對虛擬網(wǎng)卡veth pair設備。veth設備總是成對出現(xiàn)的,它們組成了一個數(shù)據(jù)的通道,數(shù)據(jù)從一個設備進入,就會從另一個設備出來。因此,veth設備常用來連接兩個網(wǎng)絡設備。

          Docker將veth pair 設備的一端放在新創(chuàng)建的容器中,并命名為eth0(容器的網(wǎng)卡),另一端放在主機中, 以veth*這樣類似的名字命名,并將這個網(wǎng)絡設備加入到docker0網(wǎng)橋中。可以通過 brctl show 命令查看。

          容器之間通過veth pair進行訪問

          使用 docker run -p 時,docker實際是在iptables做了DNAT規(guī)則,實現(xiàn)端口轉(zhuǎn)發(fā)功能。

          可以使用iptables -t nat -vnL 查看。

          12.什么是Docker的數(shù)據(jù)卷

          數(shù)據(jù)卷是一個供容器使用的特殊目錄,位于容器中??蓪⑺拗鳈C的目錄掛載到數(shù)據(jù)卷上,對數(shù)據(jù)卷的修改操作立刻可見,并且更新數(shù)據(jù)不會影響鏡像,從而實現(xiàn)數(shù)據(jù)在宿主機與容器之間的遷移。數(shù)據(jù)卷的使用類似于Linux下對目錄進行的mount操作。

          如果需要在容器之間共享一些數(shù)據(jù),最簡單的方法就是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器是一個普通的容器,專門提供數(shù)據(jù)卷給其他容器掛載使用。

          容器互聯(lián)是通過容器的名稱在容器間建立一條專門的網(wǎng)絡通信隧道。簡單點說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息

          13.如何搭建Docker私有倉庫

          1.拉取私有倉庫鏡像

          [root@jeames ~]# docker pull registry
          Using default tag: latest

          2.啟動私有倉庫容器

          docker run -di --name registry -p 5000:5000 registry
          docker update --restart=always registry   --開機自啟動
          docker ps -a  --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"

          訪問網(wǎng)址:http://192.168.1.54:5000/v2/_catalog

          3.設置信任

          [root@jeames ~]# vi /etc/docker/daemon.json
          {
          "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],
          "insecure-registries":["192.168.1.54:5000"]
          }

          [root@jeames ~]# systemctl restart docker   --重啟docker

          4.上傳本地鏡像

          [root@jeames ~]# docker images
          [root@jeames ~]# docker tag postgres:11 192.168.1.54:5000/postgres

          [root@jeames ~]# docker push 192.168.1.54:5000/postgres

          5.重新拉取鏡像

          [root@jeames ~]# docker rmi 192.168.1.54:5000/postgres
          [root@jeames ~]# docker images
          [root@jeames ~]# docker pull 192.168.1.54:5000/postgres

          14.Docker如何遷移備份?

          1.容器保存為鏡像

          [root@jeames ~]# docker images
          [root@jeames ~]# docker ps -a
          docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
          [root@jeames ~]# docker commit redis myredis
          ##使用新的鏡像創(chuàng)建容器
          docker run -di --name myredis myredis

          2.鏡像的備份

          [root@jeames ~]# docker save -o myredis.tar myredis

          默認放到當前目錄

          [root@jeames ~]# ll
          [root@jeames ~]# pwd

          3.恢復過程

          ##刪除容器
          docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
          docker stop myredis
          docker rm myredis
          ##刪除鏡像
          docker images
          docker rmi myredis
          [root@jeames ~]# docker load -i myredis.tar

          15. Docker如何部署MySQL?

          1.下載鏡像
          https://hub.docker.com/ 中搜索mysql
          [root@jeames ~]# docker pull mysql:5.7.30
          [root@jeames ~]# docker pull mysql:8.0.20
          2.安裝部署

          2.1 創(chuàng)建容器

          mkdir -p /usr/local/mysql5730/
          mkdir -p /usr/local/mysql8020/

          docker run -d --name mysql5730 -h mysql5730 \
          -p 3309:3306 \
          -v /usr/local/mysql5730/conf:/etc/mysql/conf.d \
          -e MYSQL_ROOT_PASSWORD=root -e TZ=Asia/Shanghai \
          mysql:5.7.30

          docker run -d --name mysql8020 -h mysql8020 \
          -p 3310:3306 \
          -v /usr/local/mysql8020/conf:/etc/mysql/conf.d \
          -e MYSQL_ROOT_PASSWORD=root -e TZ=Asia/Shanghai \
          mysql:8.0.20

          2.2 訪問Mysql

          ##登陸容器
          docker exec -it mysql5730 bash
          mysql -uroot -proot
          mysql> select user,host from mysql.user

          ##遠程訪問
          mysql -uroot -proot -h192.168.59.220 -P3309


          來源:blog.csdn.net/weixin_41645135/article/details/125513040

          瀏覽 117
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  国产女主播桃花视频 | 免费的黄色大片 | 一级毛片久久久久久久女人18 | 蜜桃av在线观看 免费A∨在线观看 | 伊人成人小说 |