1 容器軟件docker簡介+三大概念


一、docker簡介

1.docker是什么?

Docker是一款容器軟件。

Docker 是一個開源項目,誕生於2013年初,最初是 dotCloud 公司內部的一個業余項目。它基於Goole公司推出的 Go 語言實現。項目后來加入了Linux基金會,遵從了 Apache2.0協議,項目代碼在GitHub上進行維護。

Docker 是一個開源的引擎,可以輕松地為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何支持docker的機器上運行。容器是完全使用沙盒機制,相互之間不會有任何接口調用。

Docker 的思想來自於集裝箱,集裝箱解決了什么問題?在一艘大船上,可以把貨物規整地擺放起來。並且各種各樣的貨物被裝在集裝箱里,集裝箱和集裝箱之間不會互相影響。那么我就不需要專門運送熟菜的船和專門運送貨物的船了。只要這些貨物在集裝箱里封裝得好好的就行。那我就可以用一艘大船把他們都運走。

docker 就是類似的理念。雲計算就好比大貨輪。docker 就是集裝箱。

2、docker的優點

在雲時代,開發者創建的應用必須要能很方便地在網絡上傳播,也就是說應用必須脫離底層物理硬件的限制;同時必須滿足“任何時間任何地點”可獲取可使用的特點。因此,開發者們需要一種新型的創建分布式應用程序的方式,快速分發部署,而這正是Docker所能夠提供的最大優勢。Docker提供了一種更為聰明的方式,通過容器來打包應用、解耦應用和運行平台。這意味着遷移的時候,只需要在新的服務器上啟動需要的容器就可以了,無務論新舊服器是否是同一類別的平台。這無疑幫助我們節約了大量的寶貴時間,並降低部署過程出現問題的風險。

(1)快

運行時的性能快,管理操作(啟動、停止、開始、重啟等等)都是以秒或毫秒為單位的。

(2)敏捷

像虛擬機一樣敏捷,而且會更便宜,在bare metal (裸機)上部署像點一個按鈕一樣簡單。

(3)靈活

將應用和系統“容器化”,不添加額外的操作系統。

(4)輕量

在一台服務器上可以部署100-1000個Containers容器。

(5)便宜

開源的,免費的,低成本的。

docker-ce:社區版

docker-ee:商業版

3、docker的缺點

所有容器共用 linux kernel 資源,資源能否實現最大限度利用,所以在安全上也會存在漏洞。

4、Docker與虛擬機的比較

 

在雲時代,開發者創建的應用必須要能很方便地在網絡上傳播,也就是說應用必須脫離底層物理硬件的限制;同時必須滿足“任何時間任何地點”可獲取可使用的特點。因此,開發者們需要一種新型的創建分布式應用程序的方式,快速分發部署,而這正是Docker所能夠提供的最大優勢。Docker提供了一種更為聰明的方式,通過容器來打包應用、解耦應用和運行平台。這意味着遷移的時候,只需要在新的服務器上啟動需要的容器就可以了,無務論新舊服器是否是同一類別的平台。這無疑幫助我們節約了大量的寶貴時間,並降低部署過程出現問題的風險。

 

 

 5.docker與虛擬化

Docker以及其他容器技術,都屬於操作系統虛擬化范疇,操作系統細膩化最大的特點就是不需要額外的supervisor支持。Docker虛擬化方式之所以有眾多優勢,跟操作系統虛擬化技術自身的設計和實現分不開。

 

 

 

傳統方式是在硬件層面實現虛擬化,需要有額外的虛擬機管理應用和虛擬機操作系統層。Docker容器時在操

作系統層面實現虛擬化,直接復用本地主機的操作系統,因此更加輕量級。

二、安裝部署docker

下載鏈接:https://www.docker.com/products/docker-desktop

windows :
mac
linux

docker分為兩個版本:
docker-ce : 社區版
docker-ee :企業版

linux 3.10的內核 有BUG

1、升級系統內核
    [root@localhost ~]# wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.167-1.el7.elrepo.x86_64.rpm    #下載內核
    [root@localhost ~]# wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.167-1.el7.elrepo.x86_64.rpm   #下載內核拓展包
    # 安裝
    [root@localhost ~]# yum localinstall -y kernel-lt*
    # 啟動時自動選擇最新的系統版本
    [root@localhost ~]# grub2-set-default  0 && grub2-mkconfig -o /etc/grub2.cfg
    # 查看最新的系統內核啟動版本
    [root@localhost ~]# grubby --default-kernel
    # 重啟生效
    [root@localhost ~]# reboot
    # 檢測
    [root@localhost ~]# uname -a

2、安裝依賴包

