1. 程式人生 > >最新最全的Docker入門視頻課程——隨堂筆記

最新最全的Docker入門視頻課程——隨堂筆記

teacher 表示 主機 .gz try 空間 vim 服務 pen

視頻課程鏈接 http://edu.51cto.com/course/14479.html

Docker容器技術,主講:湯小洋

一、Docker簡介

1. Docker是什麽?

? 產生背景:

  • 開發和運維之間因為環境不同而導致的矛盾(不同的操作系統、軟件環境、應用配置等) DevOps
  • 集群環境下每臺服務器都配置相同的環境,太麻煩
  • 解決“在我的機器上可以正常工作”的問題

? Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。
? 阿裏雲、百度雲等都支持Docker技術

?   官網:https://www.docker.com/
?   中文官網:http://www.docker-cn.com/

2. Docker作用

? Docker是一種容器技術,使用Docker可以:

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

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

? 可以將Docker簡單的認為是一個虛擬機,可以運行各種軟件環境的虛擬機,但與傳統虛擬機技術有所不同

? Docker容器技術與傳統虛擬機技術的區別:

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

3. 基本術語

? 術語:

  • Docker主機(Host)

    安裝了Docker程序的主機,運行Docker守護進程

  • Docker鏡像(Image)

    將軟件環境打包好的模板,用來創建容器的,一個鏡像可以創建多個容器

  • Docker容器(Container)

    運行鏡像後生成的實例稱為容器,每運行一次鏡像就會產生一個容器,容器可以啟動、停止或刪除

    容器使用是沙箱機制,互相隔離,是獨立是安全的

    可以把容器看作是一個簡易版的Linux環境,包括用戶權限、文件系統和運行的應用等

  • Docker倉庫(Repository)

    用來保存鏡像的,倉庫中包含許多鏡像,每個鏡像都有不同的標簽Tag

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

?
使用Docker的步驟:

1. 安裝Docker
2. 從Docker倉庫中下載軟件對應的鏡像
3. 運行這個鏡像,此時會生成一個Docker容器
4. 對容器的啟動/停止就是對軟件的啟動/停止

二、準備Linux系統

1. 安裝虛擬機軟件

? VMware、VirtualBox

? Ubuntu、RHEL、CentOS、Debian、SLES(SUSE)

2. 新建虛擬機

? 版本:Red Hat(64-bit)

? 網絡:橋接網卡

? 光驅:選擇操作系統的iso文件

3. 安裝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鏡像加速

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

? 步驟:

  1. 註冊並登陸“阿裏雲的開發者平臺" http://dev.aliyun.com

  2. 查看專屬的加速器地址

  3. 配置自己的Docker加速器

    vi /etc/docker/daemon.json
    {
         "registry-mirrors": ["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 鏡像名:tag :tag表示軟件的版本,如果不指定默認是latest
列表 docker images 查看所有本地鏡像
獲取元信息 docker inspect 鏡像id 獲取鏡像的元信息,詳細信息
刪除 docker rmi -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 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命令提交為一個新的鏡像

? 步驟:

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

    docker run --name mytomcat -p 8080:8080 -d tomcat
  2. 修改容器

    docker exec -it bcd08edac78d  /bin/bash
    cd webapps/ROOT
    rm -f index.jsp
    echo welcome to tomcat > index.html
    exit
  3. 提交為新鏡像,語法:docker commit -m="描述消息" -a="作者" 容器id或容器名 鏡像名:tag

    docker commit -m="修改默認索引頁" -a="湯小洋" bcd08edac78d itany/tomcat:v1
  4. 使用新鏡像運行容器

    docker run --name tomcat_v1 -p:8080:8080 -d itany/tomcat:v1

4.2 構建鏡像

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

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

? 步驟:

  1. 創建一個Dockerfile文件vi Dockerfile

    # 基礎鏡像
    FROM tomcat
    
    # 作者
    MAINTAINER [email protected]
    
    # 執行命令
    RUN rm -f /usr/local/tomcat/webapps/ROOT/index.jsp
    RUN echo "welcome to tomcat!" > /usr/local/tomcat/webapps/ROOT/index.html
  2. 構建新鏡像,語法:docker build -f Dockerfile文件的路徑 -t 鏡像名:tag 命令執行的上下文

    docker build -f Dockerfile -t itany/tomcat:v2 .
  3. 使用新鏡像運行容器

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

五、Dockerfile詳解

1. 簡介

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

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

? 使用Dockerfile構建鏡像的步驟:

  1. 編寫Dockerfile文件
  2. 使用docker build構建鏡像
  3. 使用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 [email protected]

    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 itany/centos:v1 . 
# 3.使用docker run運行容器
docker run -it b25b1dad795c
# 查看鏡像的變更歷史
docker history b25b1dad795c
# 驗證掛載點:
/var/lib/docker/volumes/0b001b4cc8db1ebbbb4c537c17a5c44adb700fb0e1b941bc82cc717c4ae196f6/_data
/var/lib/docker/volumes/f020f5a5664bf68312be9f49a640f27ecfb49990b231aaf3d0eb7cb723fa0ddd/_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 itany/aaa . 
    docker run -it itany/aaa
    docker run -it itany/aaa /bin/pwd
  • ENTRYPOINT

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

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

3.2 自定義tomcat鏡像

# 準備工作 

# 1.編寫Dockerfile文件
vi Dockerfile
    FROM centos
    MAINTAINER [email protected]

    # 拷貝文件,文件必須與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 itany/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.7
# 2.運行容器
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.7
# 6.訪問
# 本地訪問
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 itany
    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 [email protected] 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

    ?


技術分享圖片

湯小洋老師,高級Java軟件工程師,慕課網特邀講師,51CTO認證講師,從事軟件開發以及軟件教育培訓多年。擅長Java開發、前端開發、雲計算等領域技術,曾給多家知名企業進行軟件開發實訓。現致力於軟件教學、技術咨詢相關工作,任職南京網博優壹教育的教學總監 。

最新最全的Docker入門視頻課程——隨堂筆記