最新最全的Docker入門視頻課程——隨堂筆記
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服務器
? 步驟:
-
查看服務器ip地址、
在虛擬機中執行
ip addr
-
連接服務器
在客戶端中執行
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 { "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命令提交為一個新的鏡像
? 步驟:
-
根據基礎鏡像,創建容器
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 itany/tomcat:v1
-
使用新鏡像運行容器
docker run --name tomcat_v1 -p:8080:8080 -d itany/tomcat:v1
4.2 構建鏡像
? 根據Dockerfile文件來自動構建鏡像
? Dockerfile是一個包含創建鏡像所有命令的文本文件,使用docker build命令可以根據Dockerfile的內容創建鏡像
? 步驟:
-
創建一個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
-
構建新鏡像,語法:
docker build -f Dockerfile文件的路徑 -t 鏡像名:tag 命令執行的上下文
docker build -f Dockerfile -t itany/tomcat:v2 .
-
使用新鏡像運行容器
docker run -p 9999:8080 -d itany/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 [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://宿主機地址
七、將本地鏡像發布到阿裏雲
? 步驟:
-
登陸“阿裏雲-開發者平臺”,創建命名空間和鏡像倉庫
-
將鏡像推送到阿裏雲
# 登陸阿裏雲的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
-
拉取鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/itany/centos:v1.0
?
湯小洋老師,高級Java軟件工程師,慕課網特邀講師,51CTO認證講師,從事軟件開發以及軟件教育培訓多年。擅長Java開發、前端開發、雲計算等領域技術,曾給多家知名企業進行軟件開發實訓。現致力於軟件教學、技術咨詢相關工作,任職南京網博優壹教育的教學總監 。
最新最全的Docker入門視頻課程——隨堂筆記