[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

3、添加軟件源信息

 [root@localhost ~]# sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4、更新並安裝Docker-CE

 [root@localhost ~]# sudo yum makecache fast
 [root@localhost ~]# sudo yum -y install docker-ce-19.03.9

    k8s支持的最新的版本,也是最穩定的版本是19

5、啟動Docker

[root@localhost ~]# systemctl start docker

6、檢測docker

    [root@localhost ~]# docker info

7、加速docker(登錄阿里雲——產品——容器與中間件——容器鏡像服務ACR--管理控制台——鏡像工具——鏡像加速器——選centos的鏡像加速器)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": ["https://8mh75mhz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

檢測是否成功加速:執行docker info 看下是否有aliyun的鏡像

 

 

 

 三、docker的概念和基本使用

1.docker三大核心概念

 

(1)鏡像 :鏡像是啟動容器的模板
(2)容器 :是對外提供服務的實例
(3)倉庫(Harbor) :存放鏡像的地方

官方倉庫:hub.docker.com
第三方:阿里雲、華為雲
docker login [URL]
docker login registry.cn-hangzhou.aliyuncs.com

2.鏡像

鏡像是啟動容器的模板,同一個鏡像啟動的所有的容器完全相同

2.1下載鏡像

 

        docker pull [倉庫的URL]/[命名空間]/[鏡像名稱]:[版本號]
        例:docker pull nginx
        
        docker info查看:
        默認的倉庫URL:https://index.docker.io/v1/
        默認的命名空間:library
        默認的版本號:latest
        
        index.docker.io/library/nginx:latest等同於下載nginx,因為有默認值

2.2、查看本機鏡像列表

        [root@localhost ~]# docker images
        [root@localhost ~]# docker image ls
        REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
        nginx        latest    f6987c8d6ed5   6 days ago   141MB
        倉庫名       版本       鏡像ID         創建距離現在的時間 大小

2.3 查看鏡像的詳情

docker inspect [鏡像名稱|ID]
        例:docker inspect nginx

2.4 鏡像tag(別名)

docker tag [鏡像ID] [新的名稱]
        例:docker tag f6987c8d6ed5 xiaodocker

2.5 登錄倉庫(鏡像上傳到倉庫需要先登錄倉庫)

docker login [倉庫的URL地址]
        默認的倉庫地址:hub.docker.com
        例:[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.
   輸入用戶名,密碼(需要https://hub.docker.com/注冊才可以登錄哦)
   vim /root/.docker/config.json   #里面保存了用戶登錄的地址和密碼TOKEN值,第二次來不需要登錄

2.6、上傳鏡像

 第一步:打tag(要寫全了,不寫全了使用默認的)
            [root@localhost ~]# docker tag f6987c8d6ed5 alvinos/nginx:v2
            查看docker images 多一條數據
第二步:上傳 [root@localhost
~]# docker push alvinos/nginx:v2

2.7 刪除鏡像(rmi是rm image的縮寫)

docker rmi [鏡像的名稱|ID]
  [root@localhost ~]# docker rmi alvinos/nginx:v2

注:docker鏡像只能創建和刪除,不能修改。
    docker的ID全宇宙唯一

 

3.容器

     對外提供服務的實例。

 3.1.容器生命周期

 

容器內的進程至少有一個進程運行在前台。

 

3.2、啟動一個容器(鏡像是啟動容器的模板,所以啟動鏡像的時候要加上鏡像的名稱或者id)

 

 

docker run [參數] [鏡像名稱|ID] [啟動命令]
    例:docker run centos(沒有的話會下載)
      docker run nginx    #啟動容器最簡單的命令

    參數:(docker run --help)
        -d     : 以守護進程方式運行
        --rm   : 當容器生命周期結束時,立即刪除該鏡像
        --name : 指定容器名稱
        -e     : 指定容器內部的環境變量
        -h     : 指定容器的主機名
        -p     : 端口映射(固定)   #要在互聯網訪問,需要端口映射
        -P     : 端口映射(隨機)
        -i     : 打開標准輸出(將容器內部的標准輸出接入到命令行中,正常與-t組合使用)     
        -t     : 創建一個命令行(偽終端)
         -v     : 添加一個目錄映射

        --link
        --network

 

例:[root@localhost ~]# docker run -d nginx    #后台運行容器
  [root@localhost ~]# docker run --rm nginx   當容器生命周期結束時,立即刪除該鏡像
  [root@localhost ~]# docker run -d --name nginx nginx   # --name 指定容器名稱
  [root@localhost ~]# docker run -d --name nginxv1 -e NGINX_NAME=nginx nginx     #-e 指定容器內部的環境變量
  [root@localhost ~]# docker run -d --name nginxv2 -e NGINX_NAME=nginx -h hostnames nginx  # -h 指定容器的主機名
  [root@localhost ~]# docker run -d --rm --name nginxv3 -p 30000:80 nginx   #,要在互聯網訪問,需要-p端口映射,此時可訪問192.168.15.105:30000
  64064393f87b5f2018142e014bdd020890c4310605c0c0cd97ce6c29a54b2b4d
[root@localhost ~]# docker run -d --rm --name nginxv4 -P nginx
3a86c4d34bdf8a2f1f3a2e8948c831c3c58c22443690fa2132fdbbdbf6599cbd

[root@localhost ~]# docker run -it --rm centos  #將容器內部的標准輸出接入到命令行

[root@localhost ~]# ll /tmp
total 0
[root@localhost ~]# docker run --rm -d --name nginxv6 -P -v /tmp/:/usr/share/nginx/html nginx
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                   NAMES
510f2a49b418   nginx     "/docker-entrypoint.…"   5 seconds ago        Up 4 seconds        0.0.0.0:4001->80/tcp    nginxv6
[root@localhost ~]# echo "Hello word" >> /tmp/index.html
[root@localhost ~]# docker exec nginxv6 cat /usr/share/nginx/html/index.html
Hello word

[root@localhost ~]#  yum install pip3 
[root@localhost ~]# pip install django
[root@localhost ~]# django-admin startproject linux
[root@localhost ~]# cd linux/
[root@localhost linux]# django-admin startapp application
[root@localhost linux]# python3 manage.py runserver 0.0.0.0:8000 
此時訪問http://192.168.15.105:8000/ 會出現django 界面
那么,如何在容器里面做呢,首頁映射到容器里
[root@localhost linux]# cd ..
[root@localhost ~]# docker run --name django -it --rm -p 8000:8000 -v /root/linux/:/opt/ python:3.6 bash
root@379a06657ab0:/# cd /opt
root@379a06657ab0:/opt# ls
application  linux  manage.py
root@379a06657ab0:/opt# pip install django
root@379a06657ab0:/opt# python3 manage.py runserver 0.0.0.0:8000
此時訪問http://192.168.15.105:8000/ 會出現django 界面

[root@localhost ~]#cd linux/
[root@localhost linux]# cd application/
[root@localhost application]# ll
[root@localhost application]# vim views.py
   def index(request):
      return HttpResponse("hello world")
 [root@localhost application]# cd ..
 [root@localhost linux]#cd linux/
 [root@localhost linux]#vim urls.py 
 path("",views.index)
 root@379a06657ab0:/opt# python3 manage.py runserver 0.0.0.0:8000
 此時訪問192.168.15.105:8000,出現hello world

 

docker start : 啟動一個容器
docker stop :停止一個容器
docker create :創建一個容器

docker run 和 docker create 之間有兩個區別
1、docker run創建容器並立即啟動,而docker create 只是創建
2、docker run創建的容器時up狀態,而docker create創建的容器是create

3.3、查看本機運行的容器列表

docker ps
    -a : 顯示本機上的所有的容器
    -q :  只顯示ID
    例: docker ps    #查看本機上運行的容器
        docker ps -a  #顯示機器上的所有容器
        docker ps -a -q #顯示機器上所有容器的id

3.4在容器內部執行命令

docker exec [容器名稱] [命令]
    [root@localhost ~]# docker exec nginxv1 printenv    #打印nginxv1的環境變量
    
    進入容器:
        docker exec -it [容器名稱] bash
        [root@localhost ~]# docker exec -it hungry_wright bash

3.5 刪除容器

docker rm [容器ID或名稱]
    
    -f : 強制刪除
    [root@localhost ~]# docker rm -f 379a06657ab0   #刪除某個容器
    
    [root@localhost ~]# docker rm -f $(docker ps -a -q)  #刪除所有容器

 

 

 

 

 
        

 

 
        

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.6 保存容器和鏡像

3.61 直接將容器保存成本地鏡像

docker commit 
    docker commit --help
    Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    
    參數:
        -a : 作者
        -m : 提交時解釋信息
        -p : 保存容器時,是否暫停運行容器

    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
    7390f1d18977   nginx     "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   80/tcp    hungry_wright
    [root@localhost ~]# docker commit -a "Linux" -m 'init' -p hungry_wright test:v1

 

 

3.62 、將本地的容器保存成鏡像壓縮包

  1、保存容器為鏡像壓縮包

docker export 
    -o, --output string   Write to a file, instead of STDOUT
    [root@localhost ~]# docker export -o nginx.tar hungry_wright

2、解壓容器壓縮包成鏡像

docker import 
    [root@localhost ~]# docker import nginx.tar test:v2
    [root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test         v2        152d9c19a28f   8 seconds ago    140MB

3.63、將本地的鏡像保存成鏡像壓縮包

    1.保存鏡像為鏡像壓縮包

    docker save 
    Options:
  -o, --output string   Write to a file, instead of STDOUT
    [root@localhost ~]# docker save -o nginxv1.tar python:3.6 nginx:latest

      2.解壓鏡像壓縮包為鏡像

docker load 
    Options:
  -i, --input string   Read from tar archive file, instead of STDIN
  -q, --quiet          Suppress the load output
    [root@localhost ~]# docker load -i nginxv1.tar 

3.64 save 和 export之間的區別

 1、針對的對象不一樣
2、save保存的鏡像更加完善

 

 

 

 

 

 

 虛懸鏡像是倉庫名和標簽為none

 

 

 

 

 

 

 

 

 
        

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM