Docker詳細介紹安裝與鏡像制作和拉取


一、Docker是什么?

  產生背景:

  • 開發和運維之間因為環境不同和導致的矛盾(不同的操作系統、軟件環境、應用配置等)DevOps    
  • 代碼、系統、環境、配置等封裝成鏡像Image--->運維;
  • 集群的環境下每台服務器都要配置相同的環境;
  • 解決“在我的機器是哪個可以正常工作”的問題;

  Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。

  阿里雲、百度雲等都支持Docker技術

二、Docker的作用

  1.Docker是一種容器技術:

  • 將軟件環境安裝並且配置好,打包成一個鏡像Image,然后將鏡像發布出去(Docker倉庫)
  • 其他的使用者可以在倉庫中下載獲取這個鏡像;
  • 通過Docker運行這個鏡像,就可以獲取通用的環境(容器);

  Docker簡化了環境的部署和配置,實現一個構建,處處運行,避免了因為運行環境的不一致而導致的異常;

  2.Docker容器技術與傳統的虛擬技術的區別:

  • 傳統虛擬技術:模擬一個完整的操作系統,先虛擬出一套硬件,然后在其上安裝操作系統,最后在系統上運行應用程序;
  • Docker容器技術:不是模擬一個完整的操作系統,沒有進行硬件的虛擬,而是對進程進行隔離,封裝成容器,容器內的應用程序是直接使用宿主機的內核,且容器之間是相互隔離的,互不影響;優點:更輕便、效率高、啟動快、秒級;

  3.基本術語:

  • Docker主機(Host)安裝了Docker程序的主機,運行Docker守護進程;
  • Docker鏡像(Image)將軟件環境打包好的模板,用來創建容器的,一個鏡像可以創建多個容器;
  • Docker容器(Container)運行鏡像后生成的實例稱為容器,沒運行一次鏡像就會產生一個容器,容器可以啟動、停止或刪除容器使用的是沙箱機制,相互隔離,是獨立是安全的;可以把容器看作是一個簡易版的Linux環境,包括用戶權限、文件系統和運行的應用等;
  • Docker倉庫(Repository)用來保存鏡像的,倉庫中包含許多鏡像,每個鏡像都有不同的標簽Tag;

    官方倉庫:https://hub.docker.com/

  4.使用Docker的步驟:

  ①.安裝Docker

  ②.從Docker倉庫中下載軟件對應的鏡像;

  ③.運行這個鏡像,此時會生成一個Docker容器;

  ④.對容器的啟動/停止就是對軟件的啟動/停止;

三、准備Linux系統:

  1.安裝虛擬機軟件 

 VMware、VirtualBox
 Ubuntu、RHEL、CentOS、Debian、SLES(SUSE)

  2.新建虛擬機:

 版本:Red Hat(64­bit)
 網絡:橋接網卡
 光驅:選擇操作系統的iso文件

  3.安裝CentOS(我個人喜歡裝CentOS)

  4.連接Linux服務器:

步驟:
1. 查看服務器ip地址、在虛擬機中執行 ip addr 
2. 連接服務器 在客戶端中執行 ssh 服務器賬戶@服務器地址 ,然后輸入密碼 注:SSH是Secure Shell的縮寫,用於遠程登陸訪問的協議

   5.基本操作

    5.1常用命令:

cat /proc/cpuinfo  # 查看cpu信息
cat /proc/meminfo  # 查看內存信息 
uname ­-r # 查看內核信息,Docker要求CentOS必須是64位,且內核是3.10及以上 
sudo reboot # 重啟,sudo表示以管理員root身份執行 
sudo halt # 關

    5.2安裝軟件:

     使用yum,是一個基於rpm的軟件包管理工具;

       用來安裝軟件包,可以自動解決軟件包之間的依賴關;

yum install 軟件包名  #  安裝 

yum remove 軟件包名 # 卸載

四、Docker安裝:

  1.安裝:

  Docker版本:社區版CE、企業版EE;

# 設置yum源 
yum install -­y yum­-utils device-­mapper­-persistent-­data lvm2 
yum­-config­-manager --­­add­--repo https://download.docker.com/linux/centos/docker-­ce.repo 
yum makecache fast # 安裝Docker-­CE
yum -­y install docker-­ce

  2.啟動/停止

docker version # 查看版本
systemctl start docker #  啟動 
systemctl stop docker  # 停止 
systemctl status docker #  查看狀態 
systemctl restart docker    # 重啟 
systemctl enable docker  # 設置開機自動啟動 
# 驗證,運行hello­world 
docker run hello­-world  # 下載hello­world鏡像並運行

  3.配置Docker鏡像加速

    使用阿里雲提供的鏡像加速(鏡像倉庫),也可以使用網易雲等;

    步驟:

      ①.注冊並登陸“阿里雲的開發者平台”http://dev.aliyun.com;

      ②.查看專屬的加速器地址;

      ③.配置自己的Docker加速器;

vi /etc/docker/daemon.json 
    {            
    "registrymirrors": ["https://sswv6yx0.mirror.aliyuncs.com"]      } systemctl daemon­-reload systemctl restart docker

五.Docker操作:

  輸入docker可以查看Docker的命令用法,輸入docker COMMAND --help查看指定命令的詳細用法;

  1.鏡像操作:

操作 命令 說明
查找 docker search關鍵字 可以在Docker Hub網站查看鏡像的詳細信息,如鏡像的tag標簽 
抽取 docker pull 鏡像名:tab :tag表示軟件的版本,如果不指定默認是latest
列表 docker images 查看所有本地鏡像
獲取元信息 docker inspect 鏡像id 獲取鏡像的元信息,詳細信息
刪除 docker mi -f 鏡像id或鏡像名:tag 刪除指定的本地鏡像,­f表示強制刪除

  2.容器操作:

操作 命令 說明
運行

docker run ­­name 容器名 ­i  ­t ­p 主機端口:容器端口  ­d   ­v 主機目錄:容器目錄:ro 鏡 像id或鏡像名稱:tag

­­name 指定容器名,名稱自定義,如果不指定會自動命名; ­i 以交互模式運 行,即以交互模式運行容器;­t 分配一個偽終端,即命令行,通常組合使用­it  ;­p 指定端口映射,將主機端口映射到容器內的端口;­d 表示后台運行,即守 護式運行容器;­v 指定掛載主機目錄到容器目錄,默認為rw讀寫模式,ro表示 只讀

列表 docker ps ­a  ­q 查看正在運行的容器,­a表示顯示所有容器,­q表示只顯示容器id
啟動 docker start 容器id或容器名 稱 啟動容器
停止

docker stop 容器id或容器名 稱

停止正在運行的容器
刪除

docker rm ­f 容器id或容器名 稱

刪除容器,-f表示強制刪除
日志 docker logs 容器id或容器名 獲取容器的日志
在容器中執行

docker exec ­it 容器id或容 器名稱 /bin/bash

進入正在運行的容器中並開啟一個交互模式的終端,可以在容器中執行操作
拷貝文件 docker cp 主機中的文件路徑 容器id或容器名稱:容器中的文件路徑 主機路徑 將文件中的文件拷貝到容器中;將容器中的文件拷貝到主機中
獲取元信息 docker inspect 容器id 獲取容器的元信息

       以CentOS為例:

docker search centos 
docker pull centos 
docker run ­­--name mycentos ­-it centos:latest  # 根據centos:latest鏡像運行容器,並以交互模式 進入容器中 
# 實際上是在Docker容器中運行一個精簡版的CentOS系統  
exit # 退出並關閉容器 
docker ps ­-a 
docker start mycentos 
docker stop mycentos 
docker rm mycentos 
docker rm -­f $(docker ps ­aq)  # 強制刪除所有容器

注釋:Docker容器內實際上是運行着一個精簡版的Linux系統

       以tomcat為例:

# 示例1:基本用法 
docker search tomcat
docker pull tomcat 
docker run ­­--name mytomcat ­-p 8888:8080 -­d tomcat  
# 測試:http://宿主機地址:8888 
docker stop mytomcat 
docker ps ­-a 
docker start mytomcat   

# 示例2:拷貝文件和掛載目錄 
docker run ­-p 8080:8080 ­-d tomcat 
docker exec -­it 70cba924861c  /bin/bash cd /usr/local/tomcat/webapps/ROOT
exit 
echo welcome to tomcat > index.jsp docker cp index.jsp 70cba924861c:/usr/local/tomcat/webapps/ROOT  # 將宿主機中的文件拷貝到 容器中指定的目錄中 
#  部署web項目,將war文件放到容器中 
docker cp spring-web.war 70cba924861c:/usr/local/tomcat/webapps   
# 問題:如果項目更改了需要重新拷貝war文件,太麻煩,可以直接掛載目錄(也稱為數據卷Volume) 
docker run \ 
-­p 8080:8080 \ ­
-v /my/tomcat/webapps/spring­web.war:/usr/local/tomcat/webapps/spring­web.war\
-­v /my/tomcat/data:/usr/local/tomcat/dataVolume:ro \ 
-­d tomcat   
# 示例3:啟動多個容器,一個鏡像可以啟動多個容器,互相隔離、獨立 
docker run ­
-p 8081:8080 ­-d tomcat docker run -­p 8082:8080 ­-d tomcat docker run ­-p 8083:8080 ­-d tomcat

  3. 鏡像的分層結構  
      tomcat鏡像為什么這么大?
      鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基於運行環境的軟件,包含運行某個 軟件所需要的所有內容。 
      基於UnionFS聯合文件系統,采用分層結構,一層一層的堆疊起來,像一個同心圓,但從外面來說,只能看到 最外層的文件系統(鏡像層)

  

    

     分層結構:共享資源、便於復用(許多鏡像都是從相同的Base基礎鏡像構建而來的,基礎鏡像只需要保存一份)
     鏡像都是只讀的,而由鏡像生成的容器是可修改的

  4.創建鏡像

    有時Docker鏡像倉庫中下載的鏡像不能滿足我們的要求,此時可以基於這個鏡像(基礎鏡像)封裝一個自己的鏡像

    兩種方式:

      • 更新鏡像:使用docker commit命令
      • 構建鏡像:使用docker build命令,需創建Dockerfile文件         

     4.1.更新鏡像:

      先使用基礎鏡像創建一個容器,然后對容器進行修改,最后使用commit命令提交為一個新的鏡像

      步驟:

         ①.根據基礎鏡像,創建容器;      

docker run --­­name mytomcat ­-p 8080:8080 ­-d tomcat

         ②.修改容器:

docker exec -­it bcd08edac78d  /bin/bash 
cd webapps/ROOT 
rm ­-f index.jsp 
echo welcome to tomcat > index.html 
exit

         ③.提交為新鏡像,語法:docker commit -m="描述信息" -a="作者" 容器id或容器名 鏡像名:tag

docker commit ­m="修改默認索引頁" ­a="小明" bcd08edac78d test/tomcat:v1

         ④.使用新鏡像運行容器:

docker run ­­name tomcat_v1 ­p:8080:8080 ­d test/tomcat:v1

    4.2構建鏡像:

      根據Dockerfile文件來自動構建鏡像

      Dockerfile是一個包含創建鏡像所有命令的文本文件,使用docker build命令可以根據Dockerfile的內容創建鏡像

      步驟:

        ①.創建一個Dockerfile文件vi Dockerfile

# 基礎鏡像 
FROM tomcat   
# 作者 
MAINTAINER 郵箱地址填寫   # 執行命令 RUN 
rm ­-f /usr/local/tomcat/webapps/ROOT/index.jsp
RUN echo "welcome to tomcat!" > /usr/local/tomcat/webapps/ROOT/index.html

        ②.構建新鏡像,語法:docker build -f Dockerfile文件的路徑 -t 鏡像名:tag 命令執行的上下文

docker build -f Dockerfile -t test/tomcat:v2

        ③.使用新建鏡像運行容器

docker run -p 9999:8080 -d test/tomcat:v2

六、Dockerfile詳解

  1.簡介:

    Dockerfile是用來構建Docker鏡像的文件,是由一系列命令和參數構成的腳本

    Dockerfile從FROM命令開始,緊接着各種命令、參數等,最終會生成一個新的鏡像

    使用Dockerfile構建鏡像的步驟:

      ①.編寫Dockerfile文件

      ②.使用docker build構建鏡像

      ③.使用docker run運行容器

  2.用法:

    2.1語法規則:

      • 指令必須要大寫,且后面必須跟參數;
      • 第一條指令必須是FROM,指定Base Image基礎鏡像
      • 指定按從上往下的順序,依次執行
      • 每條指定都會創建一個新的鏡像層並提交
      • #表注釋          

    2.2常用指令:

指令 解釋
FROM 指定基礎鏡像,即當前鏡像是基於那個鏡像的
MAINTAINER 指定作者
RUN 指定構建過程中需要運行的命令
ENV 設置環境變量
WORKDIR 指定默認的工作目錄,即進入容器后默認進入的目錄
VOLUME 創建掛載點,也稱容器數據卷,用於數據共享和持久化
CMD 指定容器啟動時要運行的命令,與RUN不同的是,這些命令不是在鏡像構建過程中執行的
ENTRYPOINT 指定容器啟動時要運行的命令,與CMD有區別 
COPY 拷貝文件/目錄到鏡像中 
ADD 拷貝文件到鏡像中,且會自動解壓縮 
EXPOSE 指定對外暴露的端口

  3.按列

    3.1自定義centos鏡像

1.編寫Dockerfile文件 
vi Dockerfile2 
  FROM centos       
  MAINTAINER 郵箱地址填寫        
  ENV MYPATH /usr/local/centos      
  RUN mkdir ­-p $MYPATH      
  WORKDIR $MYPATH        
  RUN yum ­-y install vim        
  RUN yum ­-y install wget        
  # 創建掛載點,無法指定宿主機上對應的目錄,是自動生成的     
    VOLUME  [
"/data1","/data2"]            CMD ["/bin/bash"]     
2.使用docker build構建鏡像 docker build ­-f Dockerfile2 ­-t test/centos:v1 .  # 3.使用docker run運行容器 docker run -­it b25b1dad795c # 查看鏡像的變更歷史 docker history b25b1dad795c # 驗證掛載點:
/var/lib/docker/volumes/0b001b4cc8db1ebbbb4c537c17a5c44adb700fb0e1b941bc82cc717c4ae196f 6/_data
/var/lib/docker/volumes/f020f5a5664bf68312be9f49a640f27ecfb49990b231aaf3d0eb7cb723fa0dd d/_data

 CMD和ENTRYPOINT的區別(面試題):

  • CMD    

   在Dockerfile中可以有多個CMD指令,但只有最后一條指令生效,所以一般只有一條CMD指令 CMD指令在被docker run之后的參數覆蓋

 

vi aaa 
  FROM centos     
  CMD ["/bin/ls"]     
  CMD ["/bin/bash"]     
docker build ­-f aaa ­-t test/aaa . 
docker run -­it test/aaa
docker run -­it test/aaa /bin/pwd
  • ENTRYPOINT  

  docker run之后的參數會被作為ENTRYPOINT指令的參數,組合形成新的命令

vi bbb 
  FROM centos     
  ENTRYPOINT ["/bin/ls","/usr/local"]     
docker build -­f bbb -­t test/bbb .
docker run -­it test/bbb
docker run -­it test/bbb ­-l  #  ls /usr/local -­l

    3.2自定義tomcat鏡像:

#准備工作

#1.編寫Dockerfile文件
vi Dockerfile
  FROM centos
  MAINTAINER 郵箱地址填寫
  #拷貝文件,文件必須與Dockerfile在同一目錄下
  COPY teacher.txt /usr/local     
  ADD jdk-­8u171­-linux-­x64.tar.gz /usr/local     
  ADD apache­-tomcat-­8.5.30.tar.gz /usr/local           

  # 配置環境變量     
  ENV JAVA_HOME /usr/local/jdk1.8.0_171     
  ENV CLASSPATH .:$JAVA_HOME/lib     
  ENV CATALINA_HOME /usr/local/apache-­tomcat­-8.5.30     
  ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
           
  WORKDIR $CATALINA_HOME           
  RUN yum -­y install vim
           
  EXPOSE 8080     
     
  CMD ["catalina.sh", "run"]     
# 2.使用docker build構建鏡像
docker build -­t test/tomcat:1.0 .
# 3.使用docker run運行容器
docker run \
­­--name mytomcat \
-­p 8080:8080 \
-­v /my/tomcat/webapps/spring­web.war:/usr/local/apache-­tomcat­8.5.30/webapps/spring-web.war \
-­d itany/tomcat:1.0
  

七、使用Docker搭建環境

  1.安裝MySQL 

1.拉取鏡像 
docker pull mysql:5.72.運行容器 
docker run ­­--name mysql ­-p 3306:3306 ­-e MYSQL_ROOT_PASSWORD=root ­-d mysql:5.7 
docker exec ­-it mysql /bin/bash 
find / -­name "*mysql*" 
exit 
3.創建用於掛載的目錄 mkdir -­p /my/mysql/conf # 掛載配置文件 mkdir -­p /my/mysql/data # 掛載數據文件 mkdir ­-p /my/mysql/logs # 掛載日志文件
4.拷貝配置文件並修改
docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf /my/mysql/conf/
vi /my/mysql/conf/mysqld.conf
  character­-set­-server=utf8     
5.重新運行容器   docker rm ­-f mysql  # 刪除原來的容器 docker run \ ­­
--name mysql \ ­-p 
3306:3306 \ ­ -v /my/mysql/conf:/etc/mysql/mysql.conf.d/ \ ­v /my/mysql/data:/var/lib/mysql \ ­ -v /my/mysql/logs:/logs \ ­ -e MYSQL_ROOT_PASSWORD=root \ ­ -d mysql:5.76.訪問 # 本地訪問 docker exec -­it mysql /bin/bash mysql -­u root -­p  # 遠程訪問 mysql -­u root ­-p ­-h 宿主機地址

   2.安裝Redis

  

1.拉取鏡像 
docker pull redis 
# 2.創建用於掛載的目錄 
mkdir ­-p /my/redis/conf  
mkdir ­-p /my/redis/data 
# 3.拷貝配置文件並修改 
wget http://download.redis.io/releases/redis-­4.0.10.tar.gz 
tar zxf redis-­4.0.10.tar.gz
cp redis.conf /my/redis/conf/ vi redis.conf
  requirepass test     
  appendonly yes      # 
4.運行容器 docker run \ ­­ --name myredis \ ­ -p 6379:6379 \
-­v /my/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-­v /my/redis/data:/data \ ­ -d redis redis­server /usr/local/etc/redis/redis.conf #  5.訪問
# 本地訪問 docker exec ­-it myredis 
/bin/bash redis-­cli #  遠程訪問 使用RedisDesktopManager工具連接

  3.安裝Nginx

1.拉取鏡像 
docker pull nginx 
# 2.運行容器 
docker run ­­--name mynginx -­p 80:80 ­-d nginx 
# 3.創建用於掛載的目錄 
mkdir ­-p /my/nginx  # 掛載nginx所有數據 
mkdir ­-p /my/nginx/html # 掛載nginx虛擬主機(網站html數據) 
# 4.拷貝配置文件 
docker cp mynginx:/etc/nginx/nginx.conf /my/nginx  # 拷貝主配置文件 
docker cp mynginx:/etc/nginx/conf.d /my/nginx # 拷貝虛擬主機配置文件
echo welcome to nginx > /my/nginx/html/index.html #  自定義索引頁
5.重啟運行容器 docker rm ­-f mynginx docker run \ --­­name mynginx \ -­p 80:80 -­p 443:443 \ -­v /my/nginx/nginx.conf:/etc/nginx/nginx.conf \ -­v /my/nginx/html:/usr/share/nginx/html:ro \ -­v /etc/nginx/conf.d:/usr/nginx/conf.d \ ­ -d nginx # 6.測試 http://宿主機地址

八、將本地鏡像發布到阿里雲

  步驟:

    1.登陸“阿里雲-開發者平台”,創建命名空間和鏡像倉庫

    2.將鏡像推送到阿里雲

    

# 登陸阿里雲的docker倉庫 
docker login ­­--username=注冊的阿里雲的賬號 registry.cn­-hangzhou.aliyuncs.com 
# 創建指定鏡像的tag,歸入某個倉庫
docker tag b25b1dad795c registry.cn-­hangzhou.aliyuncs.com/itany/centos:v1.0
# 將鏡像推送到倉庫中
docker push registry.cn­-hangzhou.aliyuncs.com/itany/centos:v1.0

    3.拉取鏡像

docker pull registry.cn-­hangzhou.aliyuncs.com/itany/centos:v1.0

 

以上為我學習docker的時候做的的一些總結,有整理的不對的地方還希望可以評論指正!

 

 

 

  


免責聲明!

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



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